我正在使用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)')
这将花费相同的时间,我仅在小堆上进行了测试。注意包名称开头的
^
。