首页 > 解决方案 > java启动需要多少内存?

问题描述

我在具有内存控制的环境中运行 java 时遇到了一些问题。我的用例是太阳网格引擎(SGE),但我可以用 ulimit 重现。

当我尝试使用内存限制 (-Xmx) 运行 java 时,我发现我仍然需要从 ulimit 允许更多的内存。

evaben@evaben:~$ (ulimit -v 1000000; java -Xmx500m -version; )
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes
evaben@evaben:~$ (ulimit -v 2000000; java -Xmx500m -version; )
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes
evaben@evaben:~$ (ulimit -v 4000000; java -Xmx500m -version; )
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
evaben@evaben:~$ 

所以一个500m的-Xmx需要ulimit的4G空间。我知道 Xmx 只限制了 java 内存使用的某些方面,可能只有堆。但是 3.5G 或 700% 的开销似乎过大了。

我尝试了一些 strace-ing,我看到上面的 java 正在映射多个大块,可能来自不同的线程或子进程。

strace -f -e memory java -Xmx500M -version 2>&1 1>/dev/null  | grep mmap | grep ENOMEM | wc -l
96

strace -f -e memory java -Xmx500M -version 2>&1 1>/dev/null  | grep mmap | awk '$1 == "[pid"{print $2}' | sort | uniq -c 
> many pids mmapping

/bin/time 仅报告 RSS,在此示例中约为 30 MB。有没有一种简单的方法来显示总的 alloc/mmap 请求?

为什么java需要这么多内存?有什么方法可以让 java 在需要更少的内存分配的情况下运行?

标签: javamemoryout-of-memoryqsubsungridengine

解决方案


推荐阅读