jvm内存模型

来源:互联网 发布:apt-get insall yum 编辑:程序博客网 时间:2024/06/16 21:16

   根据运行时数据的存储结构,jvm将内存划分为6个部分:

1.PC寄存器:又称程序计数器,用于记录线程的运行状态和保存当前线程执行指令的内存地址,由各个线程独享。

2.本地方法栈:又叫C栈,用于存储native关键字修饰的方法,由各个线程独享的。native方法底层都是通过C语言进行实现,

3.内存栈:也称java栈,用于保存方法中的内存变量、返回值等信息,由线程独享。jvm在创建一个线程时会分配一个java栈空间,这个栈又包含多个栈帧,每个栈帧对应线程运行时的方法。当调用方法需要的内存容量高于内存栈最大容量时,会产生栈溢出现象。

4.内存堆:用于保存new出来的对象数据,这个数据包括了其父对象的非静态数据;堆中的对象为线程共同享有,在多线程进行读写操作时,需要注意同步问题。当new出来的对象过多或者过大超过堆得最大容量时,会出现堆溢出的问题。堆可以划分新生代和老年代两部分,刚创建的对象一般放在新生代,存活时间长的对象会转移到老年代。

5.方法区:用于保存类 的结构信息,包括类的构造函数,属性,方法体,方法数据;这个区域由多个线程共同享有。另外,下面讲到的常量池也属于方法区。

6.运行常量池:用于存储字面量,保存数字、字符串和字符。