美文网首页
JVM内存结构

JVM内存结构

作者: 币来币往 | 来源:发表于2019-03-01 17:40 被阅读0次

    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不帮助我们管理这块内存,申请释放需要我们自己管理,如果不注意容易造成内存泄漏。

    相关文章

      网友评论

          本文标题:JVM内存结构

          本文链接:https://www.haomeiwen.com/subject/oejduqtx.html