浅谈JVM内存模型
1、jvm内存模型
(1)程序计数器(program counter register):每一个线程都有一个程序计数器,是线程私有的,就是一个指针指向方法中字节码(用来存储下一条指令的地址,也就是将要执行的指令代码)由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。
(2)方法区(method area):供各个线程共享的运行是内存区域,它存储的每一个类结果信息。例如运行是常量池,字段和方法数据、构造函数和普通方法得字节码内容。上面讲的是规范,在不同虚拟机里面实现不一样,最典型就是永久代和元空间。
(3)java栈(java stack,不存在垃圾回收问题): java栈也叫虚拟机栈,虚拟机栈只对栈桢进行操作,也就是一个方法的执行,也就是压栈和出栈过程。每一个栈桢里面保存局部变量表、操作数栈、指向当前方法所属的类的运行时常量池、方法返回地址、动态链接等信息。当某一个线程执行方法时,它会创建一个栈桢,并压栈操作,当执行完成后,又出栈,所以说它的生命周期是随着线程生命周期。
(4)本地方法栈(native method stack):native修饰的方法,jvm提供的一些接口(c语言实现)。
(5)堆(heap):逻辑上被分为:新生代、老年代、永久代(jdk1.7),元空间(jdk1.8),物理上分为新生代与老年代。
新生代又被分为:伊甸园区(Eden 区)、幸存者0区(Survivor0区,也可以叫from区)、幸存者1区(Survivor1区,也可以叫to区)。