java gc机制
什么是jvm:虚拟出来的计算机,是jre的一部分,使用jvm是为了支持与操作系统无关,实现跨平台,jvm内部体系结构主要分为三个部分:类加载器子系统,运行时数据区和执行引擎。
运行时数据区
注1:永久代和方法区没什么关系,方法区是一个规范,强行解释的话,永久代是方法区的一种实现,,JDK8 HotSpot JVM 将移除永久代,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)。这意味着不会再有java.lang.OutOfMemoryError: PermGen问题,也不再需要你进行调优及监控内存空间的使用。
注2:元空间和永久代存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的,而元空间属于本地内存;存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中。相当于永久代的数据被分到了堆和元空间中。持久代中存储的class信息在整个JVM运行过程中都不会被释放, 即便class被un-load的时候. 但是在元空间中会因为GC运行而得到释放.
javagc垃圾回收
哪些需要回收?
1.引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减一;任何时刻计数器为0的对象就是不会被使用的对象。
缺点:循环引用无法回收
2.GC roots:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径被称为引用链,当一个对象到“GC Roots”没有任何引用链相连的时候,就证明此对象是不可用的。
可以作为GC root对象包括:
局部变量 活跃线程 静态域 JNI应用
gc算法
1.标记和清扫Mark and Sweep
2.标记整理
3.拷贝
GC算法实现
Serial GC (适宜用于年轻代和老年代) Parallel GC (适用于年轻代和老年代) Parallel New (年轻代) 和 Concurrent Mark and Sweep (CMS) (老年代) G1 适用于年轻代和老年代被没有分开的情况
serial和Parallel new/old GC对于新生代都是使用标记-复制,老年代都是标记-整理,不同的是Parallel是并行的。
CMS:使用最多并发的标记和清扫算法来清理老年代,降低了各个GC 暂停时间, 最直接的影响就是减少了终端用户对应用暂停的感知, 并且让它们觉得反应更加及时了. 因为大多数时间内,只有小部分CPU时间被GC占用来而且没有执行你的应用代码, 所以CMS的吞吐量表现上比Parallel GC会差些.
G1: 将内存划分为几个region(区域),每个区域既可以是新生代、老年代,包含最多垃圾的region总是优先被收集. 这个是名称Garbage-first的由来. 每次只会有所有region集合的一个子集会被考虑, 称为收集集合Collection set.年轻代的所有region在每个暂停的时候都被收集,但是老年代只有一部分会被收集。
优点:
- G1的主要设计目标就是保证STW(Stop The world pause)的时间和分布都可以很好的预测和配置。事实上, Garbage-First 是一个类实时GC,也就是你可以设定特定的性能要求,你可以要求在给定的y ms中, STW的时间不能超过x ms. 比如在任何1s内都不超过5ms,G1 会尽量满足设定的目标(但不能完全肯定, 所以不是绝对实时的)。
- G1采用标记-整理算法,减少产生的碎片
参考资料: