本文基于Oracle hotspot jvm
1.GC:查找不再使用的对象,以及释放这些对象所管理的内存
2.算法:分代收集
Young:主要是用来存放新生的对象。
Old:主要存放应用程序中生命周期长的内存对象。
Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。
3.主流收集器:
2.Throughput minor和fullgc时空停顿、
3.Cmsminor时空停顿 fullgc时仅在部分阶段存在 (初始标记,重新标记)
-XX:ParallelGCThreads 限制线程数量
CMS:
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。Fullgc时不再暂停应用线程,使用若干后台线程定期对老年代空间扫描回收(标记-清除),消除在fullgc时的长时间停顿。(minorgc还是暂停所有应用线程)
参数控制: -XX:+ UseConcMarkSweepGC
- XX:+UseParNewGC
G1:
G1缩短处理大堆(>4GB)时产生的停顿,采用将堆分成若干区域,新生代仍采用暂停所有应用线程的方式,多线程将存活对象移动到Survivor或老年代,老年代由后台线程完成,大多数的工作不需要暂停应用线程。(标记-压缩)
参数控制: -XX:+UseG1GC(默认关闭)
4.GC选择
1.Throughput处理应用程序线程的批量任务能最大程度的利用cpu的处理能力,通常能获得更好的性能
2.如果批量任务并没有使用机器上所有可用cpu资源,此时Concurrent收集器能获得更好的性能
3.通常情况下,throughput是收集器的平均响应时间比concurrent要差,但是在90%响应时间或者99%响应时间指标上,throughput要比concurrent好一些
4.使用throughput会超负荷的进行大量fullgc时,切换concurrent能获得更低的响应时间
依据:主要是有多少空闲的cpu用于后台的并发线程
结论:
¨批量任务:cpu多而且有剩余选concurrent,否则throughput
¨吞吐量:存在空闲cpu时CMS,否则throughput
¨堆大小:在使用Concurrent时,若堆较小CMS,否则G1
–Xms,-Xmx(Fullgc后释放70%空间)
-XX:NewRatio,-XX:NewSize=N,
-XX:MaxNewSize=N
–XX:PermSize=N,-XX:MaxPermSize=N,
-XX:MetaspaceSize=N,
- XX:MaxMetaspaceSize=N
–XX:ParallelGCThreads=N
–XX:-UseAdaptiveSizePolicy
6.CMS调优
1.调整堆大小增加老年代空间
2.提高后台线程运行频率 设置老年代空间占用达到
N时启动并发周期
–xx:CMSInitiatingOccupancyFaction=N,
-xx:UseCMSInitiatingOccupancyOnly=true
3.调整后台线程 –xx:ConcGCThreads=N
4.增量式cms(java8已不推荐)