Sea*_*ene 2 java jvm oql eclipse-memory-analyzer
我可以使用 OQL 查询 in mat 的所有实例com.google.common.cache.LocalCache$StrongAccessWriteEntry
:
SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry
Run Code Online (Sandbox Code Playgroud)
Keep unreachable objects我已经在垫子上打开了。因此结果包含可到达和不可到达的对象。现在我想要获取所有无法访问的com.google.common.cache.LocalCache$StrongAccessWriteEntry instances(又名无 gc 根),如下所示:
SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry WHERE unreachable=true
Run Code Online (Sandbox Code Playgroud)
我可以使用 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))
Run Code Online (Sandbox Code Playgroud)
应该这样做。
解释:
求GC根:
SELECT objects s FROM OBJECTS ${snapshot}.@GCRoots s
Run Code Online (Sandbox Code Playgroud)
找到GC root,然后为每个GC root获取GC root信息的数组,然后查看每个GCRootInfo并找到类型,看看它是否为Type.UNREACHABLE(2048),然后才选择GC root信息所在的GC root说它无法访问。这会找到无法访问的对象根。保留不可达对象仅将部分不可达对象标记为 GC 根 - 其余不可达对象由这些根保留。查询比方式更好。
SELECT OBJECTS s FROM OBJECTS ${snapshot}.@GCRoots s WHERE ((SELECT t FROM OBJECTS ${snapshot}.getGCRootInfo(s) t WHERE (t.@type = 2048)) != null)
Run Code Online (Sandbox Code Playgroud)
通过查找不可达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)
Run Code Online (Sandbox Code Playgroud)
查找所有 LocalCache$StrongAccessWriteEntry 对象
SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry r
Run Code Online (Sandbox Code Playgroud)
查找也在无法访问的对象集中的所有 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))
Run Code Online (Sandbox Code Playgroud)
在Eclipse Memory Analyzer wiki中提供了有关编写查询的更多信息。