Java 有没有办法在mat中使用OQL获取无法访问的对象?

Java 有没有办法在mat中使用OQL获取无法访问的对象?,java,jvm,eclipse-memory-analyzer,oql,Java,Jvm,Eclipse Memory Analyzer,Oql,我可以查询com.google.common.cache.LocalCache$StrongAccessWriteEntry的所有实例 在使用OQL的垫子中: SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry 我已在mat中启用了保留无法访问的对象。因此,结果既包含可访问对象,也包含不可访问对象。现在我想获取所有不可访问的com.google.common.cache.LocalCache$Stron

我可以查询
com.google.common.cache.LocalCache$StrongAccessWriteEntry的所有实例
在使用OQL的垫子中:

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry
我已在mat中启用了
保留无法访问的对象
。因此,结果既包含可访问对象,也包含不可访问对象。现在我想获取所有不可访问的
com.google.common.cache.LocalCache$StrongAccessWriteEntry实例
(也称为无gc根),如下所示:

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry WHERE unreachable=true
我可以使用OQL吗?

是的,查询如下:

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry r where r in (SELECT AS RETAINED SET objects s FROM OBJECTS ${snapshot}.@GCRoots s WHERE ((SELECT t FROM OBJECTS ${snapshot}.getGCRootInfo(s) t WHERE (t.@type = 2048)) != null))
我应该这样做

说明:

查找GC根目录:

SELECT objects s FROM OBJECTS ${snapshot}.@GCRoots s
SELECT AS RETAINED SET OBJECTS s FROM OBJECTS ${snapshot}.@GCRoots s WHERE ((SELECT t FROM OBJECTS ${snapshot}.getGCRootInfo(s) t WHERE (t.@type = 2048)) != null)
找到GC根,然后为每个GC根获取GC根信息数组,然后查看每个GCRootInfo并找到类型,查看它是否为type.UNREACHABLE(2048),然后选择一个GC根信息表示无法访问的GC根。这将查找无法访问的对象根。Keep unreachable objects仅将一些无法访问的对象标记为GC根-其余无法访问的对象由这些根保留。查询比传统方法工作得更好

SELECT OBJECTS s FROM OBJECTS ${snapshot}.@GCRoots s WHERE ((SELECT t FROM OBJECTS ${snapshot}.getGCRootInfo(s) t WHERE (t.@type = 2048)) != null)
通过查找不可访问的GC根保留的所有对象来查找所有不可访问的对象:

SELECT objects s FROM OBJECTS ${snapshot}.@GCRoots s
SELECT AS RETAINED SET OBJECTS s FROM OBJECTS ${snapshot}.@GCRoots s WHERE ((SELECT t FROM OBJECTS ${snapshot}.getGCRootInfo(s) t WHERE (t.@type = 2048)) != null)
查找所有LocalCache$StrongAccessWriteEntry对象

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry r
查找不可访问对象集中的所有LocalCache$StrongAccessWriteEntry对象

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry r where r in (SELECT AS RETAINED SET OBJECTS s FROM OBJECTS ${snapshot}.@GCRoots s WHERE ((SELECT t FROM OBJECTS ${snapshot}.getGCRootInfo(s) t WHERE (t.@type = 2048)) != null))
中有关于编写查询的更多信息