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

标签 java jvm eclipse-memory-analyzer oql

我可以查询 com.google.common.cache.LocalCache$StrongAccessWriteEntry 的所有实例 在 mat 中使用 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

找到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 root保留的所有对象来查找所有不可达对象:

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 中提供了有关编写查询的更多信息。 .

关于java - 有没有办法在mat中使用OQL获取无法访问的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62208144/

相关文章:

android - 一个简单的 "Hello World"项目的 17.8 MiB 堆分配?

java - 线程中出现异常 "main"java.lang.UnsatisfiedLinkError : no math in java. library.path

java - Tomcat、Java 和 SQL Server 2008 R2 : Cannot create JDBC driver of class '' for connect URL 'null'

java - 64 位 Windows 10 中每个 java 进程的最大内存量?

java - 为什么这个特定的次要 GC 这么慢

java - instanceof 如何比多态调用更快?

android - 内存分析器工具 - Android

java - Java VisualVM 是否提供正确的堆转储堆大小(.hprof 文件)

java - 完整网站的参数管理!

java - 如何在 Java 中从 XML 生成状态流程图?