老发表beetl的更新日志,我也烦了,近期不忙,正好贡献点其他经验出来吧:
解决内存泄露的一个方法是分许heap dump文件,可以参考 http://visualvm.java.net/oqlhelp.html
我自己总结了一下以后可能用到的一些OQL,如下:
【OQL|内存分析OQL的几个例子】查找所有包含指定类的list
heap.objects(heap.findClass("java.util.ArrayList"),true, function(it){
if(it.size<=0){
return false ;
}
var i=0;
var data = https://www.it610.com/article/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(;
ivar 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;
}
}
);
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)