Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当未指定显式参数时,进程是否会分配足够的堆?_Java_Performance_Memory Management_Jvm - Fatal编程技术网

Java 当未指定显式参数时,进程是否会分配足够的堆?

Java 当未指定显式参数时,进程是否会分配足够的堆?,java,performance,memory-management,jvm,Java,Performance,Memory Management,Jvm,我通过Java8上的主类运行java进程。我没有指定任何地方的最小(Xms)和最大(Xmx)堆大小。但当我通过visualVM检查时 4267704320(即4.26 GB),这是给定进程的默认最大堆大小(也可通过windows命令确认) -XX:+PrintFlagsFinal-version 2>&1 | findstr MaxHeapSize。在linux机器上也是如此) 我的问题是如果我的进程(在linux机器上)需要更多5GB的内存(我有30GB的RAM),当我没有指定时,我的进程会被

我通过Java8上的主类运行java进程。我没有指定任何地方的最小(Xms)和最大(Xmx)堆大小。但当我通过visualVM检查时 4267704320(即4.26 GB),这是给定进程的默认最大堆大小(也可通过windows命令确认)
-XX:+PrintFlagsFinal-version 2>&1 | findstr MaxHeapSize
。在linux机器上也是如此)

我的问题是如果我的进程(在linux机器上)需要更多5GB的内存(我有30GB的RAM),当我没有指定时,我的进程会被分配5GB的内存吗
任何显式堆大小(Xms和Xmx)参数。

如果您的计算机上有可用的RAM,那么如果您在服务器模式下运行64位JVM,那么是的,堆大小将能够达到大约7.5 GB

(我强调了相关部分):

客户端JVM默认初始和最大堆大小

默认的最大堆大小为物理内存的一半,最大物理内存大小为192 MB,否则为物理内存的四分之一,最大物理内存大小为1 GB

服务器JVM默认初始和最大堆大小

默认初始堆大小和最大堆大小在服务器JVM上的工作方式与在客户端JVM上的工作方式类似,只是默认值可能会更高。在32位JVM上,如果有4GB或更多物理内存,则默认的最大堆大小可以高达1GB在64位JVM上,如果有128 GB或更多的物理内存,则默认的最大堆大小可以高达32 GB。通过直接指定这些值,始终可以设置较高或较低的初始堆和最大堆;见下一节

同样,假设64位JVM在服务器模式下运行,根据文档,默认的最大堆大小将是总RAM的四分之一。因此,在您的情况下大约有7.5 GB(30 GB中的1/4)


如果在服务器模式下运行32位JVM,则上限为1GB。在客户端模式下,最大容量为256 MB。

对于64位JVM,只有服务器模式。由于OP已经声明JVM使用4GB最大内存,所以它必须是64位JVM。顺便说一句,实际上,32位JVM使用的内存超过了1GB。@Holger:谢谢。我不清楚OP提到的4GB最大值是仅在Windows中还是在Linux中。@sstan两个后续问题1)如果3GB已经被另一个进程占用了怎么办。然后我相信分配给第二个进程的默认内存将是7.5-3=4.5GB。正确的?2) 假设我在没有任何显式堆大小选项的情况下启动第一个java进程。因此,根据您的回答,默认分配给该进程的最大堆数为7.5。现在,如果您想运行另一个需要2GB堆的java进程。我能开始第二个过程吗。我相信答案应该是否定的,因为7.5GB的内存已经为第一个进程保留了。对吗?@sstan你能回答我最后的评论吗?