2010-04-22 14 views
4

我試圖使用jhat/OQL跟蹤我們的Tomcat容器中的內存泄漏。我想問的問題是:OQL查詢來查找從會話引用的給定類的所有實例和子實例

「給我所有foo.bar.Cacheable類是從到達了的javax.servlet.http.HttpSession實例(和子實例)」

我設法想出以下內容,但是這並沒有顯示 foo.bar.Cacheable(這很重要,因爲這實際上是一個接口)的子類。

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

我想下面的概念的各種排列,但不斷得到錯誤(「富」沒有定義)。

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

任何人都可以幫助我與我做錯了通過OQL提出這個問題?

+0

什麼是在classof「它」(它)? – 2010-04-29 10:00:55

+0

'它'是一個過濾器變量,由過濾器(..)方法隱式提供,表示要接受/拒絕的項目。 – Scruffers 2010-05-11 12:04:09

回答

3

在基於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) 
    } 
} 
相關問題