当前位置: 首页 > 知识库问答 >
问题:

Java进程占用的内存超过其最大堆大小

韦业
2023-03-14
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"
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  
user1 - java process

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 process

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]

PS:有时我会从java代码执行shell脚本。会不会导致这类问题?

共有1个答案

强宾白
2023-03-14

有几种情况:

    具有大量线程的
  1. 线程堆栈空间是在堆/perm空间之外分配的。若要设置每个线程分配的内存,请使用-xss选项。
  2. 使用JNI。看看这个问题,Java应用程序通过JNI调用C++DLL;如何最好地分配内存?

大概还有更多,在实践中,第一种情况最有可能是原因。

 类似资料:
  • 对于我的节点应用程序,我有一个运行在Debian上的服务器(app.js),它使用socket.io向我的客户机(index.html)提供html和websocket数据。我正在尝试制作一个回合制的HTML5多人游戏。 在使用socket.emit()/io.emit()和socket.on()成功执行了多次数据传输后,我的服务器在socket.emit()调用上崩溃,出现错误 “events.

  • //{this.props.params.item}来自反应路由器(路径('/detail/item/id')) 为什么我的调度是无限循环,直到出错(超过最大调用堆栈大小)

  • 我想检查我的应用程序是否很好地获得选项。 java进程在docker容器中运行。 为了做到这一点,我要找到所创建进程的最大堆大小。 null 假设(ngcmx+ogcmx)=()可以吗? https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

  • 问题内容: 我无法终生弄清楚为什么我会出错: 超过最大呼叫堆栈大小 运行此代码时。如果我注释掉: 错误消失了。我什至已注释掉其他电话,以尝试缩小问题的出处。 代码(删除了额外的功能): 问题答案: 由于此循环: 您正在从render调用getTabs方法,并在其中进行操作,将触发重新渲染,再次是getTabs ..... 无限循环 。 从方法中删除,它将起作用。 另一个问题在这里: 我们需要为on

  • 当我研究线程及其占用的内存(线程堆栈)时,我决定做一个简单的负载测试,看看线程的数量如何影响我的计算机上的RAM。 所以,在测试中,我使用了Tomcat,在设置中。xml将最小和最大web容器线程池设置为200。在那之后,我在将pool设置为2000时也做了同样的操作。我很震惊,因为内存占用没有差异(通过Windows任务管理器进行检查),而且几乎是一样的。所以我认为这些线程可能必须处于运行状态,

  • 我在chrome上收到错误“未捕获的范围错误:超出最大调用堆栈大小”。这是我的j查询函数 从这行