JVM 笔记
基本组成
- 执行引擎:执行虚拟机字节码。
- 类加载器:把class文件加载到方法区中。
- 垃圾回收:用于回收没被引用的对象。
- 堆:存放对象实例,主要的内存工作区
- 方法区:存放类信息、常量
- 栈:主要存放变量,参数返回值。
- 直接内存:NIO直接跳过堆直接操作内存,效率比堆操作快。
- PC寄存器:存放执行环境的指针,计数器等信息
重点组件
堆
1. 存:实例对象
2. 结构:新生代 老年代
新生代(eden s0 s1) | 老年代 (tenured) |
---|
代数划分机制:经过GC的次数,这个GC的阈值可以通过参数配置。(默认为15次),建议新:老 配比1:3或1:2
栈
1. 存:变量和引用。一个线程的私有内存空间
2. 结构
局部变量表 (局部变量,报错函数) |
操作数栈(计算的中间结果) |
异常数据 |
方法区
1. 存:类的定义,常量
注:当方法区定义过小,或者加载的类信息过大时,会出现OOM异常
垃圾回收
1. 作用:回收不被引用的对象
2. 算法:
①引用计数算法:被引用1次,对象计数器加1。缺点:性能差,无法处理循环引用。
②标记清除算法:标记与清除操作。缺点:会产生内存碎片。
③复制算法:首先分配两块区域,回收时,先把有引用的复制新的区域,然后清除旧的没被引用的区域。
④标记压缩算法:把标记有引用的对象压缩至内存的一端,然后在进行清理。
⑤分代算法:如堆中分为新生代和老年代。
⑥分区算法:划分多个区,细化可以粒度,回收时只对部分区域进行回收,进而不会影响其他区域。
3.垃圾回收器的种类:
①串行GC:单线程不关心并发。(新生,老年)
②并行GC:多线程,关心吞吐量。(新生)复制算法
③CMSGC:并发标记清除,关注停顿时间。推荐使用ParallelGC与ParallelOldGC
④G1GC:分区算法 详情
附属资料
对象的创建过程
栈->TLAB->老年代->新生代