OQL是对java堆内存进行查询分析
使用方法:
1.查看java线程id
jps -lvm
上图红框中的为pid;
2.运行命令-导出堆内存信息-会生成一份文件在你本地
jmap -dump:live,file=a.map 10736
3.解析该文件-会展示为html
jhat a.map
4.在浏览器打开地址
主页面
命令查询页面
主页面如下:
查询页面如下:
总结:使用命令如下:
jps -lvm 查询pid
jmap -dump:live,file=a.map 10736 导出堆内存
jhat a.map 解析内存文件 浏览器打开 附录:
基本语法:
select <javascript expression to select>[from [instanceof] <class name> <identifier>][where <javascript boolean expression to filter>]解释: (1)class name是java类的完全限定名,如:java.lang.String, java.util.ArrayList, [C是char数组, [Ljava.io.File是java.io.File[](2)类的完全限定名不足以唯一的辨识一个类,因为不同的ClassLoader载入的相同的类,它们在jvm中是不同类型的(3)instanceof表示也查询某一个类的子类,如果不明确instanceof,则只精确查询class name指定的类(4)from和where子句都是可选的(5)java域表示:obj.field_name;java数组表示:array[index]举例: (1)查询长度大于100的字符串select s from java.lang.String s where s.count > 100(2)查询长度大于256的数组
select a from [I a where a.length > 256(3)显示匹配某一正则表达式的字符串select a.value.toString() from java.lang.String s where /java/(s.value.toString())(4)显示所有文件对象的文件路径select file.path.value.toString() from java.io.File file(5)显示所有ClassLoader的类名select classof(cl).name from instanceof java.lang.ClassLoader cl(6)通过引用查询对象select o from instanceof 0xd404d404 obuilt-in对象 -- heap (1)heap.findClass(class name) -- 找到类select heap.findClass("java.lang.String").superclass(2)heap.findObject(object id) -- 找到对象select heap.findObject("0xd404d404")(3)heap.classes -- 所有类的枚举select heap.classes(4)heap.objects -- 所有对象的枚举select heap.objects("java.lang.String")(5)heap.finalizables -- 等待垃圾收集的java对象的枚举(6)heap.livepaths -- 某一对象存活路径select heaplivepaths(s) from java.lang.String s(7)heap.roots -- 堆根集的枚举辨识对象的函数 (1)classof(class name) -- 返回java对象的类对象select classof(cl).name from instanceof java.lang.ClassLoader cl(2)identical(object1,object2) -- 返回是否两个对象是同一个实例select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)(3)objectid(object) -- 返回对象的idselect objectid(s) from java.lang.String s(4)reachables -- 返回可从对象可到达的对象select reachables(p) from java.util.Properties p -- 查询从Properties对象可到达的对象select reachables(u, "java.net.URL.handler") from java.net.URL u -- 查询从URL对象可到达的对象,但不包括从URL.handler可到达的对象(5)referrers(object) -- 返回引用某一对象的对象select referrers(s) from java.lang.String s where s.count > 100(6)referees(object) -- 返回某一对象引用的对象select referees(s) from java.lang.String s where s.count > 100(7)refers(object1,object2) -- 返回是否第一个对象引用第二个对象select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))(8)root(object) -- 返回是否对象是根集的成员select root(heap.findObject("0xd4d4d4d4")) (9)sizeof(object) -- 返回对象的大小select sizeof(o) from [I o(10)toHtml(object) -- 返回对象的html格式select "<b>" + toHtml(o) + "</b>" from java.lang.Object o(11)选择多值select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t数组、迭代器等函数 (1)concat(enumeration1,enumeration2) -- 将数组或枚举进行连接select concat(referrers(p),referrers(p)) from java.util.Properties p(2)contains(array, expression) -- 数组中元素是否满足某表达式select p from java.util.Properties where contains(referres(p), "classof(it).name == 'java.lang.Class'")返回由java.lang.Class引用的java.util.Properties对象built-in变量it -- 当前的迭代元素index -- 当前迭代元素的索引array -- 被迭代的数组(3)count(array, expression) -- 满足某一条件的元素的数量select count(heap.classes(), "/java.io./(it.name)")(4)filter(array, expression) -- 过滤出满足某一条件的元素select filter(heap.classes(), "/java.io./(it.name)")(5)length(array) -- 返回数组长度select length(heap.classes())(6)map(array,expression) -- 根据表达式对数组中的元素进行转换映射select map(heap.classes(),"index + '-->' + toHtml(it)")(7)max(array,expression) -- 最大值, min(array,expression)select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")built-in变量lhs -- 左边元素rhs -- 右边元素(8)sort(array,expression) -- 排序select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')(9)sum(array,expression) -- 求和select sum(heap.objects('[C'),'sizeof(it)')(10)toArray(array) -- 返回数组(11)unique(array) -- 唯一化数组