JVM内存结构

2019-03-01  本文已影响0人  币来币往

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

JVM内存结构

jvm内存包含以下几部分:

  1. 堆内存
    堆内存时jvm中最大的一块内存,所有的对象都是在这里分配。它可以分成新生代和老生代两块。
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不帮助我们管理这块内存,申请释放需要我们自己管理,如果不注意容易造成内存泄漏。

上一篇 下一篇

猜你喜欢

热点阅读