【发布时间】:2014-05-02 20:23:54
【问题描述】:
我的实际问题是,目前 netbeans 正在使用大约 4G(根据 OS X 上的活动监视器)的内存。我设置了几个内存限制选项无济于事。来自我的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 的内存是系统内存的一半(还要注意它在我的 Linux 机器上的行为不是这样,具有相同的版本)。我认为对于 java IDE 来说,800M-2G 之间的任何地方都可能是正常的,并且是可以忍受的,我不会调查,就是这样,使用剩余的可用内存,没有任何可感知的原因让我想要看看到底是什么,为什么要保留这个。
更新:这是Memory leak in Swing on OS X in JVM 8 我真的无法接受无法让我找到 jdk 8 中问题原因的答案。
【问题讨论】:
-
第一步 - 找出内存消耗不可接受的条件。这可以是特定的项目或操作,例如编译、查找用法等。如果您没有任何线索,则第二步 - 分析 netbeans,但很可能您不会获得任何有用的信息。也可能是您的应用程序在 netbeans 中使用一些容易发生内存泄漏的本机代码打开。
-
具体定义“使用”。应用程序映射到 gigs 的共享库中并不少见,这些共享库 1) 实际上不是常驻的,2) 与许多其他正在运行的应用程序共享。
-
另外,Activity Monitor 显示的每个内存类别(活动、非活动等)使用了多少?
-
@MichaelBrewer-Davis(不是 100% 确定你的意思是什么 A.M. 似乎没有这些名字......)真实 2.83G,共享 101.4M,私有 2.74G。目前,Heap 保留 415/630M,Metaspace 保留 150/160M,加载了 23k 个类(卸载了 500 个)。
标签: java debugging memory-leaks jvm java-8