我们如何在JVM中找到类的所有示例的大小?对一个通用的编程解决方案感兴趣,该解决方案可以用作库,并且不使用jstat
或需要修改原始源代码的引用计数。
List<ReferenceType> classes = vm.classesByName(klass.getName());
List<ObjectReference> objectReferences = classes.get(0).instances(Long.MAX_VALUE);
使用上面的代码可以获得所有ObjectReference
(s)到特定类的对象。理想情况下,我们应该能够从对象引用中获取对象,并使用JOL调用VM.current().sizeOf(Object obj)
(https://github.com/openjdk/jol).一旦我遍历了所有的对象引用,我将得到类的对象所占用的总大小。我没有找到从ObjectReference
获取Object
的文档。
看起来Eclipse(https://help.eclipse.org/2022-12/index.jsp)和IntelliJ IDEA(https://www.jetbrains.com/help/idea/analyze-objects-in-the-jvm-heap.html)都可以获取对象并计算任何类的“保留大小”。
1条答案
按热度按时间kqlmhetl1#
在Java中,对象通常被分配到堆上。因此,无需修改应用程序,您就可以获取堆转储并分析它。在SO中有一些问题和答案,例如
但是,与其从头开始在应用程序内部创建解决方案,您可能需要研究Application Performance Monitoring工具,这些工具可以轻松地附加到任何应用程序,因此是可重用的,以下是此类工具的不完整列表。