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



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

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry

我已经打开了垫子里的Keep unreachable objects。因此,结果包含可访问和无法访问的对象。现在我想获取所有无法访问的com.google.common.cache.LocalCache$StrongAccessWriteEntry instances(又名没有 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

找到 GC 根,然后为每个 GC 根获取 GC 根信息数组,然后查看每个 GCRootInfo,找到类型并查看它是否为 Type.UNREACHABLE (2048(,然后才选择一个 GC 根,其中 GC 根信息表明它无法访问。这将查找无法访问的对象根目录。保留无法访问的对象仅将某些无法访问的对象标记为 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 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))

在Eclipse Memory Analyzer wiki 中提供了有关编写查询的更多信息。

无法访问的对象意味着它没有传入引用。

SELECT * 
FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry o 
WHERE (inbounds(o).size() = 0)

相关内容

  • 没有找到相关文章

最新更新