5

jhat/OQL を使用して Tomcat コンテナのメモリ リークを追跡しようとしています。私が聞きたい質問は次のとおりです。

「javax.servlet.http.HttpSession から到達可能な foo.bar.Cacheable クラスのすべてのインスタンス (およびサブインスタンス) を表示してください」

私はなんとか次のことを思いつきましたが、これはfoo.bar.Cacheableのサブクラスを示していません(これは実際にはインターフェースであるため重要です)。

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を通じてこの質問を提起するために私が間違っていることを誰かが助けてくれますか?

4

1 に答える 1

4

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)
    }
}
于 2011-02-17T14:53:22.853 に答える