【问题标题】:How to get free memory info from Java如何从 Java 中获取空闲内存信息
【发布时间】:2009-05-01 18:47:13
【问题描述】:

我使用以下几行来获取 Java 的内存使用情况:

Free_Memory=Run_Time.freeMemory()/1048576;           // 1024 x 1024 = 1K x 1K = 1Meg
Total_Memory=Run_Time.totalMemory()/1048576;         // 992 Total on a 4 GB PC

我得到的 Free_Memory 是 : 900,但还差得很远,当 Free_Memory 下降到 600 左右时,我的程序内存不足并产生堆溢出消息。

于是我查看了 => Windows 任务管理器:性能:物理内存:空闲,下降到 1、2 或 0,这更准确地反映了我的内存情况,据此,我的总内存是: 4089 是正确的,而 Java 的 Total_Memory=992 是不正确的。

所以,我现在的问题是:在我的 Java 程序中,如何获得反映在 Windows 任务管理器中的内存使用数字:性能:物理内存?我需要依赖这些数字。

【问题讨论】:

  • 这些数字并非“不正确”,只是没有报告您认为他们报告的内容。
  • 然后帮助他了解他们报告的内容。这样的评论太没用了。 Runtime.freeMemory 报告 Java VM 可用的内存量,而不是系统本身。
  • 对不起,克里斯·范恩。我已经发布了一个答案并将其删除,然后我认为至少其中一部分可能会有所帮助,所以我发表了评论。但是我不确定为什么当 freeMemory() 仍然报告 600 MB 可用时他的内存不足。
  • 我也研究了 MXBean,但我找不到如何从中获取可用的内存信息。

标签: java memory


【解决方案1】:

JVM 不允许 Java 消耗所有可用的系统内存。相反,JVM 会抓取一个固定的块并在该块中分配所有对象。如果这个区域被填满,你就没有内存了!有命令行选项可以交替使用 JVM 的最大/初始内存使用量。

更重要的问题是您不应该依赖于跟踪空闲/最大内存。你在做什么依赖于跟踪记忆?

更新:

如果您需要超过 1.5GB 的内存,请尝试 64 位

如果您尝试跟踪内存耗尽,请考虑了解我们的程序为什么会这样做,以及是否可以通过不同的算法或更好的对象管理来防止它。当内存达到零时,您希望做什么?弹出一个对话框并告诉用户他们搞砸了并退出程序?我可以理解感谢关闭,但警告用户使用大 -Xmx 运行不会削减它。

【讨论】:

  • 我想要那个信息,这样我就可以看到我的程序在接近 0 可用空间的情况下运行,并相应地修改它。我的 PC 上有 4 GB,但如果我分配的内存超过 -Xmx1570M,它将不允许,是因为我运行的是 32 位版本的 Java 吗?如果我运行 64 位版本的 Java,它会允许更多空间吗?我的系统上有 64 位的 Vista。
  • 是的,32 位 java 不会使用超过 1.5gb。尝试 64 位 java。
  • 因为我有100天的数据需要分析,但是由于我没有足够的内存,我只能消耗10天,所以我需要知道我能做到多低去吧,如果我可以再添加一天的数据,如果是这样,那就增加了 10%,相当多。 64 位 Java 的最大内存限制是多少?
  • @basszero 64 位 Java 的最大内存限制是多少?
【解决方案2】:

如果您想要详细的 Windows 统计信息,可以使用 WMI 和 .vbs 脚本,通过 cscript.exe 执行。

This link 详细介绍了一个脚本,该脚本可以提取比您可能想要的更详细的内存统计信息。

通过通常的流程/运行时组合执行此操作,然后简单地回读您需要的数字。这些是系统级别的统计信息,不适用于 VM(尽管 WMI 也可以拉回每个进程的统计信息)。

【讨论】:

  • 听起来不错,但如果您可以发布一些示例行来说明如何做到这一点,它会更有帮助。我不熟悉任何脚本。另外,cscript.exe 是 Vista 系统文件的一部分吗?
  • 我以前用过这个,但恐怕我手头没有例子。所以我会有一个谷歌。对不起 - 如果我有例子,我很乐意把它们贴出来。我过去使用过这种机制,效果很好
  • cscript.exe 是免费提供的,但我认为我必须将它打包到我的可部署 .jar 中,因为它可能是从 Microsoft 额外下载的。不过看起来它可以在 Vista 上使用 - programchecker.com/file/32638.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多