温故而知新。
这些知识是很久之前看一个视频记得,有些零碎。
GC 概念和算法:
GC (Garbage Collection) 垃圾收集 (1960年list就使用了GC)
Java中 GC的对象是堆空间和永久区。
GC的一些算法机制:
1. 引用计数法(老牌的垃圾回收算法) Java并没有使用这种算法
通过引用计数来回收垃圾,当一个对象没有被其他对象引用的时候就把它当成是垃圾,不过这种算法很难处理循环引用(如果几个都没有用的对象相互引用就不能被回收了)。
2.标记清除法(现代垃圾回收算法的基础思想)
分为两个阶段 ,标记和清除
标记:从根节点开始搜索,没有被遍历到的就当成是垃圾。
清除:标记之后,没有被标记的对象就会在这个阶段被清除。
3.复制算法(相对标记清除高效,不适用于存活对象多的场合,缺点就是空间浪费 )
将原有内存空间分为两块,用的时候只用一块。清除的时候将存活的对象复制到未使用的内存空间,清除正在使用的那一块内存空间。交换两个内存角色即可。 (老年代和大对象不复制, 整合标记清理思想)
4.分代思想 根据对象存活的周期分类,短命对象归为新生代,长命对象归为老年代。
少量对象存活,适合复制
大量对象存活,适合标记或者标记压缩
Stop-The-World
Java中一种全局暂停的现象
多半因为GC引起(其他: Dump线程 死锁检查 堆Dump也有较小的可能)
危害:长时间服务停止,无响应 。 可能引起主备切换,数据不同步。
***************************************************************************************************
GC 参数:
都是新生代复制算法 老年代标记-压缩
串行收集器:(单线程)
最古老,最稳定,效率高,会产生较长的停顿
并行收集器:(多线程(多核支持))
新生代并行 老年代串行
多线程并发 应用程序暂停
Parallel收集器(更加关注吞吐量)
CMS收集器(Concurrent Mark Sweep
并发(与用户线程一起执行)标记清除 )
停顿时间短 吞吐量变低 清理不彻底
老年代收集器
此文更多的是为了巩固自己已学知识,如有不正确的地方,欢迎指出。