java - 在 VisualVM/OQL 中,如何获取某个包中对象的所有实例的总大小

标签 java jvisualvm oql

我正在使用 VisualVm 来分析在 Tomcat 中运行的 Web 应用程序。 Tomcat 不断因内存不足错误而崩溃,因此我试图找出应用程序中导致该错误的原因。 当我从 VisualVm 运行内存分析器时,看起来大部分内存都被 String/Char[] 占用,但除非我能找出这些字符串的更高级别容器,否则这些知识对我没什么好处。在研究中我发现了 OQL 和 rsizeof()所以我可以例如 SELECT rsizeof(o) FROM instanceof my.package.class o但我不知道我需要哪个类,所以我真的很希望能够运行类似 SELECT it.name, rsizeof(o) FROM instanceof Filter(Heap.classes(), "/my.package./(it.name)"); 的东西相反,但这不起作用。

那么 OQL 是多少?理想情况下,我希望限制为前 10 个左右最大的,并按大小排序。

最佳答案

我不确定我是否完全理解,但是......

OQL 使用基于 JavaScript 的表达式语言,因此您可以使用以下语句,它将查找 java.util.regex 包内的所有对象(递归地)并对它们的大小求和,它将返回一个数字:

sum(filter(heap.objects(), "/^java.util.regex./(classof(it).name)"), 'rsizeof(it)')

这将花费相同的时间,我只在小堆上进行了测试。请注意包名称开头的 ^

关于java - 在 VisualVM/OQL 中,如何获取某个包中对象的所有实例的总大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646471/

相关文章:

java - 我的树形图在排序后中断,因为 "comparator used for the treemap is inconsistent with equals"

java - Java Visual VM 中的实际运行线程

java - 用于计算对象匹配条件的 OQL 语法

java - 递归调用中的 StackOverFlow 异常

java - DateTimeFormatter 的最后一位年份

java - VisualVM 堆转储 OQL 渲染对象内的数组

java - 为什么是锯齿形图?

salesforce - 分层 SOQL 查询

java - 我如何找到一个对象指的是什么?

java - 如何设置 JVM 访问属性文件的自定义系统变量?