JVM内存结构

java 虚拟机简称JVM(Java Virtual Mechine),是一个虚构出来的计算机,可以运行class文件。

JVM内存结构

jvm内存包含以下几部分:

  1. 堆内存
    堆内存时jvm中最大的一块内存,所有的对象都是在这里分配。它可以分成新生代和老生代两块。
  • 新生代用来存放新生成的对象;
  • 老生代用来存放没被新生代GC掉的对象或者新生代空间放不下的大对象。
    新生代又可以分为Eden区和两个survivor区。


    image.png
Young Generation        即图中的Eden + From Space + To Space
Eden                    存放新生的对象
Survivor Space          有两个,存放每次垃圾回收后存活的对象
Old Generation          Tenured Generation 即图中的Old Space 
                        主要存放应用程序中生命周期长的存活对象

内存管理:
当用户申请内存空间时,jvm会在新生代的Eden区给对象分配内存,如果空间不够则直接在老生代分配。当Eden区满了或者空间不足时则进行minGC, 将eden区和一个survivor 区的有效对象移动到另外一个suvivor区,然后清空eden和第一个survivor区;继续循环该动作。如果eden清空后仍然不能放下对象,则直接将对象放入老生代。通过几次minor GC之后,还幸存下来的对象,说明不是临时对象,则会被移动到老生代。当老生代也快满的时候则会进行full GC, 来清楚老生代里面的无用对象。

  1. 虚拟机栈(JVM Stack)
    栈内存用来存储局部变量和方法调用,它是线程私有的。
    当有方法调用时,就会为该方法分配一个栈帧压入栈中,当方法结束后弹出。
    栈帧由以下几部分组成:
  • 局部变量区: 用于存储方法的输入参数,局部变量;
  • 操作数栈: 用于计算的区域;
  • 帧数据区: 主要是一些支持常量池解析,正常方法返回以及异常处理等的信息
  1. 方法区
    用于存放class信息,常量和静态变量。
  2. 本地方发栈(Native Method Stack)
    存放Native方法的调用信息
  3. 程序计数器
    当前执行到的代码行号指示器。

堆外内存

JVM也可以操作堆外内存,即内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理,这样做的好处是减少GC对内存的影响,加快复制速度;坏处就是jvm不帮助我们管理这块内存,申请释放需要我们自己管理,如果不注意容易造成内存泄漏。

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

推荐阅读更多精彩内容