Windows 10 64位运行64位JVM的Java进程使用的最大堆大小

Windows 10 64位运行64位JVM的Java进程使用的最大堆大小,java,jvm,64-bit,windows-10,heap-size,Java,Jvm,64 Bit,Windows 10,Heap Size,运行在Windows 10 64位和64位JVM上的Java进程的最大堆大小是多少?我的机器有8GB内存。我正在运行Java 8。 为了实验目的,我试图在巨大的图形上运行BFS。在运行BFS时,我监视Java Visual VM中使用的堆大小。根据VisualVM,不管提供以下JVM参数,堆利用率始终小于2000MB -Xms2048m -Xmx3072m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUP

运行在Windows 10 64位64位JVM上的Java进程的最大堆大小是多少?我的机器有8GB内存。我正在运行Java 8。 为了实验目的,我试图在巨大的图形上运行BFS。在运行BFS时,我监视Java Visual VM中使用的堆大小。根据VisualVM,不管提供以下JVM参数,堆利用率始终小于2000MB

-Xms2048m
-Xmx3072m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

我在互联网上做了一些研究,但找不到与我使用的系统规范相关的任何具体答案。在Windows 10 64位和64位JVM上,java进程能否使用超过2GB的内存?由于Windows XP/2008/7的限制为2 GB。

在64位机器上,使用64位JVM,您可以处理数千GB的堆(几十GB)。除了可用内存(以及64位指针的理论地址空间),我不确定它是否受到任何限制

当然,如果您使用的是一个巨大的堆,那么GC还有很多工作要做,您可能会发现需要水平扩展而不是垂直扩展,以保持良好的性能


如果VisualVM没有显示您使用的内存超过2GB(初始堆大小由
-Xms
给出),那么它可能不需要超过2GB。您已授予最多使用3GB的权限(
-Xmx
),但JVM不会仅仅为了好玩而分配更多内存。

32位JVM可以分配的最大堆是2^32=4G,同样4gb将被划分为1+GB,以便VM用于运行时类。它在windows上的容量约为2GB,在linux上的容量约为3GB。 当您使用64位计算机时,可用的最大堆是2^64,它足够大,您可以轻松运行BFS


您可以使用vm标志监视可用内存“-XX+PrintFlagsFinal | grep-iE HeapSize”将告诉您可以使用的最大可用堆大小。配置略小于此值,然后开始使用…

您无法为64位体系结构指定明确的大小,但简单的测试可以帮助您找到可用的或可以为进程分配的最大连续空间。这可以通过使用简单的命令进行如下测试。 尝试如下 java-Xmx-version 如果上面的命令给出了结果,那么您的系统可以允许Xmx达到该级别,如果失败,那么您不能指定该值

很少有来自系统的测试。 我用20G、40g、100G、160G、300G测试了这个值,所有这些都给出了java版本的输出,但是用1600G测试了这个值,结果抛出了错误。 测试输出 C:\Users\mpalanis>java-Xmx300G-version

java版本“1.7.0_80” Java(TM)SE运行时环境(build 1.7.0_80-b15) Java HotSpot(TM)64位服务器虚拟机(构建24.80-b11,混合模式)

C:\Users\mpalanis>java-Xmx1600G-version

初始化VM时出错 无法为请求的1677805568KB堆的并行垃圾收集分配52431424KB位图

错误:无法创建Java虚拟机

错误:发生致命异常。程序将退出


希望这个解释能有所帮助。

如果您使用IntelliJ Idea作为IDE,您可以直接从它来完成这项工作

  • 从主菜单中,选择帮助|更改内存设置
  • 设置要分配的必要内存量,然后单击“保存并重新启动”

  • 这将更改JVM使用的-Xmx选项的值,并使用新设置重新启动IntelliJ IDEA。

    这一回答一点也不坏,可能只是解释了
    Xmx
    Xms
    是什么。。。一加七如果您强制分配更多内存,例如通过
    -Xms
    ,这并不意味着JVM将使用它。如果应用程序不需要它,就没有办法强迫它使用它(如果可能的话,这有什么意义?)。事实上,我在Java堆空间上遇到了内存错误,不管我指定的是3GB,而且我的Java进程在崩溃之前不能占用超过2GB的内存。@Brother这意味着您没有在完全64位的环境中运行。这就是为什么技术文章中应该始终包含日期的原因。我不知道这篇文章是过时的还是完全错误的,但不管是哪种情况,它对于32位系统都是错误的。但无论如何,如果JVM在指定
    -Xmx3072m
    选项时启动,它确实支持3GiB堆。如果使用的内存不超过2000MB,那么应用程序就不需要更多的RAM。JVM应该怎么做,用虚拟对象填充堆以获得更高的利用率?感谢您的命令,我已经在我的机器上测试了它,我可以看到“java-Xmx650-version”和650以上的输出为我提供了错误。