【问题标题】:Java: frequent spikes at "used memory" graphJava:“已用内存”图上的频繁峰值
【发布时间】:2016-06-27 12:15:17
【问题描述】:

有一段时间我的 Java 应用程序出现性能问题,我使用 JavaMelody 进行分析,不寻常的是“已用内存”图表。它有很多短尖峰,似乎真的很快就达到了 ~8GB 线,然后,据我所知,GC 正在清理内存。是否有人有经验来跟踪这些峰值是什么意思?似乎他们指出了一些特定的问题。

GC和JVM配置为: -XX:PermSize=384m -XX:MaxPermSize=512m -XX:+UseCompressedOops -XX:+UseFastAccessorMethods -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-UseParallelOldGC -XX:-UseAdaptiveSizePolicy -XX:幸存者比率=128 -XX:NewSize=4055m -XX:MaxNewSize=4055m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseCMSInitiatingOccupancyOnly -Xms12888m -Xmx12888m -Dsun.rmi.dgc.client.gcInterval=1800000 -Dsun.rmi.dgc.server.gcInterval=1800000

图表是(绿色是“平均值”,蓝色是“最大值”): Memory graph - 16:00 - 8:00 system without load, 8:00+ - system is under load

直到 8:00,系统没有负载。

8:00 之后它处于负载状态,但不是很大(约 20 次同时操作)

【问题讨论】:

    标签: java memory-leaks garbage-collection


    【解决方案1】:

    这看起来像您在 Eden 空间中分配对象,这是 JVM 的正常操作。我建议您使用诸如 Flight Recorder 之类的内存分析器来找出分配率,看看是否有任何方法可以降低它。

    特别是,如果您每隔几秒钟就进行一次 GC,我会尝试减少您创建的垃圾量。如果它比这长,则取决于您的用例是否重要。

    如果您最近没有进行内存配置文件,我建议您这样做,只是为了从不同的角度了解您的应用程序。我发现即使在性能不是问题的情况下发现错误也很有用。

    -XX:SurvivorRatio=128

    这是相当高的,表明您有很多非常短暂的对象。这些可能很容易优化掉。

    我最近为纽约的一个客户开发了一个规则引擎,通过花费一天时间降低分配率,我们将其性能提高了 2.3 倍。通过在 CPU 上花费第二天,我们将吞吐量提高了 4 倍。

    【讨论】:

    • 确实有泄漏并且创建了太多对象。 SurvivorRatio 也太高了。谢谢!
    猜你喜欢
    • 2023-04-04
    • 2014-12-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多