JVM的四种垃圾收集器:
Serial收集器(常用于单CPU环境) -XX:+UseSerialGC
Throughput(Parallel)收集器 server级虚拟机,-XX:+UseParallel[Old]GC
Concurrent收集器 CMS:收集新生代 -XX:+UseParNewGC、-XX:+UseConcMarkSweepGC
G1收集器 --为了处理处理超大堆时产生的停顿。 -XX:+UseG1GC
垃圾收集的两步骤:
查找不再使用的对象
释放这些对象所管理的内存
所有应用线程都停止运行所产生的停顿称为 时空停顿。这种停顿对应用的性能影响很大,调优垃圾收集时,尽量减少这种停顿是最为关键的考量因素。
堆分为 老年代,新生代;新生代又分为Eden空间和Survivor空间。
选择GC算法
取决于应用程序的特征; 应用的性能目标
GC调优基础
1 调整堆大小:
堆太小,程序大部分时间浪费在GC上;设置大,停顿时间会变长。
-Xms 初始值 -Xmx 最大值
2 代空间的调整
新生代分配过大,垃圾回收发生频率就比较低,从新生代晋升到老年代的对象就更少,老年代就相对小。容易被频繁触发Full GC.
找到平衡点是解决问题的关键
所有调整代空间的命令行标志调整都是新生代空间
-XX:NewRatio=N 新老空间占用比率
-XX:NewSize=N 新生代初始大小
-XX:MaxNewSize=N 新生代空间最大大小
-XmnN 上面两个设成同一个值
3 永久代和元空间的调整
-XX:PermSize=N 永久代大小
-XX:MaxPermSize=N
-XX:MetaspaceSize=N 元空间大小
-XX:MaxMetaspaceSize=N
4 控制并发
-XX:ParallelGCThreads=N 线程数
5 自适应调整
-XX:+PrintAdaptiveSizePolicy
垃圾回收工具
开启GC的日志功能: -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails
-XX:+PringGCTimeStamps -XX:+PrintGCDateStamps
-Xloggc:filename
GC Histogram可以读入GC日志,更加日志生成对应图标和表格