在oracle文档中,我发现:
-Xmxsize以字节为单位指定内存分配池的最大大小(以字节为单位)...默认值是在运行时根据系统配置选择的。
这是什么系统配置是什么意思?
Answers:
它取决于实现和版本,但通常取决于所使用的VM(例如,客户端或服务器,see-client
和-server
参数)以及您的系统内存。
client
默认值通常是物理内存的1/4或1GB(以较小者为准)。
Java配置选项(命令行参数)也可以“外包”给环境变量,包括-Xmx
,可以更改默认值(意味着指定新的默认值)。具体来说JAVA_TOOL_OPTIONS
,所有Java工具都会检查环境变量,并在环境变量存在时使用它(此处和此处提供更多详细信息)。
您可以运行以下命令以查看默认值:
java -XX:+PrintFlagsFinal -version
它为您提供了一个清单,-Xmx
位于中MaxHeapSize
,-Xms
位于中InitialHeapSize
。过滤您的输出(例如,|grep
在Linux上)或将其保存在文件中,以便您可以在其中搜索。
java -XX:+PrintCommandLineFlags
以打印出JVM根据当前系统信息选择的堆大小(和其他信息)
-XX:+PrintFlagsFinal
,您建议的参数对我不起作用。将其添加到答案。
-XX:+PrintFlagsFinal
是的,对不起是最好的选择,因为考虑到所有因素后,它应该显示所有信息(包括手动选项和人体工程学)。虽然-XX:+PrintCommandLineFlags
似乎可以在我的JVM上运行(可能取决于确切的版本)
java -XX:+PrintFlagsFinal -version | grep HeapSize
就像您提到的那样,默认值-Xmxsize
(最大堆大小)取决于您的系统配置。
Java8client
占用您的Xmssize
(最小堆大小)的物理内存的1/64的较大值,以及占用您的-Xmxsize
(最大堆大小)的物理内存的1/4的较小值。
这意味着,如果您具有8GB RAM的物理内存,则将具有Xmssize
8 *(1/6)的大号-Xmxsize
和8 *(1/4)的小号。
您可以使用以下命令检查默认的HeapSize
在Windows中:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
在Linux中:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
这些默认值也可以覆盖到您想要的数量。
令人惊讶的是,这个问题没有确定的书面答案。也许另一个数据点将为寻找答案的其他人提供价值。在运行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
在具有64GB物理RAM的系统上返回以下内容:
uintx MaxHeapSize := 16873684992 {product}
在我的Ubuntu VM上,总RAM为1048 MB,java -XX:+PrintFlagsFinal -version | grep HeapSize
打印: uintx MaxHeapSize := 266338304
,大约为266MB,是我总RAM的1/4。
截至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)Server jvm的默认最大堆大小为32位,而64位为32gb(同样,这里也有例外。请从链接中读取)。
因此,默认的最大jvm堆大小为:256mb或1gb或32gb,具体取决于上述VM。