如何从Java获取可用内存信息

时间:2009-05-01 18:47:14

标签: java memory

我使用以下行来获取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任务管理器中反映的内存使用数:性能:物理内存?我需要依赖这些数字。

2 个答案:

答案 0 :(得分:2)

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

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

更新:

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

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

答案 1 :(得分:1)

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

This link详细说明了一个脚本,它可以提供比您想要的更详细的内存统计信息。

通过常用的Process / Runtime组合执行此操作,并简单回读您需要的数字。这些是系统级统计信息,而不是VM(尽管WMI也可以撤回每个进程的统计信息)。