【发布时间】:2023-03-21 04:30:01
【问题描述】:
如何确定仅在 java 中引用对象的内存使用情况? IE。在 Java 应用程序运行期间从内存使用中排除“死”对象。
我想显示此信息并在达到某个阈值时触发警报。我还想用它来测量将文件导入我的应用程序时占用了多少内存。
我的应用程序包含许多同时运行的进程,其中一个进程将文件导入内存,然后导入数据库。如果我使用 Runtime.getRuntime.freeMemory 或 MemoryPoolMXBean 并在所有其他进程都在运行的情况下测量内存使用情况,那么由于这些进程以及 GC 没有“实时”运行,内存使用情况会不断上升对象以及引用的对象。对我来说,这并不能清楚地表明当时是什么占用了内存。
有没有办法在任何时候确定被引用对象使用的内存?
【问题讨论】:
-
仅检测“活动对象”的内存与运行垃圾收集器的成本一样高。 JVM 不会一直进行垃圾收集,而只是间隔进行垃圾收集,这是有充分理由的。所以我想对于真正的应用来说,不会有令人满意的解决方案。
-
感谢您的回复,但看来我要求的是“天上掉馅饼”。我发现无论您查看哪个内存池(Eden、Survivor、Old Gen),内存使用率都会变得非常高,如果在内存达到某个阈值时触发了某个事件,则可能是错误的警报,因为 GC 尚未启动。
-
不要监视特定的池,只监视the entire heap 的提交内存大小。保证在增加该数量之前执行垃圾收集。所以当这个值超过一个阈值时(只要它不是由启动选项预先分配的)你可以确定它不是一个误报。
标签: java memory memory-management