我目前正在Jetty中运行一个Grails应用程序。它运行良好,但占用的内存比我想要的多。
HTOP
显示Jetty正在运行,如下所示:java-server-xmx256m-xms256m-xmn96m-xx:maxpermsize=64m-djetty.home=/home/...
在我看来,Jetty可能使用的最大内存应该是256+64=320 MB
。相反,它看起来是这样的:
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 6256 jetty 20 0 2747M 623M 13732 S 0.0 31.3 1:28.06 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java -server -Xmx256m -Xms256m -Xmn96m -XX:MaxPermSize=64m -Djetty.home=...
显然,我不会期望内存使用量正好是320 MB,但难道不应该接近吗?为什么会是预期内存的两倍?如果有的话,那么当堆填满时,Java难道不应该拒绝分配更多的空间吗?
我试着详细了解jmap
是怎么回事,但在我看来,一切都是正确的:
# jmap -heap 6256 Attaching to process ID 6256, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.7-b01 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 268435456 (256.0MB) NewSize = 100663296 (96.0MB) MaxNewSize = 100663296 (96.0MB) OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 67108864 (64.0MB) G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 65208320 (62.1875MB) used = 33343488 (31.798828125MB) free = 31864832 (30.388671875MB) 51.13379396984924% used From Space: capacity = 17170432 (16.375MB) used = 0 (0.0MB) free = 17170432 (16.375MB) 0.0% used To Space: capacity = 18284544 (17.4375MB) used = 0 (0.0MB) free = 18284544 (17.4375MB) 0.0% used PS Old Generation capacity = 167772160 (160.0MB) used = 132604224 (126.46124267578125MB) free = 35167936 (33.53875732421875MB) 79.03827667236328% used PS Perm Generation capacity = 67108864 (64.0MB) used = 55899320 (53.30974578857422MB) free = 11209544 (10.690254211425781MB) 83.29647779464722% used 26872 interned Strings occupying 2932096 bytes.
我以前在Jetty上运行过Grails应用程序,内存占用很少。刚刚检查了一个,它的内存占用了220 MB。所以我不确定我做错了什么。
JVM是一个本机程序,它消耗本机资源,包括本机内存。本机内存是运行时进程可用的内存,与Java应用程序使用的Java堆内存不同。每个虚拟化资源--包括Java堆和Java线程--都必须存储在本机内存中,以及虚拟机运行时使用的数据。
您还可以看看这个答案,它很好地解释了这个主题。
这个线程展示了一些如何使用Java泄漏本机内存的好例子。
Jetty文档也提到了这个主题。
如果您使用JDK7,您可以使用VisualVM buffer monitor插件来监视分配在垃圾收集堆之外的直接缓冲区。
问题内容: Tomcat 5.5.x和6.0.x Grails 1.6.x Java 1.6.x OS CentOS 5.x(64位) VPS服务器,内存为384M JAVA_OPTS:尝试了许多组合-包括以下内容 出口JAVA_OPTS =’-Xms128M -Xmx512M -XX:MaxPermSize = 1024m’ 导出JAVA_OPTS =’-server -Xms128M -Xmx
为什么我的java PID占用更多内存。目前我有24GB ram和max-xmx=15G。所以java PID的解决方案是占用更少的内存。 23794 root 0 22.2g 16.5g 13416 s 100.070.42980:54上面的java是我的最高命令结果。任何人都知道如何重新关注这个问题。
嗨,我对java编程还比较陌生。我编写的下面的程序似乎占用了很多内存(大约240 MB,正常吗?-我不这么认为!)请建议一些方法来优化这个程序,以便减少内存存储。 程序-- 代码-
请帮助选择如何存储消息: 1) 2) SET似乎比LIST更容易使用,但Redis会在每条消息中存储字段名,从而使内存使用量增加一倍吗?
问题内容: 有没有办法找出我的Java线程在虚拟机中占用多少内存? 例如,使用堆栈跟踪转储或其他某种方式。 问题答案: Java线程将堆用作共享内存。各个线程都有其堆栈(您可以通过-Xss命令行选项设置其大小,默认为512KB),但是所有其他内存(堆)都不属于特定线程,并询问一个特定线程仅使用了多少内存没有道理。
首先,我的问题是,为什么编译线程占用大量的CPU,以及如何最小化这一点,以便我们可以将CPU分配给其他线程。 提前感谢!