如何确定Java中的活动内存使用情况

如何确定Java中的活动内存使用情况,java,memory,memory-management,Java,Memory,Memory Management,如何仅在java中确定引用对象的内存使用情况?在Java应用程序运行期间,从内存使用中排除“死”对象 我想显示此信息,并在达到某个阈值时触发警报。我还想用它来衡量将文件导入应用程序时占用的内存量 我的应用程序由许多进程组成,所有进程同时运行,其中一个进程将文件导入内存,然后导入数据库。如果我使用Runtime.getRuntime.freemory或MemoryPoolMXBean测量内存使用情况,并且所有其他进程都在运行,那么内存使用情况会不断增加,因为这些进程以及GC没有“实时”运行,内存使

如何仅在java中确定引用对象的内存使用情况?在Java应用程序运行期间,从内存使用中排除“死”对象

我想显示此信息,并在达到某个阈值时触发警报。我还想用它来衡量将文件导入应用程序时占用的内存量

我的应用程序由许多进程组成,所有进程同时运行,其中一个进程将文件导入内存,然后导入数据库。如果我使用Runtime.getRuntime.freemory或MemoryPoolMXBean测量内存使用情况,并且所有其他进程都在运行,那么内存使用情况会不断增加,因为这些进程以及GC没有“实时”运行,内存使用情况会描述死对象和引用对象。对于我来说,这并不是一个明确的迹象,说明当时什么在占用内存


有没有一种方法可以确定被引用对象在任何时候使用的内存?

您可以使用。

您可以查看
JConsole
,看看这是否适合您的需要。
还有
VisualVM

他们可以让你监控应用程序,但我不知道你如何在自己的应用程序中做到这一点,一旦内存不足,就会触发警报

此外,如果希望更快地对对象进行垃圾收集,可以使用
WeakReference
SoftReference

我发现了一篇关于如何查询Java对象大小的好文章。它有点长,所以我不能在这里发布任何内容。然而,这里有一个链接:这是一个关于同一主题的问题

点击查看:


仅检测“活动对象”的内存与运行垃圾收集器的成本一样高。JVM不总是进行垃圾收集,而只是每隔一段时间进行垃圾收集,这是有充分理由的。因此,我想对于一个真正的应用程序来说,不会有一个令人满意的解决方案。谢谢你的回答,但我想要的似乎是“天上的馅饼”。我发现内存使用率,无论您查看哪个内存池(Eden、Survivor、Old Gen),都可能非常高,如果在内存确实达到某个阈值时触发事件,则可能是一个错误警报,因为GC尚未启动。不要监视特定的池,只需监视提交的内存大小即可。可以保证在提升该数量之前执行垃圾收集。因此,当该值超过阈值时(只要它不是由启动选项预先分配的),您可以确保它不是假警报。