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

问题描述:

什么是最大堆运行大小为上运行的Java进程Windows 10 64位,与64位JVM?我的机器有RAM的8 GB。我正在运行Java 8。 我试图在巨大的图上运行BFS以用于实验目的。在运行BFS时,我正在监视在Java Visual VM中使用的堆大小。根据视觉VM堆利用率始终低于2000 MB,无论提供以下JVM的参数在Windows 10 64位运行64位JVM中使用Java进程的最大堆大小

-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进程可以使用多于2 GB的内存吗? As Guidelines for Java Heap sizing Windows XP/2008/7的限制为2 GB。

谢谢 兄弟

+0

这就是为什么技术文章应该总是有一个日期。我不知道这篇文章是过时还是错误,但无论如何,这对32位系统来说甚至是错误的。但无论如何,如果您在指定'-Xmx3072m'选项时启动JVM,则它支持3GiB堆。如果它不超过2000MB,那么你的应用程序根本不需要更多的RAM。 JVM应该做什么,用虚拟对象填充堆以获得更高的利用率? – Holger

在64位机,64位JVM可以多技嘉堆(数十座金紫荆星章的)工作。除了可用内存(以及64位指针的理论地址空间)之外,我不确定它是否受到任何限制。

当然,如果您正在处理一个巨大的堆,GC还有很多工作要做,您可能会发现需要水平缩放而不是垂直缩放,以保持良好的性能。

如果VisualVM未显示使用超过2GB(初始堆大小为-Xms),那么它可能只是不需要更多。您已授权使用,最大为 3GB(-Xmx),但JVM不会为了它的乐趣而分配更多内存。

+0

这根本就不是一个错误的答案,*可能是*只是解释'Xmx'和'Xms'是什么......一个加上 – Eugene

+0

即使你执行更多内存的*分配*通过'-Xms',它并不意味着JVM将*使用*它。如果应用程序不需要它,那么就没有办法强制它使用它(如果可能的话,它的意义在哪里?)。 – Holger

+0

实际上,我得到了** Java堆空间**上的** OutOfMemoryError **,无论我指定3GB并且我的java进程在崩溃之前都不能占用超过2GB的事实。 – Brother

可以为32位JVM分配最大堆数为2^32 = 4G,再次将4GB分配为1+ GB以供VM用于运行时类。它变化的Windows大约是2GB,而linux是大约3GB。 由于您使用64位机器,可用的最大堆数为2^64,因此您可以轻松地运行BFS。

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

+0

我会尝试你提供的vm标志。谢谢 – Brother

没有确定的大小,您可以指定64位体系结构,但简单的测试可以帮助您找到什么是最大的连续空间可用或可以分配给一个进程。这可以通过使用简单命令进行如下测试。 请尝试如下 java -Xmx -version 如果上述命令给出了结果,那么系统可能被允许将Xmx设置为该级别,如果失败则不能指定该值。

很少从系统测试。 我用20G.40g,100G,160G,300G测试了这些值,所有这些给出了java -version输出,但是用1600G尝试了抛出错误。测试的 输出 C:\用户\ mpalanis>的java -Xmx300G -version

Java版本 “1.7.0_80” 的Java(TM)SE运行时环境(建立1.7.0_80-B15) 爪哇热点(TM )64位服务器虚拟机(版本24。80-B11,混合模式)

C:\用户\ mpalanis>的java -Xmx1600G VM 无法分配52431424KB位图平行垃圾收集所请求的1677805568KB堆的初始化过程中出现-version

错误。

错误:无法创建Java虚拟机。

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

希望这个解释有帮助。

+0

感谢您的命令,我已经在我的机器上测试过它,并且可以看到'java -Xmx650 -version'的输出,并且超过650会给我带来错误。 – Brother