簡體   English   中英

使用 Jhat 堆內置 object

[英]Using Jhat heap built-in object

任何人都可以展示如何在 select 語句中使用 heap.heapForEachClass 的示例嗎? 如果您可以提供一些帶有不同查詢示例的鏈接(當然,除了 oqlhelp 頁面中的那些:),那就太好了

我不相信 heap.forEachClass() 打算在 select 語句中使用,至少不是直接使用。 考慮它不返回任何東西的事實:

var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined

jhat 和 VisualVM 中使用的 OQL 確實支持普通的 ol' JavaScript,就像我在上面使用的“查詢”一樣。 我相信 heap.forEachClass() 在 JavaScript 樣式查詢或選擇類型查詢中的 JavaScript 函數中找到更多用途。

也就是說,我不知道為什么這個 function 存在,因為 heap.classes() 枚舉更易於使用,無論是選擇樣式查詢還是普通 JavaScript 枚舉。

您甚至可以使用以下 JavaScript function 重新創建與 heap.forEachClass() 相同的功能:

function heapForEachClass(func){
    map(heap.classes(),func)
    return undefined;
}

我可以為您提供的任何示例查詢都可能更容易用 heap.classes() 編寫。 例如,您可以使用 heap.forEachClass() 來獲取所有類的列表:

var list=[];
heap.forEachClass(function(it){
    list.push(it);
});
list

但這比使用 heap.classes() 更復雜:

select heap.classes()

要不就

heap.classes()

I've used this function before to look for classes that are loaded multiple times (usually, this happens when two different class loaders load the same lib taking more memory for no reason, and making the JVM serialize and deserialize objects passed from one class instance到另一個-因為它不知道它們實際上是同一類-)

這是我的 OQL 腳本,用於選擇(並計算)具有相同名稱的類:

var classes = {};
var multipleLoadedClasses = {};

heap.forEachClass(function(it) {
    if (classes[it.name] != null) {
        if (multipleLoadedClasses[it.name] != null) {
            multipleLoadedClasses[it.name] = multipleLoadedClasses[it.name] + 1;
        } else {
            multipleLoadedClasses[it.name] = 1;
        }
    } else {
        classes[it.name] = it;
    }
});

multipleLoadedClasses;

希望這將有助於更多的訪客;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM