【问题标题】:How do I determine active memory usage in Java如何确定 Java 中的活动内存使用情况
【发布时间】: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


【解决方案1】:

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

他们让您监控应用程序,但我不确定您如何在自己的应用程序中执行此操作以在内存不足时触发警报。

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

我找到了一篇关于如何查询 Java 对象大小的好文章。它有点长,所以我不能在这里发布任何内容。但是,这里是链接:http://www.javamex.com/tutorials/memory/instrumentation.shtml 这是一个关于同一主题的 SO 问题determining java memory usage

点击查看:
JConsole
VisualVM

【讨论】:

    【解决方案2】:

    你可以使用eclipse memory analyzer MAT

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2018-01-12
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2017-06-17
      • 2014-12-03
      • 1970-01-01
      相关资源
      最近更新 更多