代码之家  ›  专栏  ›  技术社区  ›  SteveDonie

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

  •  6
  • SteveDonie  · 技术社区  · 17 年前

    我们有一个需要大量堆空间的java程序,我们以参数-Xmx1500m(以及其他命令行参数)启动它,该参数指定了最大堆空间为1500MB。在刚重新启动的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 回复  |  直到 9 年前
        1
  •  2
  •   John Gardner    17 年前

    同意Torlack的观点,这在很大程度上是因为其他DLL被加载并进入某些位置,将VM可以获得的内存量分解为一大块。

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

    如果你的java应用程序真的需要超过1.2G的内存,最好的选择是使用64位windows、linux或OSX。如果你在应用程序中使用任何类型的原生库,你都必须将其重新编译为64位,但这比试图重新建立dll和其他东西的基础以最大限度地利用32位窗口上的内存要容易得多。

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

        2
  •  2
  •   Torlack    17 年前

    除非页面文件空间不足,否则问题不在于计算机内存不足。虚拟内存的全部意义在于允许进程使用比物理上可用的更多的虚拟内存。

    不知道JVM是如何处理堆的,很难确切地说问题是什么,但一个常见的问题是,进程中没有足够的连续可用地址空间来扩展堆。为什么机器运行一段时间后会出现问题有点令人困惑。

    我在工作中一直在研究类似的问题。我发现使用WinDBG运行程序并使用“!address”和“!address-summary”命令对于追踪进程虚拟地址空间碎片化的原因非常有价值。您还可以尝试在重新启动后运行程序,并使用“!address”命令拍摄地址空间的照片,然后在程序不再运行时执行相同的操作。这可能会让你了解这个问题。也许加载额外的DLL这样简单的事情可能会导致问题。

        3
  •  2
  •   Community Mohan Dere    9 年前

    我怀疑问题是Windows内存碎片。StackOverflow上还有一个问题叫做 Java Maximum Memory on Windows XP 其中提到使用Process Explorer查看DLL映射到内存的位置,然后通过重定DLL的大小来解决问题,以便以更紧凑的方式加载到内存中。

        4
  •  0
  •   kulakli    17 年前

    使用Minimem( http://minimem.kerkia.net/ )因为该应用程序可能会解决您的问题。然而,我不确定这是你要找的答案。我希望这能有所帮助。

        5
  •  0
  •   Okami    17 年前

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

        6
  •  0
  •   jey burrows    14 年前

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