gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:00:25 26 4
gpt4 key购买 nike

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

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

  • 12GB 机器:9460MB
  • 8GB 机器:4790MB

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

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

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

  • 12GB 机器:大约 3GB 免费空间。
  • 8GB 机器:大约 4GB 可用空间。

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

最佳答案

我从 JDK bug 找到了有趣的评论(JDK 9 版本中的错误而不是 8 中的错误。它说错误已在 8.x 版本中修复,但没有告诉次要构建号。

If virtual memory has been limited with "ulimit -v", and the server has a lot of RAM, then the JVM can not start without extra command line arguments to the 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 修复的东西。如果是这样,我们可以关闭此错误。

当使用“UseConcMarkSweepGC”时,上面的命令行不起作用。我尝试添加 MaxMetaspaceSize=128m,但没有帮助。我确信有一个论点可以使它起作用,但我还没有找到。使用有限的虚拟内存配置 GC 对用户来说不是很友好。

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

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

关于Java:什么决定了 Linux 机器中可能的最大堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com