java - 64 位 Windows 上的 32 位 JVM 在使用 -Xmx1300m 和大量可用内存启动时崩溃

标签 java jvm

我正在为 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/

相关文章:

java - 在 Java 中安排特定时间的事情?

Java:如何实现独立于java组件的isKeyDown()功能?

java - Jersey 响应 HTTP 400 Bad Requests,毫 headless 绪

java - 什么是类的 GC 根?

java - heap为什么要分为Eden、Survivor spaces和Old Generation?

java - 从java应用程序运行在vmware工作站中创建的VM

java - 使用扫描仪类读取 txt 文件时会出现 InputMismatchException。我究竟做错了什么?

java - 如何用 Java 编写正确的微基准测试?

java - 运行 java -cp 和实现类加载器之间的区别

java - 最高效的 Java 线程技术?