Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Heroku上的JVM内存不一致_Java_Heroku_Memory_Jvm - Fatal编程技术网

Java Heroku上的JVM内存不一致

Java Heroku上的JVM内存不一致,java,heroku,memory,jvm,Java,Heroku,Memory,Jvm,我有一个应用程序被托管在Heroku的一个dyno上,内存为1GB。我观察到关于记忆的奇怪行为。当我的应用程序被使用时,我注意到dyno上消耗的总内存会随着负载/使用量的增加而增加(这会导致内存泄漏,但请稍后再看…),但在垃圾收集运行时,总内存不会下降。我可以在我的JVM图中看到,JVM定期回收堆空间,但我从未看到总内存使用量的相应减少;它似乎只是在增加 见下图: 我使用EclipseMat分析了一个堆转储,但没有发现任何有用的东西。此外,我还向JVM添加了参数,如前所述,以将JVM目标内存

我有一个应用程序被托管在Heroku的一个dyno上,内存为1GB。我观察到关于记忆的奇怪行为。当我的应用程序被使用时,我注意到dyno上消耗的总内存会随着负载/使用量的增加而增加(这会导致内存泄漏,但请稍后再看…),但在垃圾收集运行时,总内存不会下降。我可以在我的JVM图中看到,JVM定期回收堆空间,但我从未看到总内存使用量的相应减少;它似乎只是在增加

见下图:

我使用EclipseMat分析了一个堆转储,但没有发现任何有用的东西。此外,我还向JVM添加了参数,如前所述,以将JVM目标内存消耗绑定到容器,而不是服务器本身


如果有人能告诉我为什么Heroku报告的dyno内存与我在JVM堆和非堆空间图上看到的内存不一致,我将不胜感激。

JVM级别的垃圾收集(它标记可用于其他对象的内存)但是第一个图形(内存使用)是操作系统级的容器在垃圾收集时不必将内存释放回操作系统。总使用率可能不会因堆使用率而降低,但如果未收集,则可能会突破限制

上午10:30时,您的堆变大了,操作系统级别的使用率也增加了,而且没有归还所花的钱

此外,您还可以定义相同的xms和xmx,这可能会更有效,但不要忘记您的限制不仅仅是堆大小,还有其他方面。例如堆栈、寄存器等

常驻内存(Memory_rss):动态存储器中存储在RAM中的部分(兆字节)。

您的Java代码中可能存在内存泄漏,但证据并不确凿

但如前所述,内存使用的外部(dymo)报告必然不同于内部(JVM堆)报告:

  • JVM在GC运行后往往不会将内存返回给操作系统。它倾向于保持记忆。。。这样它就可以把新的对象放进去

  • JVM使用的内存不是常规堆的一部分

  • 其他进程的内存使用情况将包含在dymo报告中(显然)

  • 现在,如果JVM内存图显示低谷底部的级别随着时间的推移不断增加,那么这将是(可能的)内存泄漏的强烈迹象。尤其是当堆的峰值使用率经常接近配置的JVM max_堆时。然而:

    • 这些图表显示的数据不足以得出任何结论
    • 如果堆没有满,就不会触发weakreference的中断,因此GC感知的缓存可能正在填满。(这可能是好的,也不坏。)
    最后,如果我正确地阅读了这些图,那么您有大约1GB的RAM空闲空间,并且您正在以1GB的最大堆运行JVM。那是自找麻烦


    (如果您的JVM导致虚拟内存抖动,它很可能会被操作系统的OOM杀手杀死。或者更糟……它可能会杀死其他更重要的进程。)

    谢谢!我将最大堆大小指定为-Xmx671m,因此我认为堆图显示1GB只是为了让所有图上的y轴匹配。我没有真正考虑过JVM保留已经从操作系统获取的内存,但这是有道理的。然而,我希望dyno max内存等于max heap memory(自上次重启以来的任何时间)+max non heap memory(自上次重启以来的任何时间),但它似乎比这还要高。我知道还有其他进程在运行,比如内存监视器等,但我不认为它们会那么需要内存。