这个问题专门 Sun Java JVM在Linux X86-64上运行. 。我想弄清楚 为什么Sun JVM即使我设置了堆和非降压限制,Sun JVM即使系统的物理记忆也如此之多.

我正在运行的程序是Eclipse 3.7,带有多个插件/功能。最常用的功能是PDT,Egit和Mylyn。我正在使用以下命令行开关开始日食:

-nosplash -vmargs -Xincgc -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -XX:MaxPermHeapExpansion=10m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseParNewGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=5 -XX:GCTimeRatio=49 -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=1000 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+AggressiveOpts -Dorg.eclipse.swt.internal.gtk.disablePrinting

值得注意的是尤其是开关:

-Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m

这些开关 应将JVM堆限制在最大200 MB和非HEAP至150 MB (JConsole标记为“ CMS永久生成”和“代码缓存”)。从逻辑上讲,JVM应将总计350 MB加上JVM所需的内部开销。

实际上,JVM服用544.6 MB 对于我当前的日食过程,ps_mem.py计算(http://www.pixelbeat.org/scripts/ps_mem.py)计算Linux 2.6+内核保留的真实物理内存页。 那是35%或大约200MB的内部Sun JVM开销!

关于如何减少开销的任何暗示吗?

这是一些其他信息:

$ ps auxw
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
me       23440  2.4 14.4 1394144 558440 ?      Sl   Oct12 210:41 /usr/bin/java ...

根据JCONSOLE的说法,该过程使用了160 MB的堆和151 MB的非HEAP。

我并不是说我负担不起使用额外的200MB运行Eclipse,但是如果有一种减少这种浪费的方法,我宁愿将200MB用于内核块设备缓冲区或文件缓存。此外,我在其他Java程序中也有类似的经验 - 也许我可以通过类似的调整来减少所有人的开销。

更新:发布问题后,我发现了以前的文章:为什么Sun JVM即使堆尺寸稳定,Sun JVM也会继续消耗更多的RSS内存?看来我应该使用 pmap 调查问题。

有帮助吗?

解决方案

我认为,日食环境的高度记忆消耗的原因是使用SWT。 SWT是生活在JVM堆之外的本地图形库,为了使情况恶化,Linux上的实现并未真正优化。

我认为实际上没有机会减少日食环境的记忆消耗,以使堆外的内存。

其他提示

Eclipse是一种记忆和CPU猪。除Java类库外,所有低端GUI的内容均由本机系统调用来处理,因此您将拥有一个实质性的“本机” JNI库来执行您的流程中附加的低级别X式呼叫。

Eclipse提供了数百万个有用的功能和许多帮助者,以加快您日常编程任务的加快 - 但瘦而意味着不是。记忆或资源的任何减少都可能导致明显的放缓。这实际上取决于您对时间与计算机内存的重视程度。

如果您想要瘦弱,而卑鄙的gvim和make是无与伦比的。如果您希望完成代码完成,自动构建等。您必须期望用额外的资源为此付费。

如果我运行以下程序

public static void main(String... args) throws InterruptedException {
    for (int i = 0; i < 60; i++) {
        System.out.println("waiting " + i);
        Thread.sleep(1000);
    }
}

ps auwx 印刷

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
500      13165  0.0  0.0 596680 13572 pts/2    Sl+  13:54   0:00 java -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -cp . Main

所使用的内存量为13.5 MB。大约有200 MB的共享库,这些库符合VSZ的大小。其余的可以在最大堆中,最大pers gen带有螺纹堆栈的开销等。

问题似乎不是JVM,而是在其中运行的应用程序。使用其他共享库,直接内存和内存映射的文件可以增加所使用的内存量。

鉴于您可以以100美元左右的价格购买16 GB,您知道这实际上是一个问题吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top