我正在使用 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/