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