Java 8中的默认Xmxsize

Vit*_*aly 70 java memory

oracle文档中我发现:

-Xmxsize指定内存分配池的最大大小(以字节为单位),以字节为单位...默认值是在运行时根据系统配置选择的.

这是什么系统配置是什么意思?

icz*_*cza 123

它在实现和版本上有所不同,但通常取决于所使用的VM(例如客户端或服务器,参见-client-server参数)以及系统内存.

它的默认值通常是物理内存的1/4或1GB(以较小者为准).

Java配置选项(命令行参数)也可以"外包"到环境变量,包括-Xmx,可以更改默认值(意味着指定新的默认值).具体来说,JAVA_TOOL_OPTIONS环境变量由所有Java工具检查并在存在时使用(此处此处有更多详细信息).

您可以运行以下命令来查看默认值:

java -XX:+PrintFlagsFinal -version
Run Code Online (Sandbox Code Playgroud)

它给你一个loooong列表,-Xmxin MaxHeapSize,-Xmsin in InitialHeapSize.过滤您的输出(例如|grep在Linux上)或将其保存在文件中,以便您可以搜索它.

  • 作为一个小小的补充,您可以运行`java -XX:+ PrintCommandLineFlags`来根据当前系统信息打印出JVM选择的堆大小(和其他信息). (9认同)
  • 对于大盒子,这个“1/4 内存”的经验法则绝对不成立。在 4 插槽、每插槽 64gb 的服务器(即 256gb RAM)上,Xmx 默认为 ~32gb。32GB 也可能与 CompressedOops 的限制有关。 (2认同)
  • 这只与打印堆大小相关的行:`java -XX:+ PrintFlagsFinal -version | grep HeapSize` (2认同)

Sar*_*dra 31

与您提到的一样,默认值-Xmxsize(Maximum HeapSize)取决于您的系统配置.

对于Xmssize(最小HeapSize),Java8需要物理内存的1/6大小,而物理内存的-Xmxsize1/4大小(最大HeapSize).

这意味着如果你有一个8GB RAM的物理内存,你将获得Xmssize8*(1/6)的较大值和-Xmxsize8*(1/4)的较小值.

您可以使用检查默认的HeapSize

Windows中:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Run Code Online (Sandbox Code Playgroud)

Linux中:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Run Code Online (Sandbox Code Playgroud)

这些默认值也可以覆盖到您想要的数量.

  • 参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size (2认同)

小智 13

令人惊讶的是,这个问题没有明确的记录答案.也许另一个数据点可以为寻找答案的其他人提供价值.在运行CentOS(6.8,7.3)和Java 8(构建1.8.0_60-b27,64位服务器)的系统上:

默认内存是物理内存的1/4,不受1GB的限制.

此外,-XX:+PrintFlagsFinal打印到STDERR所以命令以确定上面其他人提供的当前默认内存应调整到以下内容:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
Run Code Online (Sandbox Code Playgroud)

在具有64GB物理RAM的系统上返回以下内容:

uintx MaxHeapSize                                  := 16873684992      {product}
Run Code Online (Sandbox Code Playgroud)


Bin*_*ati 5

在我的 Ubuntu VM 上,总 RAM 为 1048 MB,java -XX:+PrintFlagsFinal -version | grep HeapSize打印出 : uintx MaxHeapSize := 266338304,大约为 266MB,是我总 RAM 的 1/4。

  • 在我看来,OpenJDK 和 Oracle 具有不同的特征 - 我看到 OpenJDK 始终使用 1/4 的 RAM 作为 -Xmx(绝不是 1/4 和 1GB 中较小的一个) (2认同)

Vys*_*sur 5

截至2019 年 5 月 8 日:

JVM 堆大小取决于系统配置,这意味着:

a) 客户端 jvm 与服务器 jvm

b) 32 位与 64 位

链接:

1)从J2SE5.0更新:https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2)简要回答:https://docs.oracle.com/ javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html
3)详细答案:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4)客户端与服务器:https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

摘要:( 从上面的链接很难理解。所以在这里总结一下)

1) Client jvm 的默认最大堆大小为 256mb(有一个例外,请从上面的链接中读取)。

2) 32 位服务器 jvm 的默认最大堆大小为 1gb,64 位服务器 jvm 的默认最大堆大小为 32gb(这里也有例外。请从链接中阅读)。

因此,默认最大 jvm 堆大小为:256mb1gb32gb ,具体取决于上面的 VM。