Java虚拟机参数及GC收集器

/ JVM / 0 条评论 / 725浏览

Java虚拟机调优参数(JDK8)

一、堆内存相关

优化配置:

  1. 启动JVM时Xms和Xmx尽量设置为相同,避免引发内存抖动
  2. 根据实际应用而定,如果一个线程所使用的内存不会很大,可适当调低Xss值,避免造成线程浪费,但是注意操作系统限制进程内的线程数是有限的。
  3. 对象年龄阈值MaxTenuringThreshold设置的比较小,适用于老年代较多的应用(确保不是内存泄漏的情况下,Full GC后的老年代占用仍然很多),可以降低Minor GC带来的系统消耗;设置的比较大,可以增加Minor GC的概率,减小Full GC概率(Full GC成本高于Minor GC),但是会带来影响:年轻代对象会在Survivor区频繁复制,因此需要适当扩充年轻代内存大小。

二、垃圾收集器

JVM给了三种选择:串行收集器、并行收集器、并发收集器,默认情况下JVM会根据系统进行判断使用哪种收集器,下面展示几种常见收集器(JDK8及以前)

GC小知识:Minor GC和Full GC

  • Minor GC:发生在新生代的垃圾收集动作,因为Java有朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。

    发生条件:当新对象生成,并且在Eden申请空间失败时;

  • Major GC / Full GC:发生在老年代,经常会伴随至少一次Minor GC。Major GC的速度一般会比Minor GC慢几倍以上。

    发生条件:

    • 老年代空间不足
    • 永久带空间不足(jdk8以前)
    • System.gc()被显示调用
    • Minor GC晋升到老年代的平均大小大于老年代的剩余空间
    • 使用RMI来进行RPC或管理的JDK应用,每小时执行1次Full GC

优化配置

  • 吞吐量优先

    以吞吐量为目的的Server建议使用并行收集器GC,以达到最大的GC效率。

    -XX:+UseParallelGC 配置年轻代为并行收集器

    -XX:ParallelGCThreads=4 配置收集器的处理线程数,最好与物理机处理器数相等

    -XX:+UseParallelOldGC 配置老年代为并行收集器

    -XX:MaxGCPauseMillis=100 设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。根据应用调整

    -XX:+UseAdaptiveSizePolicy 并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

  • 响应时间优先

    为保证系统的响应时间,建议使用并发收集器GC,以减少垃圾收集时的停顿时间。

    -XX:ParallelGCThreads=4 配置收集器的处理线程数,最好与物理机处理器数相等

    -XX:+UseConcMarkSweepGC 配置老年代为并发手收集(配置后-XX:NewRatio会失效)

    带来的隐患:并发收集器默认不会对内存空间进行压缩、整理,可能会产生内存碎片,导致运行效率降低

    解决方案:使用**-XX:CMSFullGCsBeforeCompaction=5设置运行多少次GC后进行一次内存压缩、整理;使用-XX:+UseCMSCompactAtFullCollection**开启老年代内存压缩

  • 综合性能推荐

    为保证服务器拥有较高的GC效率,强烈推荐使用新一代GC处理器:Garbage First。其优势特点简要概括如下:

    1. 并行于并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。
    2. 分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。它能够采用不同的方式去处理新创建的对象和已经存活了一段时间,熬过多次GC的旧对象以获取更好的收集效果。
    3. 空间整合:与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
    4. 可预测的停顿:G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。

三、Debug辅助

微信公众号浏览体验更佳,在这里还有更多优秀文章为你奉上,快来关注吧!

北风IT之路