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

标签 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 - 改变操作系统目前也不是一个可行的选择。

最佳答案

同意 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。如果你在你的应用程序中使用任何类型的 native 库,你必须将它们重新编译为 64 位,但这比尝试重新设置 dll 和东西以最大化你在 32 位 Windows 上可以获得的内存要容易得多.

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

关于java - 查看/解决 Windows XP 内存碎片的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/103622/

相关文章:

java - 将年份与数据库中日期的年份部分进行比较

c++ - QTreeView、QItemDelegate 和刷新其他项目?

c++ - 使用来自不同线程的 postthreadmessage()

python - 这是内存泄漏吗(python 中带有 sqlalchemy/sqlite 的程序)

c++ - 计算 Linux 上一组进程使用的内存

java - Android中如何设置播放歌曲的持续时间?

java - 使用继承定义 nxn 矩阵

java - 如何将所有这些索引放入 char 数组?

windows - 编译已安装软件列表时卸载注册表项中的重复条目

python - Django:上传的文件没有被垃圾收集,导致内存问题