1.垃圾收集算法
1.1 标记-清除算法
算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,标记过程上一篇博客说过,
后续的几种算法都是基于这个算法对其不足进行改进.不足的地方只要有两点:一个是效率问题,标记和清除两个过程的效率都不高,另外一个不足
是空间问题,标记清除后会产生大量不连续的空间碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象的时候,无法找到足够的
连续内存而不得不提前触发另外一次GC.
1.2 复制算法
复制算法是为了解决上述的效率问题.它将可用内存按容量划分成大小相等的两块,每次只使用其中的一块.当这块内存,就将还存活的对象复制到
另一块内存上,然后再把已经使用过的内存空间一次性清理掉.虽然这种方法比较高效,但是内存只利用了一半,代价太高. HotSpot中默认 Eden 和 Survivor
的比例为8:1 即 能使用到90%的内存空间(有两个Survivor)
1.3 标记-整理算法
主要针对老年代.标记阶段和标记-清除算法一样,后续阶段不是直接清除可回收对象,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外
的内存.
2.垃圾收集器
2.1 Serial收集器
单线程垃圾收集器,当它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束.
2.2 ParNew收集器
ParNew就是Serial的多线程版本
2.3 Parallel Scavenge 收集器
Parallel Scavenge 收集器是一个新生代收集器,它也是使用复制算法的收集器又是多线程的收集器,但是它关注的点是达到一个可控制的吞吐量.
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要
适合后台运算而不需要太多交互的任务.
2.4 Serial Old收集器
Serail Old 是一个老年段收集器,它同样是单线程收集器,使用标记-整理算法.
2.5 Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法.
2.6 CMS 收集器
CMS 收集器是一种以获取最短收回停顿时间为目标的收集器. 使用标记-清除算法实现,分为4个步骤
初始标记,并发标记,重新标记,并发清除
初始标记和重新标记两个阶段仍然需要 “Stop The World” ,初始标记仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,并发标记阶段就是
进行GC Roots Tracing的过程,而重新标记阶段是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记纪录,这个阶段的
停顿时间一般会比初试标记阶段稍长一些,但远比并发标记的时间短.并发标记和并发清除过程收集器线程可以与用户线程一起工作.
2.7 G1 收集器
G1 收集器分为以下几个步骤:
初始标记,并发标记,最终标记,帅选回收.
3.故障诊断
3.1 JDK 命令行工具
3.1.1 jps 虚拟机进程状态工具
jps [ options] [hostid]
可用 参数 -q -m -l -v
3.1.2 jstat 虚拟机 统计信息监控工具
jstat [ option vmid [ interval [s|ms] [count]] }
jstat -gc 2764 250 20
可用参数 -class -gc -gccapacity -gcutil -gccause -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -compiler -printcompiltion
3.1.3 jinfo java 配置信息工具
jinfo [option] pid
3.1.4 jmap java内存映像工具
jmap [ option ] vmid
可用参数-dump -finalizerinfo -heap -histo -permstat -F
3.1.5 jhat 虚拟机堆转储快照分析工具
3.1.6 jstack java堆栈跟踪工具
jstack [ option] vmid
可用参数 -F -l -m
3.2 JConsole java 监控与管理控制台
具体使用可以参考博主的另外一篇博客https://blog.csdn.net/sqh201030412/article/details/82419923
3.3 VisualVM 多合一故障处理工具
目前功能最强大的运行监控和故障处理程序.可以安装插件进行扩展