java 虚拟机简称JVM(Java Virtual Mechine),是一个虚构出来的计算机,可以运行class文件。
JVM内存结构
jvm内存包含以下几部分:
- 堆内存
堆内存时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, 来清楚老生代里面的无用对象。
- 虚拟机栈(JVM Stack)
栈内存用来存储局部变量和方法调用,它是线程私有的。
当有方法调用时,就会为该方法分配一个栈帧压入栈中,当方法结束后弹出。
栈帧由以下几部分组成:
- 局部变量区: 用于存储方法的输入参数,局部变量;
- 操作数栈: 用于计算的区域;
- 帧数据区: 主要是一些支持常量池解析,正常方法返回以及异常处理等的信息
- 方法区
用于存放class信息,常量和静态变量。 - 本地方发栈(Native Method Stack)
存放Native方法的调用信息 - 程序计数器
当前执行到的代码行号指示器。
堆外内存
JVM也可以操作堆外内存,即内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理,这样做的好处是减少GC对内存的影响,加快复制速度;坏处就是jvm不帮助我们管理这块内存,申请释放需要我们自己管理,如果不注意容易造成内存泄漏。
网友评论