我正在努力使用Java堆空间设置.Windows上的默认Java是32位客户端,与操作系统版本无关(这是Oracle向所有用户推荐的).它似乎默认将最大堆大小设置为256 MB,这对我来说太少了.
我使用自定义启动器来启动应用程序.我希望它在具有大量RAM的计算机上使用更多内存,并且默认-Xmx512m使用RAM较少的内存.据我所知,唯一的方法是静态-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
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?可能是因为32位JVM只能解决"第一"4G内存问题,并且必须在前4 GB内提供1300M块?
除了要求每个人安装64位Java(不太可能接受)之外,我该如何解决这个问题?
编辑:如果它很重要,它是一个胖的Swing客户端,而不是一个小程序.
这不是内存的问题,而是地址空间的问题。
对于 32 位进程理论上可寻址的 4 GB (2^32),必须考虑到操作系统内核需要该地址空间的一部分(显然进程无法触及)这一事实。
当您使用 Java 时,进程本身的地址空间java在堆、permgen、本机资源、JVM 本身等之间进一步划分。
您使用的是 64 位操作系统。运行 64 位 JVM。您的字节码(即所有罐子)将运行相同。没有理由使用 32 位 JVM!