看完《深刻理解JVM》,结合网上资料后根据跟人理解整理出的简洁版,主要关注是什么, 怎么作到的,特色等,没有进入深刻剖析,旨在快速了解,具体应用时我的再根据具体点去进行深刻。欢迎留言讨论!html
是什么?算法
垃圾回收器是垃圾回收算法的包装,能够在JVM中设置须要使用的垃圾回收器;多线程
怎么作?并发
Serial收集器:spa
单线程进行垃圾回收, 执行回收过程当中,程序会暂停。.net
特色:简单高效,适用于单个CPU场景。经常使用于新生代回收;线程
SerialOld: Serial的老年代版本;用于老年代回收;htm
parnew收集器:blog
Serial 的多线程版本,回收过程当中,程序也会暂停;内存
特色:适合多核场景,用于新生代回收,能够与CMS配合;
Parallel收集器:
并行回收,程序会暂停,可控制吞吐量;
特色:吞吐量优先,更关注可控制的吞吐量,用于新生代回收;
ParallelOld收集器:paraller老年代版本;
parallel+parallelOld 为吞吐量优先组合,当应用程序运行在具备多个CPU上,对暂停时间没有特别高的要求时,即程序主要在后台进行计算,而不须要与用户进行太多交互;
例如,那些执行批量处理、订单处理、工资支付、科学计算的应用程序;
cms收集器:
采用标记清除算法,多线程回收,仅用于老年代;
运做流程:初始标记、并发标记、从新标记、并发清除
在并发标记、并发清除阶段能够多线程并行进行;
特色:并发收集,低停顿,以回收最短停顿时间为目标,适用于常见B/S场景;
缺点:
须要内存大,影响吞吐;
没法及时清理浮动垃圾;
产生大量内存碎片;
解决办法:
经过 -XX:CMSInitiatingOccupancyFraction设置预留空间,以减小由于浮动垃圾,致使内存空间没法知足致使的fullgc;
经过 -XX:+UseCMSCompactAtFullCollection开启碎片合并整理;
配合-XX:+CMSFullGCsBeforeCompaction设置执行多少次不压缩的fullgc后进行一次整理压缩;
G1收集器:
1.7版本推出,多线程处理,可管理整个堆内存的垃圾回收:
运做流程:初始标记、并发标记、最终标记、筛选回收
特色:
结合多种垃圾算法,空间整合,不产生碎片
低停顿的同时实现高吞吐量
场景:面向服务端应用,针对具备大内存、多处理器的机器;
最主要的应用是为须要低GC延迟,并具备大堆的应用程序提供解决方案;
如:在堆大小约6GB或更大时,可预测的暂停时间能够低于0.5秒;
经常使用参数:
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器,更加关注吞吐量
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:+UseG1GC:启用G1垃圾回收器
-XX:InitiatingHeapOccupancyPercent:当整个Java堆的占用率达到参数值时,开始并发标记阶段;默认为45;
-XX:MaxGCPauseMillis:为G1设置暂停时间目标,默认值为200毫秒;
-XX:G1HeapRegionSize:设置每一个Region大小,范围1MB到32MB;目标是在最小Java堆时能够拥有约2048个Region;
参考地址: