首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过MAT OQL将线程堆栈到文件

通过MAT OQL将线程堆栈到文件
EN

Stack Overflow用户
提问于 2020-02-20 20:09:54
回答 1查看 162关注 0票数 0

我知道我们有办法从MAT UI获取线程详细信息和更多信息,但有没有办法让这些堆栈(类似于线程转储)重定向到输出或运行任何OQL查询来获得相同的信息?

我们有相当大的HeapDump (大约16G),它显示了大约500个活动线程,并且遍历每一个via UI都是一个乏味的过程。我想知道是否有一种方法可以通过MAT OQL从堆转储中获得简化的线程转储。

谢谢

维什瓦纳特

EN

回答 1

Stack Overflow用户

发布于 2020-10-02 23:53:10

对于最近的MAT级别,这应该是可行的:

代码语言:javascript
复制
SELECT u.Thread AS Thread, u.Frame.@text AS Frame FROM OBJECTS ( SELECT t AS Thread, ${snapshot}.getThreadStack(t.@objectId).@stackFrames AS Frame FROM java.lang.Thread t  ) u 

内部选择

代码语言:javascript
复制
SELECT t AS Thread, ${snapshot}.getThreadStack(t.@objectId).@stackFrames AS Frame FROM java.lang.Thread t

提取每个线程和堆栈帧的数组。然后,外部select使用与其每个堆栈帧相同的线程引用来展平该数组。

代码语言:javascript
复制
Thread                           |Frame
--------------------------------------------------------------------------------------------------------------------------------------------------
java.lang.Thread [id=0x7b6a1e7f0]|at java.lang.Object.wait(J)V (Native Method)
java.lang.Thread [id=0x7b6a1e7f0]|at java.lang.Object.wait(JI)V (Unknown Source)
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.performCleanup()Z (ConnectionPool.java:305)
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.runCleanupUntilPoolIsEmpty()V (ConnectionPool.java:242)
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.access$000(Lcom/squareup/okhttp/ConnectionPool;)V (ConnectionPool.java:54)
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool$1.run()V (ConnectionPool.java:97)
--------------------------------------------------------------------------------------------------------------------------------------------------

您甚至可以使用另一个select从每个帧中提取每个局部。

代码语言:javascript
复制
SELECT v.Thread AS Thread, v.Frame AS Frame, ${snapshot}.getObject(v.Objs) AS Local 
  FROM OBJECTS ( 
    SELECT u.Thread AS Thread, u.Frame.@text AS Frame, u.Frame.@localObjectsIds AS Objs 
      FROM OBJECTS ( 
        SELECT t AS Thread, ${snapshot}.getThreadStack(t.@objectId).@stackFrames AS Frame 
          FROM java.lang.Thread t
      ) u
  ) v 
  WHERE (v.Objs != null)
代码语言:javascript
复制
Thread                           |Frame                                                                                                           |Local
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.performCleanup()Z (ConnectionPool.java:305)                               |java.util.ArrayList [id=0x7bb402eb8]
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.performCleanup()Z (ConnectionPool.java:305)                               |com.squareup.okhttp.ConnectionPool [id=0x6c556ccb0]
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.runCleanupUntilPoolIsEmpty()V (ConnectionPool.java:242)                   |com.squareup.okhttp.ConnectionPool [id=0x6c556ccb0]
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool.access$000(Lcom/squareup/okhttp/ConnectionPool;)V (ConnectionPool.java:54)|com.squareup.okhttp.ConnectionPool [id=0x6c556ccb0]
java.lang.Thread [id=0x7b6a1e7f0]|at com.squareup.okhttp.ConnectionPool$1.run()V (ConnectionPool.java:97)                                         |com.squareup.okhttp.ConnectionPool$1 [id=0x6c556ccd8]
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60319611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档