Java进程占用的内存超过了其最大堆大小。
Java进程占用的内存超过了其最大堆大小。
我在一台16GB内存的机器上运行了两个Tomcat服务器,内存设置如下:\n
JAVA_MEM_OPTIONS="-Xmx4096M -Xms4096M -XX:NewSize=512M -XX:MaxNewSize=512M -XX:PermSize=256M -XX:MaxPermSize=256M -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:SoftRefLRUPolicyMSPerMB=5 -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC"
\n顶部结果显示Java进程使用了46.5%(7.44GB)和39.2%(6.24GB)的内存。\n
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie Cpu(s): 7.8%us, 0.4%sy, 0.0%ni, 90.9%id, 0.2%wa, 0.0%hi, 0.7%si, 0.0%st Mem: 16424048k total, 16326072k used, 97976k free, 28868k buffers Swap: 1959920k total, 1957932k used, 1988k free, 1082276k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 26275 user1 25 0 8007m 7.3g 7832 S 13.6 46.5 785:31.89 java 28050 user2 25 0 7731m 6.1g 13m S 9.0 39.2 817:10.47 java
\nGC日志显示每个Java进程只使用了4GB的内存。一旦系统内存使用量增加,就不会再下降。\n
user1 - Java进程 89224.492: [GC 89224.492: [ParNew: 443819K->17796K(471872K), 0.0367070 secs] 2032217K->1608465K(4141888K), 0.0368920 secs] [Times: user=0.13 sys=0.00, real=0.03 secs] 89228.247: [GC 89228.247: [ParNew: 437252K->22219K(471872K), 0.0607080 secs] 2027921K->1615327K(4141888K), 0.0609240 secs] [Times: user=0.15 sys=0.00, real=0.06 secs] user2 - Java进程 89202.170: [GC 89202.170: [ParNew: 444989K->22909K(471872K), 0.0510290 secs] 2361057K->1945258K(4141888K), 0.0512370 secs] [Times: user=0.19 sys=0.00, real=0.05 secs] 89207.894: [GC 89207.894: [ParNew: 442365K->15912K(471872K), 0.0422190 secs] 2364714K->1945162K(4141888K), 0.0424260 secs] [Times: user=0.15 sys=0.00, real=0.04 secs]
\n当堆内存设置为4GB时,Java进程如何使用这么多内存?如何调试问题的原因。\n附注:有时我从Java代码中执行shell脚本,这会导致这种问题吗?
Java进程占用的内存超过了其最大堆大小的问题可能有以下几种情况:
- 线程数过多。线程栈空间分配在堆/永久代之外。可以使用-Xss选项设置每个线程分配的内存。
- 使用JNI(Java Native Interface)。参考这个问题:Java app calls C++ DLL via JNI; how best to allocate memory?
可能还有其他原因,但实际上,第一种情况很可能是问题的原因。
解决方法:
- 如果线程数过多,可以通过调整每个线程分配的内存来解决。使用-Xss选项,例如:
java -Xss2m
。
- 如果使用了JNI,可以参考上面提到的问题中的解决方案。