用于查看/解决Windows XP内存碎片的工具

时间:2008-09-19 16:48:06

标签: java windows memory memory-management windows-xp

我们有一个需要大量堆空间的java程序 - 我们从(在其他命令行参数中)启动参数-Xmx1500m,它指定最大堆空间为1500 MB。在刚刚重新启动的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 - 改变操作系统目前也不是一个可行的选择。

6 个答案:

答案 0 :(得分:2)

除非您的页面文件空间不足,否则问题不在于计算机内存不足。虚拟内存的重点是允许进程使用比实际可用虚拟内存更多的虚拟内存。

不知道JVM如何处理堆,有点难以确切地说出问题是什么,但常见问题之一是流程中没有足够的连续可用地址空间来允许堆待延长为什么在机器运行一段时间后这会出现问题有点令人困惑。

我在工作中一直在研究类似的问题。我发现使用WinDBG运行程序并使用“!address”和“!address -summary”命令对于跟踪进程的虚拟地址空间变得支离破碎的原因非常有用。您也可以尝试在重新启动后运行程序,并使用“!address”命令拍摄地址空间的图片,然后在程序不再运行时执行相同的操作。这可能会让你知道这个问题。也许简单的东西作为额外的DLL加载可能会导致问题。

答案 1 :(得分:2)

同意Torlack,其中很多是因为其他DLL正在加载并进入某些位置,从而在一个大块中分解了VM可以获得的内存量。

你可以在WinXP上做一些工作,如果你有超过3G的内存来移动一些windows的东西,请在这里查找PAE: http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx

你最好的选择,如果你的java应用程序确实需要超过1.2G的内存,那就是看64位windows或linux或OSX。如果你在你的应用程序中使用任何类型的本机库,你将不得不重新编译它们64位,但它比试图改变dll和东西要容易得多,以最大限度地提高32位窗口的内存

另一种选择是将程序拆分为多个虚拟机,并让它们通过RMI或消息或其他方式相互通信。这样每个VM都可以拥有您需要的内存的一些子集。不知道你的应用程序做了什么,我不确定这会有什么帮助,不过......

答案 2 :(得分:2)

我怀疑问题是Windows内存碎片。这里有一个名为Java Maximum Memory on Windows XP的StackOverflow上的另一个问题,提到使用Process Explorer来查看DLL映射到内存的位置,然后通过重新定义DLL来解决问题,以便以更紧凑的方式加载到内存中。 / p>

答案 3 :(得分:0)

对该应用程序使用Minimem(http://minimem.kerkia.net/)可能会解决您的问题。但是,我不确定这是你正在寻找的答案。我希望它有所帮助。

答案 4 :(得分:0)

也许你应该考虑启动程序并保留内存而不是 每次运行后结束VM。寻找不同的GC选项并释放您的对象。

答案 5 :(得分:0)

使用Microsoft的SysInternals工具中的vmmap查看虚拟地址空间的碎片,并确定是什么打破了空间