java - OQL 查询以查找 session 中引用的给定类的所有实例和子实例

标签 java memory-leaks heap-memory oql jhat

我正在尝试使用 jhat/OQL 来跟踪 Tomcat 容器中的内存泄漏。我想问的问题是:

“显示可从 javax.servlet.http.HttpSession 访问的 foo.bar.Cacheable 类的所有实例(和子实例)”

我设法想出了以下内容,但这并没有显示 foo.bar.Cacheable 的子类(这很重要,因为这实际上是一个接口(interface))。

select filter(reachables(s), "/foo.bar.Cacheable/(classof(it).name)") from javax.servlet.http.HttpSession s

我尝试了以下概念的各种排列,但不断出现错误(“foo”未定义)。

select filter(reachables(s), classof(it) instanceof foo.bar.Cacheable) from javax.servlet.http.HttpSession s

任何人都可以帮助我解决我在通过 OQL 提出这个问题时做错了什么吗?

最佳答案

在基于 jhat 的 OQL 实现(jHat、VisualVM)中,您可以利用这样一个事实,即您不限于类似 SQL 的语法,而是拥有一个完整的 javascript 引擎。

下面的代码可以解决这个问题

var containerSuperClass = "javax.servlet.http.HttpSession"
var elementSuperClass = "foo.bar.Cacheable"
// find the container class by name
var alClz = heap.findClass(elementSuperClass)
// retrieve all subclasses
var subClzs = alClz.subclasses()

// filter the list of objects reachables from instances of the container super class
// and all its subclasses so it contains only objects of classes from subClzs
map(heap.objects(containerSuperClass), 'filter(reachables(it), "it != null && contains(subClzs, containsClause(it))")')

// we need to externalize the contains clause because of clash in naming the closure parameter 'it'
function containsClause(rcbl) {
    return function(it) {
        if (rcbl == null || it == null) return false;
        return it.name.equals(classof(rcbl).name)
    }
}

关于java - OQL 查询以查找 session 中引用的给定类的所有实例和子实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2692745/

相关文章:

ruby-on-rails - 如何调试内存泄漏并在使用 Rails 4.2.1 + Nginx + Passenger 构建的应用程序中进行线程分析?

java - OutOfMemoryError 即使禁用了 TestNG 监听器/报告器

java - rxjava中的后台任务队列

java - Java中使用字符串数组时出现空指针异常

c++ - “Strange”内存泄漏-TCP网络

memory-leaks - valgrind 向 gtk init 调用显示的内存泄漏

arrays - 发生堆缓冲区溢出不确定是否在 C 中正确为二维数组分配内存

c - 我从堆中分配内存来存储一个字符,但它保存的是一个字符串

java - 在网站中启动小程序

Java GUI设计大纲?