我在计算集群上运行了许多工作,当它们超过所请求的资源使用时它们被杀死 - 其中一个用途是虚拟内存大小.
在我的java启动命令中,我-Xmx8000m用来表示初始堆栈大小为8GB,我还没有看到我的程序的实际内存使用量超过4GB,但是想要安全起见.
但是,当我使用top命令时,我看到我的java进程的12GB的虚拟内存大小 - 正好在所请求的虚拟内存空间的限制.我不能增加我所请求的VM大小,因为已经提交了作业,我要求他们花费的时间越长.
Java是否一致地请求比指定的更多的VM堆空间?这是一个恒定的数量,或恒定的%或随机?堆空间是否可以增长到a)请求的VM大小(8GB)或b)分配的VM大小(12GB).
编辑:在Linux上使用jre-1.7.0-openjdk
小智 8
本文对该问题进行了很好的分析:为什么我的Java进程比Xmx消耗更多的内存而且它的作者提供了这个近似的公式:
Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]
Run Code Online (Sandbox Code Playgroud)
但除了应用程序消耗的内存之外,JVM本身也需要一些肘部空间.- 垃圾收集. - JIT优化. - 堆外分配. - JNI代码. - Metaspace.
但要小心,因为它可能取决于平台和JVM供应商/版本.
这可能是由于 glibc 2.10+ 中 malloc 行为的变化,其中 malloc 现在创建每线程内存池(arenas)。64 位的 Arena 大小为 64MB。在 64 位上使用 8 个 arenas 后,malloc 将 arenas 的数量设置为 number_of_cpus * 8。因此,如果您使用具有许多处理器内核的机器,则虚拟大小很快设置为很大,即使实际内存使用(居民大小)要小得多。
由于您看到 top 显示 12GB 虚拟大小,您可能正在使用具有 24 个内核或硬件线程的 64 位机器,给出 24 * 8 * 64MB = 12GB。分配的虚拟内存量随内核数而变化,并且数量会根据您的作业被发送到运行的机器上的内核数而变化,因此此检查没有意义。
如果您使用 hadoop 或 yarn 并收到警告,请将yarn.nodemanager.vmem-check-enabledyarn-site.xml设置为false.
参考:
请参阅此页面上的 #6:
http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-sumption-gotchas/
链接到此页面上更深入的讨论:
请注意,在此 stackoverflow 页面上已经部分回答了这一点:
| 归档时间: |
|
| 查看次数: |
6763 次 |
| 最近记录: |