Java:什么决定了Linux机器中可能的最大堆大小

Java:什么决定了Linux机器中可能的最大堆大小,第1张

概述Java:什么决定了Linux机器中可能的最大堆大小

我有两台linux机器(都是虚拟机),一台有12GB内存,另外一台有8GB内存。

我试图在两台机器上启动相同的Java程序,尽可能使用最大堆大小(使用-Xmx标志)。 以下是我得到的结果。

12GB机器:9460MB

8GB机器:4790MB

如果我指定超出限制的最大堆大小,我会得到以下错误。

Error occurred during initialization of VM Could not allocate Metaspace: 1073741824 bytes

我检查了两个系统中的空闲内存(使用free命令),然后我得到了以下内容。

Java用特定所有者(用户/组)创build文件和目录

jenkins发现无法findssh密钥

如何将.java或.jar文件转换为linux可执行文件(没有.jar扩展名,这意味着它不是.jar文件)

Java运行时环境HKEY_LOCAL_MACHINE错误

线程“main”中的exceptionjava.lang.UnsatisfIEdlinkError:java.library.path中没有lwjgl

12GB机器:约3GB免费。

8GB机器:约4GB免费。

我的问题是,什么决定了Java程序可以启动的最大堆大小,这不会导致上述错误? (当程序给出以上错误时,系统有足够的内存来分配1073741824字节的内存)

如何读取Java中的.csv文件,其中包含多行的单元格?

从AJP连接器请求中检索Shibboleth属性

在java(w).exe进程列表中查找.jar的名称

Docker端口不能从主机访问

在64位windows上编译的JAR不会在32位上运行

我从JDK BUG (JDK 9版本中的BUG,而不是8版本)中发现了有趣的评论。它说BUG在8.x版本中得到了修复,但是并没有告诉次要的内部版本号。

如果虚拟内存被限制为“ulimit -v”,并且服务器有大量内存,那么JVM无法在没有额外的GC命令行参数的情况下启动。

// After "ulimit -v" The jvm does not start with default command line. $ ulimit -S -v 4194304 $ java -version Error occurred during initialization of VM Could not allocate Metaspace: 1073741824 bytes

注释:

问题似乎是我们必须指定MALLOC_ARENA_MAX。

如果我设置环境变量MALLOC_ARENA_MAX = 4,那么jvm可以在没有任何额外参数的情况下启动。

我想这不是可以从jvm修复的东西。 如果是的话,我们可以关闭这个BUG。

当使用“UseConcmarkSweepGC”时,上面的命令行不起作用。 我试图添加MaxMetaspaceSize = 128m,但它没有帮助。 我确信有一个论据可以使之成功,但我还没有找到一个。 使用有限的虚拟内存配置GC不是非常方便用户使用。

根据您的要求更改参数并尝试这一个。

ulimit -S -v 4194304 java -XX:MaxHeapSize=512m -XX:InitialHeapSize=512m -XX:CompressedClassspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:+UseConcmarkSweepGC -version

我用ravindra给出的线索做了一些实验,发现最大的最大堆大小与系统中可用的总虚拟内存有直接关系。

可以找到系统中的总虚拟内存(以KB为单位):

ulimit-v

总的虚拟内存可以改变:

ulimit -v <new amount in KB>

可能的最大堆大小比虚拟内存大约少2GB。 如果使用ulimit -v unlimited指定无限制的虚拟内存,则可以为最大堆大小指定任何较大的值。

您可用的内存是可用RAM和交换空间的组合。 这也取决于系统是否启用了过度使用 – 如果是的话,内核将允许程序分配比实际可用的更多的内存(在合理的范围内),因为程序通常分配的比实际要使用的更多。

请注意,overcommit是默认启用的。 要禁用它,请将/proc/sys/vm/overcommit_memory 2写入/proc/sys/vm/overcommit_memory 。 (奇怪的是, 0的值并不意味着“没有过量使用”。)但是,首先阅读overcommit文档是个好主意。

总结

以上是内存溢出为你收集整理的Java:什么决定了Linux机器中可能的最大堆大小全部内容,希望文章能够帮你解决Java:什么决定了Linux机器中可能的最大堆大小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存