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环境的内存消耗.
标签:overhead,memory,eclipse,jvm,java 来源: https://codeday.me/bug/20191102/1988799.html