详细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方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,749评论 3 83
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 757评论 0 1
  • 第一步,了解JVM基本概念,基本结构。 第二步,了解JVM中线程私有区和公有区。 第三步,了解线程与Java内存模...
    Arya鑫阅读 1,225评论 0 10
  • 文章转自 http://blog.csdn.net/u012152619/article/details/4696...
    云狗狗狗狗狗阅读 619评论 1 4
  • 第二部分 自动内存管理机制 第二章 java内存异常与内存溢出异常 运行数据区域 程序计数器:当前线程所执行的字节...
    小明oh阅读 1,213评论 0 2