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

如何从Java获取可用内存信息,java,memory,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 我得到的空闲内存是:900,但这是一个很大的差距,当空闲内存下降到大约600时,我的程序内存不足并生成堆溢出消息 因此,我查

我使用以下几行来获取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
我得到的空闲内存是:900,但这是一个很大的差距,当空闲内存下降到大约600时,我的程序内存不足并生成堆溢出消息

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


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

JVM不允许Java消耗所有可用的系统内存。相反,JVM获取一个固定块,并在该块中分配所有对象。如果此区域已满,则表示您的内存不足!有一些命令行选项可以替代JVM的最大/初始内存使用

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

更新:

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


如果你试图跟踪内存耗尽,那么考虑一下为什么你的程序这么做,如果它可以通过不同的算法或更好的对象管理来防止。当内存为零时,您希望做什么?弹出一个对话框,告诉用户他们完蛋了,然后退出程序?我可以理解感激的关闭,但警告用户使用大型计算机运行-Xmx不会阻止它。

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

详细说明一个脚本,它获取比您可能需要的更详细的内存统计信息


通过通常的进程/运行时组合执行此操作,只需读回所需的数字即可。这些是系统级统计数据,不适用于VM(尽管WMI也可以收回每个进程的统计数据)。

这些数字不是“不正确”,只是没有报告您认为他们报告的内容。然后帮助他了解他们报告的内容。像那样的评论是毫无用处的。Runtime.freemory报告Java VM可用的内存量,而不是系统本身。对不起,Chris Vann。我已经发布了一个答案并将其删除,然后我认为至少有一部分可能会有所帮助,所以我发布了一条评论。但我不确定为什么freeMemory()报告的可用空间仍为600 MB时,他会耗尽内存。我也查看了MXBean,但找不到如何从中获取可用内存信息。我需要这些信息,以便查看我的程序运行到0可用空间的距离,并相应地修改它。我的PC上有4GB,但如果我分配的内存超过-Xmx1570M,它将不允许,这是因为我运行的是32位版本的Java吗?如果我运行64位版本的Java,它会允许更多的空间吗?我的系统上有64位Vista。是的,32位java不会使用超过1.5gb的内存。试试64位java。这是因为我有100天的数据需要分析,但由于我没有足够的内存,我只能消耗10天的时间,所以我需要知道我能消耗的时间有多少,以及我是否可以再增加一天的数据,如果是的话,这是10%的增长,相当多。64位Java上的最大内存限制是多少?@basszero 64位Java上的最大内存限制是多少?听起来不错,但如果您能发布一些关于如何实现的示例行,这将更有帮助。我不熟悉任何脚本。还有,cscript.exe是Vista系统文件的一部分吗?我以前用过这个,但恐怕手头没有示例。所以我会有一个谷歌。对不起,如果我有一些例子,我很乐意把它们贴上去。我在过去使用过这种机制,它工作得很好。cscript.exe是免费提供的,但我想我必须将它打包到我的deployable.jar中,因为它可能是从Microsoft额外下载的。不过,它看起来在Vista上可用-