内存分析OQL的几个例子

老发表beetl的更新日志,我也烦了,近期不忙,正好贡献点其他经验出来吧:


解决内存泄露的一个方法是分许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;
}
}
);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值