查看/解决Windows XP内存碎片的工具
我们有一个需要大量堆空间的java程序 - 我们用(其中包括命令行参数)参数-Xmx1500m启动它,它指定最大堆空间1500 MB。在刚刚重新启动的Windows XP盒子上启动该程序时,它将启动并运行,没有问题。但是,如果该程序已运行了好几次,计算机已经运行了一段时间,等等,当它试图启动我得到这个错误:查看/解决Windows XP内存碎片的工具
Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
我怀疑Windows本身是由内存碎片的痛苦,但我不知道如何证实这种怀疑。在发生这种情况时,任务管理器和sysinternals procexp报告2000MB空闲内存。我曾看过this question related to internal fragmentation
所以第一个问题是,如何确认我的怀疑? 第二个问题是,如果我的怀疑是正确的,是否有人知道任何工具来解决这个问题?我环顾四周,但除了定期重启机器,我还没有发现任何有用的东西。
ps - 更改操作系统目前也不是可行的选择。
与Torlack一致,这很大程度上是因为其他DLL正在被加载并进入某些位置,从而在一个大块中分割虚拟机的内存量。
你可以在WinXP一些工作,如果你有超过3G的内存多拿一些窗户的东西搬来搬去,在这里查找PAE: http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx
你最好的选择,如果你真的需要超过1.2G内存为您的Java应用程序,是看在64位窗口或Linux或OSX。如果你在你的应用中使用任何类型的本地库,你将不得不重新编译它们为64位,但它会比试图重新设计DLL和东西来最大限度地提高你在32位窗口中获得的内存要容易得多。
另一种选择是将程序分成多个虚拟机,并让它们通过RMI或消息传递等方式与彼此通信。这样每个虚拟机可以拥有你需要的内存的一部分。不知道你的应用程序做什么,我不知道这将有助于以任何方式,虽然...
也许你应该考虑启动程序并预留内存,而不是在每次运行后终止虚拟机。寻找不同的GC选项并释放你的对象。
除非您的页面文件空间不足,否则此问题不是计算机内存不足。虚拟内存的全部重点是允许进程使用比物理上可用的更多的虚拟内存。
不知道JVM如何处理堆,这是一个有点很难说的到底是什么问题,但常见的问题之一是,有没有足够的可用的连续可用地址空间的过程中,使堆被延伸。为什么在机器运行一段时间后这会成为一个问题,这有点令人困惑。
我一直在研究类似的问题。我发现使用WinDBG运行程序并使用“!address”和“!address -summary”命令在追踪进程虚拟地址空间碎片化的原因方面具有无可估量的价值。您也可以尝试重新启动后运行程序,并使用“!address”命令拍摄地址空间的图片,然后在程序不再运行时执行相同操作。这可能会帮助你解决问题。也许简单的一个额外的DLL加载可能会导致问题。
我怀疑问题是Windows内存碎片。 StackOverflow的另一个问题叫做Java Maximum Memory on Windows XP,它提到使用Process Explorer来查看DLL映射到内存的位置,然后通过重新绑定DLL来解决问题,以便以更紧凑的方式加载到内存中。
使用来自微软SysInternals工具的vmmap来查看虚拟地址空间的碎片,并确定是什么破坏了空间