如何监控java中的可用内存(包括缓冲区和缓存)?

如何监控java中的可用内存(包括缓冲区和缓存)?,java,monitoring,Java,Monitoring,我已经在寻找可能的解决方案,例如。但在缓冲区和缓存中花费的内存在哪里都没有提到 例如,在linux上,输出: 缓存的可用共享缓冲区总数 成员:2011 18351750 309847 -/+缓冲区/高速缓存:6781333 掉期:1998年至1998年 我已经测试了的输出,它报告的可用内存为175MB 这个问题的原因是如何检测操作系统何时内存不足?在以前的free-m输出中,175mb似乎很低;但通过添加缓冲区和缓存,很明显可用内存实际上是2GB中的1333MB 总之,使用java,是否可以获得

我已经在寻找可能的解决方案,例如。但在缓冲区和缓存中花费的内存在哪里都没有提到

例如,在linux上,输出:

缓存的可用共享缓冲区总数 成员:2011 18351750 309847 -/+缓冲区/高速缓存:6781333 掉期:1998年至1998年 我已经测试了的输出,它报告的可用内存为175MB

这个问题的原因是如何检测操作系统何时内存不足?在以前的
free-m
输出中,175mb似乎很低;但通过添加缓冲区和缓存,很明显可用内存实际上是2GB中的1333MB


总之,使用java,是否可以获得1333MB的值作为可用内存的值?正如我已经提到的,到目前为止,我只知道如何获得175 MB的值。

我不知道如何直接获得可用内存,但JVM维护JMX bean,我相信它包含以下信息和更多信息:

如果您试图获取操作系统本身(而不是JVM)的内存统计信息,您可以使用或直接对操作系统进行特定于平台的本机API调用。

我确信不可能使用Java API获取cahce/buffers编号。即使是来自JNI的家伙也会使用JNI包装器和本机系统调用…

因为答案可能是特定于操作系统的,所以您可能需要指定需要支持的操作系统。只是Linux?嗯,目标是Linux,但我更喜欢它是否是一个跨平台的解决方案。我手头没有windows机器可以检查,所以我不知道windows是否也会单独报告缓存/缓冲内存。欢迎Windows专家:从我收集的数据来看,根据显示Windows任务管理器的图片,Windows还将总内存、可用内存和缓存内存分开。如图所示,JMX可以提供以下信息:JVM占用的内存大小、操作系统中的总内存和可用内存(无缓冲区和缓存)。一切都好。但仍然没有提到在缓冲区和缓存上花费的内存。缓存内存可以在需要时快速回收。如果您试图获得特定类、包等上所用内存的细粒度详细信息,我认为您实际上需要一个探查器,而不仅仅是一个JMX监视器。除非您感兴趣的类有自己的MBean向JMX提供这些东西。我们似乎有点偏离了方向。我不需要在java类或包上花费任何特定内存。非java方式,使用系统命令(
free
),我可以测量整个操作系统的可用内存,这样的测量显示有无缓冲区/缓存的可用内存。我想知道如何用java来做。哦,对不起。我不知道如何从linux上的free命令中获得关于正在运行的JVM的详细信息。不过,JMX和分析器是JVM中的详细信息。祝你好运 total used free shared buffers cached Mem: 2011 1835 175 0 309 847 -/+ buffers/cache: 678 1333 Swap: 1998 0 1998