详细jvm内存模型

https://www.cnblogs.com/rinack/p/9888692.html


主图
参考图

jvm内存一共可分为三大块:堆内存,栈内存,方法区(Perm)

       堆内存包含:新生代(eden,from survivor, to survivor)+老年代;

       栈内存包含:虚拟机栈+本地方法栈

堆内存(Heap)

     1:线程共享,在虚拟机启动时创建。

     2:此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

     3:堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。

       (下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代已经被移除。)

     新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 )

     默认的,Eden : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。

栈内存

虚拟机栈(JVM Stack)

描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈(Native Stack)

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务


程序计数器(PC Register)

1:程序计数器是用于标识当前线程执行的字节码文件的行号指示器。

2:多线程情况下,每个线程都具有各自独立的程序计数器,所以该区域是非线程共享的内存区域。

3:当执行java方法时候,计数器中保存的是字节码文件的行号;当执行Native方法时,计数器的值为空。


直接内存

直接内存并不是虚拟机内存的一部分,也不是Java虚拟机规范中定义的内存区域。jdk1.4中新加入的NIO,引入了通道与缓冲区的IO方式,它可以调用Native方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

你可能感兴趣的:(详细jvm内存模型)