java - 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 在需要更少的内存分配的情况下运行?
解决方案
推荐阅读
- javascript - 如何使用 nightwatch.js 依次运行一系列“功能”测试
- vba - VBA 复制和粘贴数组公式
- sql-server - 使用powershell更新Excel文件中的SQL数据时如何自动输入密码?
- swift - 从 Swift 4 中返回的排序字典数组中访问键
- javascript - 在 Express 中拒绝访问 server.js
- python - 使用 re 和 urllib.request 模块
- mysql - mysql 使用 NOT IN 的最快方法
- signalr - Signalr - ConnectionId 的格式不正确
- asp.net-mvc - MVC 后值空
- spring-boot - 长时间运行@Scheduled Job 导致数据库连接泄漏