进行堆转储并找出持有它们的对象。一旦你知道哪些对象持有数组,你应该很容易弄清楚是什么在分配它们。
它没有回答你的问题,但我的问题是:
你为什么在乎?
您已经告诉 jvm 垃圾收集器 (GC) 它最多可以使用 1GB 内存。Java 使用少于 250M。
GC 试图对它何时进行垃圾收集以及它在垃圾收集时的工作强度进行智能处理。在您的图表中,没有对内存的需求。jvm 并不接近您设置的 1GB 限制。我认为 GC 完全没有理由非常努力。不知道你为什么会关心。
垃圾收集器懒惰是件好事。GC 工作越少,您的应用程序可用的资源就越多。
您是否尝试过通过 JVisualVM 的“Perform GC”按钮触发 GC?该按钮应触发“停止世界”垃圾收集操作。当图表位于其中一个锯齿上升的中间时尝试一下 - 我预测使用量将下降到锯齿的底部或以下。如果是这样,那就证明内存锯齿只是垃圾堆积,而 GC 正在做正确的事情。
这是我使用的 java swing 应用程序的内存使用截图:
注意锯齿图案。
你说你担心 int[]。当我启动内存分析器并对其进行分析时,我可以看到 int[] 的分配
基本上所有分配都来自 ObjectOutputStream$HandleTable.growEntries 方法。看起来分配的线程被启动以处理网络消息。
我怀疑它是由 jmx 本身引起的。可能通过 rmi(你使用 rmi 吗?)。或调试器(您是否连接了调试器?)。