在jvm 8中查找内存使用过多的原因

时间:2014-05-02 20:23:54

标签: java debugging memory-leaks jvm java-8

我的实际问题是,目前netbeans正在使用大约4G(根据OS X上的Activity Monitor)的内存。我设置了几个内存限制选项无济于事。来自我的netbeans.conf

netbeans_default_options="-J-client -J-Xmx1G -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxMetaspaceSize=256m -J-XX:+UseConcMarkSweepGC -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true"

我想知道的是如何找出为什么它会使用这么多内存?我应该采取什么步骤来确定问题的根源。

(我对通用而不是特别的netbeans更感兴趣)。值得注意的是,我只编写了几个月的Java编程,并且不知道可用的工具,或者我应该检查的内容。 (例如我今天添加了MaxMetaspaceSize,因为我意识到这并不受限制,认为可能是这样,但我仍然不确定如何检查。)

以下是我从visualvm堆转储

中发现的一些内容
  File size: 364.7 MB      Total bytes: 332,921,516     Total classes: 24,143     Total instances: 4,151,139     Classloaders: 3,272     GC roots: 65,185     Number of objects pending for finalization: 0 

它的元空间图显示它为堆保留了大约600M,为元空间保留了150M。那时活动监视器显示了2G内存使用情况。我想弄清楚的是整个1G额外的内存使用量。如果它是几百兆字节它是可以容忍的,但是2-4G的ram是系统内存的一半(同时注意到它在我的Linux机器上没有这种方式,具有相同的版本)。我认为800M-2G的任何地方对于Java IDE来说可能是正常的,并且是可以容忍的,我不会调查,就是这样,使用剩余的可用内存,没有任何可察觉的原因让我想要看看到底是什么,以及为什么要保留它。

Activity Monitor and visual VM numbers not adding up

更新:这是一个Memory leak in Swing on OS X in JVM 8 我无法接受那些无法让我找到解决问题的原因的答案。

1 个答案:

答案 0 :(得分:2)

JDK随附工具。运行%JAVA_HOME%\ bin \ jvisualvm.exe并检查您的实例。您应该能够执行堆转储并分析使用情况。