【问题标题】:JAVA Garbage collection not runningJAVA 垃圾收集未运行
【发布时间】:2017-03-02 23:32:29
【问题描述】:

我们有一个运行在 java 1.8 上的应用程序在生产服务器上具有高堆利用率,并且发现根本没有发生 Major GC。相同的配置已应用于非 prod 机器,但 Major GC 在那里每隔一小时运行一次。是什么触发了 Major GC,产品上更好的 H/W(更多 CPU)会导致任何问题吗?

java.args=-server -Xms3072m -Xmx3072m -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:MaxMetaspaceSize=1024m -XX:NewRatio=4 -Dsun.io.useCanonCaches=false -XX:+UseParallelGC -XX:+UseAdaptiveSizePolicy -XX:-CreateMinidumpOnCrash 

提前致谢。

【问题讨论】:

  • 使用-XX:+PrintGCDetails 启用 gc 日志记录,分析日志,例如如果您想了解更多信息,请使用 gcviewer。没有进一步的数据,很难得出任何结论。
  • 如果应用有足够的空闲堆内存,则不会触发Major GC。使用 JConsole(随您的 JDK 提供),您可以检查内存使用情况。
  • 触发 Major GC 是你应用程序的实际目的吗?或者,换句话说,有什么问题
  • @user1550159 找到解决方案了吗?你能给我们指一个吗?任何答案是否有帮助或解决您的问题?谢谢。

标签: performance java-8 garbage-collection jvm heap-memory


【解决方案1】:

Oracle / Java 从不保证 GC 会运行。这是垃圾收集的最大问题,你无法预测它的行为

【讨论】:

  • 谢谢,但为什么两台服务器在设置相同时会有不同的表现?
  • @user1550159 在stackoverflow上已经有几个答案(比如这里:stackoverflow.com/questions/1582209/…和这里:stackoverflow.com/questions/6909150/…。我希望两个不同的服务器应该表现不同,因为它们会有所不同就硬件和在其上运行的实际软件而言;这将影响可用内存和新要求。
【解决方案2】:

我可以从您共享的设置中看到您正在使用并行收集器,这将在您的老年代每次变满时触发一次主要收集。消耗的内存是工作负载的函数,因此如果您在两个环境中具有相同的工作负载,您应该在两个环境中为相同的堆大小获得相似数量的主要集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2011-11-07
    • 2017-01-31
    • 2012-04-21
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多