Java Heroku上的JVM内存不一致
我有一个应用程序被托管在Heroku的一个dyno上,内存为1GB。我观察到关于记忆的奇怪行为。当我的应用程序被使用时,我注意到dyno上消耗的总内存会随着负载/使用量的增加而增加(这会导致内存泄漏,但请稍后再看…),但在垃圾收集运行时,总内存不会下降。我可以在我的JVM图中看到,JVM定期回收堆空间,但我从未看到总内存使用量的相应减少;它似乎只是在增加 见下图: 我使用EclipseMat分析了一个堆转储,但没有发现任何有用的东西。此外,我还向JVM添加了参数,如前所述,以将JVM目标内存消耗绑定到容器,而不是服务器本身Java Heroku上的JVM内存不一致,java,heroku,memory,jvm,Java,Heroku,Memory,Jvm,我有一个应用程序被托管在Heroku的一个dyno上,内存为1GB。我观察到关于记忆的奇怪行为。当我的应用程序被使用时,我注意到dyno上消耗的总内存会随着负载/使用量的增加而增加(这会导致内存泄漏,但请稍后再看…),但在垃圾收集运行时,总内存不会下降。我可以在我的JVM图中看到,JVM定期回收堆空间,但我从未看到总内存使用量的相应减少;它似乎只是在增加 见下图: 我使用EclipseMat分析了一个堆转储,但没有发现任何有用的东西。此外,我还向JVM添加了参数,如前所述,以将JVM目标内存
如果有人能告诉我为什么Heroku报告的dyno内存与我在JVM堆和非堆空间图上看到的内存不一致,我将不胜感激。JVM级别的垃圾收集(它标记可用于其他对象的内存)但是第一个图形(内存使用)是操作系统级的容器在垃圾收集时不必将内存释放回操作系统。总使用率可能不会因堆使用率而降低,但如果未收集,则可能会突破限制 上午10:30时,您的堆变大了,操作系统级别的使用率也增加了,而且没有归还所花的钱 此外,您还可以定义相同的xms和xmx,这可能会更有效,但不要忘记您的限制不仅仅是堆大小,还有其他方面。例如堆栈、寄存器等 常驻内存(Memory_rss):动态存储器中存储在RAM中的部分(兆字节)。
您的Java代码中可能存在内存泄漏,但证据并不确凿 但如前所述,内存使用的外部(dymo)报告必然不同于内部(JVM堆)报告:
- 这些图表显示的数据不足以得出任何结论
- 如果堆没有满,就不会触发weakreference的中断,因此GC感知的缓存可能正在填满。(这可能是好的,也不坏。)
(如果您的JVM导致虚拟内存抖动,它很可能会被操作系统的OOM杀手杀死。或者更糟……它可能会杀死其他更重要的进程。)谢谢!我将最大堆大小指定为-Xmx671m,因此我认为堆图显示1GB只是为了让所有图上的y轴匹配。我没有真正考虑过JVM保留已经从操作系统获取的内存,但这是有道理的。然而,我希望dyno max内存等于max heap memory(自上次重启以来的任何时间)+max non heap memory(自上次重启以来的任何时间),但它似乎比这还要高。我知道还有其他进程在运行,比如内存监视器等,但我不认为它们会那么需要内存。