日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

以后可能用到的一些OQL

發布時間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 以后可能用到的一些OQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Visual VM對OQL的支持

上面我們學會了如何查看堆內存快照,但是,堆內存快照十分龐大,快照中的類數量也很多。Visual VM提供了對OQL(對象查詢語言)的支持,以便于開發人員在龐大的堆內存數據中,快速定位所需的資源。

2.1 Visual VM的OQL基本語法

OQL 語言是一種類似SQL的查詢語言。基本語法如下:

  • select <JavaScript expression to select>

  • [ from [instanceof] <class name> <identifier>

  • [ where <JavaScript boolean expression to filter> ] ]

  • OQL由3個部分組成:select 子句、from 子句和where 子句。select 子句指定查詢結果要顯示的內容;from 子句指定查詢范圍,可指定類名,如java.lang.String、char[]、[Ljava.io.File(File數組);where 子句用于指定查詢條件。

    select 子句和where 子句支持使用Javascript 語法處理較為復雜的查詢邏輯;select 子句可以使用類似json的語法輸出多個列;from子句中可以使用instanceof關鍵字,將給定類的子類也包括到輸出列表中。

    在Visual VM的OQL中,可以直接訪問對象的屬性和部分方法。如下例中,直接使用了String對象的count屬性,篩選出長度大于等于100的字符串:

    select s from java.lang.String s where s.count >= 100

    選取長度大于等于256的 int 數組:

    select a from int[] a where a.length >= 256

    篩選出表示兩位數整數的字符串:

    select {instance: s, content: s.toString()} from java.lang.String s where /^\d{2}$/(s.toString())

    上例中,select 子句使用了json語法,指定輸出兩列為String對象以及String.toString() 的輸出。where 子句使用正則表達式,指定了符合/^\d{2}$/條件的字符串。

    下例使用 instance 關鍵字選取所有的ClassLoader,包括子類:

    select cl from instanceof java.lang.ClassLoader cl;

    由于在Java程序中,一個類可能會被多個ClassLoader同時載入,因此,這種情況下,可能需要使用Class的ID來指定Class。如下例,選出了所有ID為0x37A014D8的Class對象實例。

    select s from 0x37A014D8 s;

    解決內存泄露的一個方法是分許heap dump文件,可以參考?http://visualvm.java.net/oqlhelp.html

    我自己總結了一下以后可能用到的一些OQL,如下:

    查找所有包含指定類的list

    heap.objects(heap.findClass("java.util.ArrayList"),true, function(it){
    if(it.size<=0){
    return false ;
    }
    var i=0;
    var data = it.elementData[0];
    var className = classof(data).name;
    if(isClass(className)){
    return true
    }else{
    return false;
    }

    } )

    function isClass(name){
    var pattern = /com.netease/ ;
    var result = pattern.exec(name);
    return result!=null;
    }

    查找業務類直接或者間接引用的list

    select filter(heap.livepaths(s),function(it){

    var array = it ;
    var i= 0;
    var size = array.length;
    for(;i<size;i++){
    var className = classof(array[i]).name;
    if(isClass(className)){
    return true
    }else{
    return false;
    }
    }
    return true ;


    })?
    from java.util.ArrayList s

    ?

    查找包含內容最多的List,這個應該是查找內存泄露的好語句
    map(top(heap.objects('java.util.ArrayList'), 'rhs.size - lhs.size', 5),"toHtml(it)+'='+it.size")

    查找當前系統屬性
    map(heap.objects(heap.findClass("com.netease.Main")),"it.size")

    查找同樣內容最多的string
    var counts={};
    var alreadyReturned={};

    filter(
    sort(
    map(heap.objects("java.lang.String"),
    function(heapString){
    if( ! counts[heapString.toString()]){
    counts[heapString.toString()] = 1;
    } else {
    counts[heapString.toString()] = counts[heapString.toString()] + 1;
    }
    return { string:heapString.toString(), count:counts[heapString.toString()]};
    }),?
    'lhs.count < rhs.count'),
    function(countObject) {
    if( ! alreadyReturned[countObject.string]){
    alreadyReturned[countObject.string] = true;
    return true;
    } else {
    return false;
    }
    }
    );

    ?

    總結

    以上是生活随笔為你收集整理的以后可能用到的一些OQL的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。