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

Java 查看/解决Windows XP内存碎片的工具,java,windows,memory,memory-management,windows-xp,Java,Windows,Memory,Memory Management,Windows Xp,我们有一个需要大量堆空间的java程序——我们从参数Xmx1500m(以及其他命令行参数)开始,该参数指定了1500MB的最大堆空间。在刚刚重新启动的Windows XP设备上启动此程序时,它将启动并运行,不会出现任何问题。但是如果程序已经运行了好几次,计算机已经运行了一段时间,等等,当它试图启动时,我会得到以下错误: Error occurred during initialization of VM Could not reserve enough space for object heap

我们有一个需要大量堆空间的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. 初始化VM时出错 无法为对象堆保留足够的空间 无法创建Java虚拟机。 我怀疑Windows本身存在内存碎片问题,但我不知道如何证实这种怀疑。发生这种情况时,任务管理器和sysinternals procexp报告2000MB的可用内存。我看过

所以第一个问题是,我如何证实我的怀疑? 第二个问题是,如果我的怀疑是正确的,有人知道解决这个问题的工具吗?我已经环顾了很多地方,但除了定期重新启动机器之外,我没有发现任何有帮助的东西


ps-改变操作系统目前也不是一个可行的选择

对该应用程序使用Minimem()可能会解决您的问题。然而,我不确定这是否是你想要的答案。我希望它有帮助。

< P>也许你应该考虑开始这个程序,保留记忆,而不是。
每次运行后结束VM。寻找不同的GC选项并释放您的对象。

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

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


我在工作中也遇到过类似的问题。我发现,使用WinDBG运行该程序并使用“!address”和“!address-summary”命令在跟踪进程的虚拟地址空间变得支离破碎的原因方面是非常宝贵的。您还可以尝试在重新启动后运行程序,并使用“!address”命令拍摄地址空间的照片,然后在程序不再运行时执行相同操作。这可能是你了解这个问题的线索。可能是一些简单的事情,比如加载一个额外的DLL,可能会导致问题。

同意Torlack的观点,这在很大程度上是因为其他DLL正在加载并进入某些位置,将VM的内存量分散在一个大块中

如果你有超过3G的内存来移动一些windows的东西,你可以在WinXP上做一些工作,在这里查阅PAE:

如果您的java应用程序确实需要超过1.2G的内存,那么最好的选择就是使用64位windows、linux或OSX。如果你在应用程序中使用任何类型的本机库,你必须重新编译64位的本机库,但这要比重新设置DLL和其他库的基址以最大化32位windows上的内存容易得多


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

我怀疑问题在于Windows内存碎片。关于StackOverflow还有一个问题,它提到使用Process Explorer查看DLL映射到内存的位置,然后通过重新设置DLL的位置来解决问题,以便以更紧凑的方式加载到内存中。

使用Microsoft SysInternals工具中的vmmap查看虚拟地址空间的碎片,找出是什么打破了这个空间