JVM调参

作者: 小七奇奇 | 来源:发表于2018-08-29 22:57 被阅读65次

今天看了下之前做的一个异步处理任务的服务,发现占用内存量比较大,达到2G,但我检查了代码,基本没有static对象。但这个服务有个特点,就是每次执行一个任务的时候,会从数据库中捞大量的数据做处理,因此我怀疑是因为有比较多的临时对象产生,但程序没有来的及释放。为了验证这个,我用了jinfo查看和临时设置启动参数,jmap查看内存占用情况和主动触发FGC,jstat查看gc情况,top查看整个程序占用的内存量。

用jmap查看,发现内存占用并没有那么高(free值很大),但capacity比较大。用top查看,整个程序也占用了接近2G,那既然free那么多,为啥程序还占用那么高的内存?是不是因为还没有gc导致?

因此我用jmap做了一次主动gc:/opt/jdk/bin/jmap -histo:live PID,看了top,还是一样大小,只是jmap出来的free值更高了(特别是老年代,新生代的used变成了0),说明gc是有起到作用的。但是,为啥top没有变化??

后来查了jmap出来的参数,MaxHeapFreeRatio参数的意思是,当空闲内存数超出这个值时,会回收内存直到最小内存。而我的程序里面,默认这个值是100,也就是说要所有内存都未使用才会释放(都100%未使用了还需要释放吗?没鸟用了)。为了验证,我用jinfo临时设置了参数:/opt/jdk/bin/jinfo -flag MaxHeapFreeRatio=70 PID,主动触发gc,发现top内存降到了1G。问题解决了。

网上有人遇到top出来的res结果和jmap查出来的结果不一致,具体原因我也没搞懂,但是,只要出发了gc,而且内存做了回收,结果应该跟top出来的结果是一致的。

但jinfo只是临时设置,为了程序每次启动都生效,必须在启动脚本中设置。这个是在gradle中。我的服务有个build.gradle文件,在里面加几个参数:

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 22px; margin-right: 0px; margin-top: 0px; white-space: pre-wrap; word-wrap: break-word;">defaultJvmOpts = ["-XX:MaxHeapFreeRatio=70", "-XX:MaxTenuringThreshold=3", "-XX:MaxNewSize=1073741824"]</pre>

<pre style="background-color: transparent; color: rgb(0, 0, 0); font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 22px; margin-right: 0px; margin-top: 0px; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: pre-wrap; word-spacing: 0px; word-wrap: break-word;">MaxTenuringThreshold代表对象的被回收存活次数,</pre>

<pre style="background-color: transparent; color: rgb(0, 0, 0); font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 22px; margin-right: 0px; margin-top: 0px; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: pre-wrap; word-spacing: 0px; word-wrap: break-word;">MaxNewSize代表新生代内存大小。

执行build后自动生成启动脚本,搞定!

相关链接:
1、jvm启动参数
2、jstat使用
3、各种java工具
4、打印当前java的所有参数
5、jinfo设置参数
6、别人的例子(仅做参考)</pre>

相关文章

  • JVM调参

    今天看了下之前做的一个异步处理任务的服务,发现占用内存量比较大,达到2G,但我检查了代码,基本没有static对象...

  • JVM 高频面试题

    本章面试题如下:JVM三大性能调优参数,JVM 几个重要的参数JVM调优JVM内存管理,JVM的常见的垃圾收集器,...

  • 3.JVM调优工具

    JVM调优工具 1、JVM调优工具-JDK工具 1.1 jps jps:Java Virtual Machine ...

  • JVM性能调优

    JVM性能调优 JVM性能监控工具介绍

  • JVM性能调优

    摘自:http://uule.iteye.com/blog/2114697 JVM垃圾回收与性能调优总结 JVM调...

  • JVM调优高频面试

    JVM调优目的 使用较小的内存占用来获得较高的吞吐量或者较低的延迟。 一、JVM内存调优 对JVM内存的系统级调优...

  • 调参

    1首先是数据增强,因为正常情况下,数据量往往不够,因此需要通过裁剪 2数据预处理,pca,normalizatio...

  • 调参

    参数更新 神经网络的学习目的是找到使损失函数尽可能小的参数,即解决一个最优化问题.但是由于神经网络参数空间过于复杂...

  • 调参

    死亡的神经元占的比例 RELU 文中给出了一种针对ReLU神经元的特殊初始化,并给出结论:网络中神经元的方差应该是...

  • 调参

    转载https://www.sohu.com/a/241208957_787107 基本原则:快速试错 一些大的注...

网友评论

      本文标题:JVM调参

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