【问题标题】:Is there any way to get unreachable objects using OQL in mat?有没有办法在 mat 中使用 OQL 获取无法访问的对象?
【发布时间】:2020-09-24 05:39:02
【问题描述】:

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

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

我在 mat 中打开了Keep unreachable objects。所以结果包含可到达和不可到达的对象。现在我想获取所有无法访问的com.google.common.cache.LocalCache$StrongAccessWriteEntry instances(又名。没有 gc 根),如下所示:

SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry WHERE unreachable=true

我可以使用 OQL 吗?

【问题讨论】:

    标签: java jvm eclipse-memory-analyzer oql


    【解决方案1】:

    是的,查询如:

    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 根信息说它无法访问。这会找到无法到达的对象根。 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 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 中有更多关于编写查询的信息。

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2018-11-08
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多