java-如何减少Sun / Oracle JVM内部开销?

此问题专门与在Linux x86-64上运行的Sun Java JVM有关.我试图弄清楚为什么即使设置了Heap和Non-Heap限制,Sun JVM也会占用这么多系统物理内存.

我正在运行的程序是带有多个插件/功能的Eclipse 3.7.最常用的功能是PDT,EGit和Mylyn.我使用以下命令行开关启动Eclipse:

-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,将非堆最大限制为150 MB(由JConsole标记为“ CMS永久生成”和“代码缓存”).从逻辑上讲,JVM应该总共占用350 MB加上JVM所需的内部开销.

实际上,JVM通过ps_mem.py(http://www.pixelbeat.org/scripts/ps_mem.py)计算出的当前Eclipse进程占用544.6 MB的空间,该进程计算Linux 2.6内核保留的实际物理内存页面.这是内部Sun JVM开销的35%或大约200MB!

关于如何减少此开销的任何提示?

以下是一些其他信息:

$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的非堆.

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

更新:发布问题后,我找到了以前的帖子:
Why does the Sun JVM continue to consume ever more RSS memory even when the heap, etc sizes are stable?
看来我应该使用pmap来调查问题.

解决方法:

我认为Eclipse环境占用大量内存的原因是使用SWT. SWT是驻留在JVM堆之外的本机图形库,更糟糕的是,Linux上的实现并未真正优化.

我认为没有真正的机会来减少与堆外部内存有关的Eclipse环境的内存消耗.

上一篇:ABAP的Package interface, 安卓的manifest.xml和Kubernetes的Capabilities


下一篇:C#基本类型别名的结构开销?