gc 的重点在于 generation
分代 主要体现为 : 对于 young/old generation 实际 是属于 jvm heap 区域;而metaSpace 是属于 non-heap ,使用的是 jvm进程的native memory;由于其在JVM进程管辖范围内,因此对于GC线程也是可以操作metaspace 区域的;
- young generation
- eden + survivor (from,to): 默认 比例为 8:1:1
- eden 主要存储小内存的新生对象实例
- 当发生gc 时, 会将eden区存活的数据保存到survivor区域
- 对于survivor中的from 和 to 空间,当发生gc时,to区域肯定为空;对于 from 和 to 区域并不是绝对的,两个标识会在gc时进行交换处理
- 对于survivor中存活的数据当经过的gc次数达到阈值(默认为15)时,就会有一个generation 提升,就会存放到old generation
- 对于eden区域的内存分配存在fast allocation
- tlabs : Thread-local allocation buffer ; 默认在eden区域最多占用 1%的空间供 tlabs使用,tlab主要是为了解决muti-thread allocate,可以实现free lock;每一个allocate-thread独占一个tlab;
- bump-the-pointer : 为了保证分配时寻址的快速,通过记录上一个对象的结束地址作为新的对象的起始地址,从而达到快速寻址
- 与之相对应的就是slow allocation: 当分配时没有充足的tlab空间时,就只能直接使用eden区的剩余空间进行内存分配操作;
- old generation
- 当对象占用内存空间过大时,新的对象实例会直接生成到old generation 区域,例如 数组等
- 经过了一定gc后存活的对象
gc操作
- minor gc 针对 young generation
- major gc 针对 old generation
- full gc 针对 整个jvm内存空间,不止包含heap 还包含metaspace
关于 full gc 和 metaspace
https://stuefe.de/posts/metaspace/what-is-metaspace/
java学习-JVM-gc-generation
原文:https://www.cnblogs.com/xingguoblog/p/13865255.html