美文网首页
记录一次jvm内存优化

记录一次jvm内存优化

作者: 南风nanfeng | 来源:发表于2019-10-25 18:43 被阅读0次

背景:
执行解析hdfs任务,产生大量磁盘IO,Eden区内存增大斜率接近无穷大,也就是说jconsole获取内存快照的时间间隔内有分配大量内存。好在Old区在任务执行期间未发生FullGC。下面是GC统计:

统计:
持续时间:12小时33分
ParNew GC:17520,367.297秒,平均每次:0.021秒
Full GC:0次,0秒

注意:任务执行前,发生2次Full GC,7次ParNew GC,已在统计中刨去。
这2次FullGC是jvm启动就产生,这点非常不解,因为jvm启动加载的bean应该很小都在Eden区,Old区应该是0,这点说不过去,这里先把结果说下:jvm8的启动参数导致的,加上元数据参数即可。

-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m

原因见:http://www.disheng.tech/blog/%E6%9C%8D%E5%8A%A1%E5%88%9A%E5%90%AF%E5%8A%A8%E5%B0%B1-full-gc%E8%A6%81%E9%97%B9%E5%93%AA%E6%A0%B7/

优化后jvm参数如下:

JAVA_OPTS="-jar -server -Xms2G -Xmx2G -Xmn900M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
JAVA_OPTS="$JAVA_OPTS -Xss256k"
JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=30"
JAVA_OPTS="$JAVA_OPTS -XX:SurvivorRatio=8"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JAVA_OPTS="$JAVA_OPTS -XX:CMSInitiatingOccupancyFraction=75"
JAVA_OPTS="$JAVA_OPTS -XX:TargetSurvivorRatio=90"

–XX:ParallelGCThreads=30:设置 20 个线程进行垃圾回收;
–XX:+UseParNewGC:年轻代使用并行回收器;
–XX:+UseConcMarkSweepGC:年老代使用 CMS 收集器降低停顿;
–XX:+SurvivorRatio:设置 Eden 区和 Survivor 区的比例为 8:1。稍大的 Survivor 空间可以提高在年轻代回收生命周期较短的对象的可能性,如果 Survivor 不够大,一些短命的对象可能直接进入年老代,这对系统来说是不利的。
–XX:TargetSurvivorRatio=90:设置 Survivor 区的可使用率。这里设置为 90%,则允许 90%的 Survivor 空间被使用。默认值是 50%。故该设置提高了 Survivor 区的使用率。当存放的对象超过这个百分比,则对象会向年老代压缩。因此,这个选项更有助于将对象留在年轻代。

具体见:https://www.ibm.com/developerworks/cn/java/j-lo-jvm-optimize-experience/index.html

================================
后续任务执行结果,明天更新~~~


image.png

统计:
持续时间:2小时8分
ParNew GC:1550,33.920秒,平均每次0.022秒
Full GC:0次,0秒

两次任务,第一次大,第二次小,但是任务的颗粒相同,因此比较YGC可以发现,即使加大并发线程YGC并不会加快,但是调大Eden区可以减少gc次数,Full GC代价远比YGC大,因此控制好YGC频率即可,此次调优聊胜于无,但是发现CMS启动发生两次FullGC的原因

jvm内存占用比例:
[work@loget-dt-001 wwwroot]$ jstat -gcutil 2083
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.82  43.55  60.84  96.38  94.21  17527  367.297     4    0.295  367.592


 [work@loget-dt-001 wwwroot]$ jstat -gc 2083
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
69888.0 69888.0  0.0   574.4  559232.0 196848.2 1398144.0   850697.2  75704.0 72964.7 9272.0 8735.0  17527  367.297   4      0.295  367.592
Eden.png Survivor.png Old.png heap.png

相关文章

  • 记录一次jvm内存优化

    背景:执行解析hdfs任务,产生大量磁盘IO,Eden区内存增大斜率接近无穷大,也就是说jconsole获取内存快...

  • iOS APP内存优化记录

    iOS APP内存优化记录iOS APP内存优化记录

  • 高效并发

    从JVM的角度看一下Java与线程,内存模型,线程安全以及JVM对于锁的优化 硬件内存模型与JVM内存模型 硬件的...

  • Tomcat优化

    Tomcat优化,可以分为内存,线程,IO. 1、Tomcat内存优化,启动时告诉JVM我要一块大内存(调优内存是...

  • 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指...

  • 2021-09-24

    Android深度性能优化--内存优化 一、背景 在内存管理上,JVM拥有垃圾内存回收的机制,自身会在虚拟机层面自...

  • JVM介绍系列文章

    知晓JVM系列(一):对JVM总览知晓JVM系列(二):JVM内存管理机制与优化初探知晓JVM系列(三) :常用的...

  • jvm内存优化

    JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略。由于GC开始垃圾回收时会挂起应用线程,严重...

  • JVM优化篇之堆内存模型

    上一篇中讲了JVM的基本参数含义JVM优化篇之参数,这一篇我们来聊一聊JMM(java内存模型).jvm的堆内存模...

  • 《Java虚拟机》笔记

    记录了自己读《Java虚拟机》的一些笔记,主要在内存管理和代码优化那一块。 1、JVM内存管理 运行时数据区 方法...

网友评论

      本文标题:记录一次jvm内存优化

      本文链接:https://www.haomeiwen.com/subject/ksnsvctx.html