在Windows 7 32位中强制Java VM的内存分配


0

如何启动具有大型最大堆的Java程序?

我使用用Java编写的内存耗尽程序(CrashPlan),有时在高峰使用时需要大约1.5 GB的内存(这由参数-Xmx1500M控制)。

通常(并且至少在启动时)它需要非常少的内存,但是在低于-Xmx1500M的任何内存时它会在峰值使用时崩溃。启动后(使用-Xmx1000M),任务管理器在工作集,专用集和分配的内存中显示其内存使用量约为100 MB。

但是,Java VM无法以-Xmx1500M启动,我猜是因为它无法分配此内存。(使用-Xmx1000M它会启动,但稍后会崩溃。)

我使用Windows 7专业版32位(不是64位),安装了32 GB内存(3 GB可访问,并且页面文件位于无法访问内存的大RAM磁盘上)。

我希望Windows能够交换其他进程以便为Java分配内存,并且由于Java无论如何都不使用它,因此会将Java未使用的内存交换为页面文件。说,现在我看到mydefrag进程使用1700 MB分配集没有问题。

(直到上周,它似乎都是这样工作的。然后发生了一些变化。)

如何强制Java以-Xmx1500M开头?


你使用的语法应该将堆设置为给定的大小?您需要确定无法分配内存的原因。您安装了32 GB的内存,但是您使用的是32位操作系统,完全没有任何意义。32位操作系统上的32位应用程序仅限于可以分配的内存量,1.5GB实际上非常接近该限制。
Ramhound 2016年

一定要设置-Xmx和-Xms。当然我怀疑我们的程序崩溃的原因是因为系统无法在你的PC启动时为应用程序分配1.5GB,因为系统需要内存因此程序崩溃。
Ramhound 2016年

@Ramhound谢谢!由于兼容性,我现在更喜欢32位系统; 我将剩余的RAM用于页面文件,temp和readyboost。虽然1.5 GB是“接近”(是吗?)到2 GB,但为什么我不能得到它?正如我所说,现在我看到MyDefrag使用1.7 GB没有问题。是的,我设置-Xms30M,但它如何影响VM的启动能力?
Alexander Gelbukh 2016年

“VM”是指Java虚拟机吗?请使用精确的陈述。
Ramhound 2016年

@Ramhound准确地说,我不知道。我有一个CrashPlan服务,我相信它是用Java编写的。当我在.ini文件中设置-Xmx1500M并按下Services.msc中的“运行服务”按钮时,服务启动并立即停止,没有记录错误消息(我猜它甚至没有机会打开日志文件)。当我设置-Xmx1000M时,服务运行,但在几个小时内停止在其日志文件中出现OutOfMemory错误消息。我这是一个问题,Java虚拟机没有从Windows获得足够的内存启动,但我不能肯定地说。
Alexander Gelbukh 2016年

Answers:


1

正如您已经意识到,用户进程的可寻址内存在32位窗口上限制为2GB(4GB地址空间的一半是为操作系统保留的)。但是你还必须考虑到堆内存不是Java-VM使用的唯一内存类型:还有对本机内存分配,堆栈空间,perm-gen,代码缓存等的要求。所有这些都有来自相同的2GB可用。因此,确切的最大堆大小可能在java版本之间变化(甚至可能在不同的计算机之间),但根据Oracle的说法

在大多数现代32位Windows系统上,最大堆大小范围为1.4G到1.6G。

因此,对于需要1.5 GB堆的任何东西,您可能在32位JVM(以及32位操作系统)上运气不佳。

您可以通过减少其他内存池来获得一些额外的MB,例如通过设置-XX:ReservedCodeCacheSize(默认为32m)或-XX:MaxPermSize(默认为64m),但这可能会在运行应用程序时导致其他问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.