【发布时间】:2021-07-12 21:11:17
【问题描述】:
我如何以编程方式(从 java 应用程序/代理中)获得堆中最大对象的“实时”摘要(包括它们的实例数和大小)?
类似于 Profiler 的工作。
例如,下面是 JProfiler 的截图:
通常我在真正需要的情况下使用堆转储,但现在我想弄清楚探查器如何在不实际进行堆转储的情况下从正在运行的 JVM 中检索此类信息。
是否可以使用 Java API 获取此类信息?如果不可能,本机代码中的替代方案是什么?代码示例最适合我的需求,因为 java 世界的这个特定部分对我来说真的很新。
我有点相信,如果我有兴趣找到一些真正具体的类的信息,我可以使用检测或其他东西,但据我所知,它使用采样,所以应该有另一种方式。
我目前正在使用在 Linux 上运行 java 8 的 HotSpot VM,但是我会找到更“通用”的解决方案 - 更好。
【问题讨论】:
-
Java Flight Recorder 公开了一个流式 API。 docs.oracle.com/en/java/javase/16/jfapi/why-use-jfr-api.html
-
使用Java的反射机制(Class类)及其方法获取方法名。正常获取实例计数并占用内存,使用总内存和相关 api 来获取所有对象的总内存。希望这会有所帮助。
标签: java jvm profiling heap-memory profiler