我正在为 Java 堆空间设置而苦恼。 Windows 上的默认 Java 是 32 位客户端,与操作系统版本无关(这是 Oracle 向所有用户推荐的)。它似乎默认将最大堆大小设置为 256 MB,这对我来说太小了。
我使用自定义启动器来启动应用程序。我希望它在内存充足的计算机上使用更多内存,而在内存较少的计算机上默认使用 -Xmx512m
。据我所知,唯一的方法是静态 -Xmx
设置(必须在启动时设置)。
我有一个拥有 8 GB RAM、64 位 Windows 和 32 位 Java 7 的用户。JVM 可见的最大内存为 4G(通过查询 OperatingSystemMXBean
返回)。我明白为什么,没问题。
出于某种原因,我的应用程序无法为这个使用 -Xmx1300m
的用户启动,即使他有 2.3G 可用内存。他关闭了一些应用程序(有 5G 可用内存),但仍然无法启动。向我报告的错误是:
error occured during init of vm
could not reserve enough space for object heap
这是怎么回事?难道 32 位 JVM 只能寻址“第一个”4G 内存并且必须在前 4 GB 内存中有一个 1300M block 可用吗?
除了要求大家安装64位Java(不太可能接受),我该如何解决这个问题?
编辑:万一重要,它是一个胖 Swing 客户端,而不是一个小程序。
最佳答案
这不是内存问题,而是地址空间的问题。
对于 32 位进程理论上可寻址的 4 GB (2^32),必须考虑到操作系统内核需要该地址空间的一部分(显然进程无法触及)这一事实。
当您使用 Java 时,java
进程本身的地址空间在堆、permgen、 native 资源、JVM 本身等之间被进一步分割。
您使用的是 64 位操作系统。运行 64 位 JVM。您的字节码(即,您所有的 jar)将完全相同地运行。没有理由使用 32 位 JVM!
关于java - 64 位 Windows 上的 32 位 JVM 在使用 -Xmx1300m 和大量可用内存启动时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279981/