1

我正在使用 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 名左右,并按大小排序。

4

1 回答 1

1

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

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

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

这将需要同样的时间,我只在小堆上进行了测试。注意^包名开头的。

于 2013-04-09T20:17:47.593 回答