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

6
我们有一个需要大量堆空间的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的可用内存。我已经查看了与内部碎片相关的此问题
所以第一个问题是,如何确认我的怀疑? 第二个问题是,如果我的怀疑是正确的,是否有任何工具可以解决这个问题?我已经搜索了很多,但是我没有找到任何有用的东西,除了定期重新启动机器之外。
PS-更改操作系统目前也不是可行的选择。
6个回答

2
除非你的页面文件空间已经用完,否则这个问题并不是计算机内存不足的问题。虚拟内存的整个目的就是允许进程使用比物理内存更多的虚拟内存。
不知道JVM如何处理堆,很难准确地说出问题所在,但常见问题之一是您的进程中没有足够的连续可用地址空间来扩展堆。为什么在机器运行一段时间后会出现这个问题有点令人困惑。
我在工作中遇到了类似的问题。我发现使用WinDBG运行程序并使用“!address”和“!address -summary”命令对于追踪进程的虚拟地址空间变得分散非常有价值。您也可以尝试在重新启动后运行程序并使用“!address”命令拍摄地址空间的图片,然后在程序无法运行时执行相同的操作。这可能会提示您问题所在。也许只是加载了额外的DLL这样简单的事情就会导致问题。

2

同Torlack一样,很多问题是因为其他DLL被加载并占用了某些内存位置,从而破坏了VM可以获得的一大块内存。

如果您有超过3G的内存,可以在WinXP上进行一些工作,将一些Windows相关内容移动到其他位置,请在此处查找PAE: http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx

如果您确实需要超过1.2G的内存来运行Java应用程序,则最好考虑64位Windows、Linux或OSX。如果您的应用程序使用任何本地库,则必须重新编译它们以支持64位,但这比尝试重新定位dll等来最大化32位Windows上可用内存要容易得多。

另一个选择是将程序拆分成多个VM,并通过RMI或消息传递等方式进行通信。这样,每个VM都可以拥有所需内存的某个子集。不过,如果不知道您的应用程序具体功能,我无法确定这种方法是否有所帮助......


2

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


0
使用Minimem(http://minimem.kerkia.net/)可能会解决你的问题。然而,我不确定这是否是你寻找的答案。希望能对你有所帮助。

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

0
使用微软的SysInternals工具中的vmmap查看虚拟地址空间的碎片化,并确定是什么导致了空间的分裂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接