在 VisualVM 中格式化 oql 的结果

Formatting the result of oql in VisualVM

我在 visualvm 上有以下针对堆转储的 oql 查询 运行,并且希望将 creationTime 字段格式化为日期时间字段(其存储为 Long)。

select { id: s.id.toString(), createdAt: new Date(s.creationTime) }
from org.apache.catalina.session.StandardSession s

上面的查询列出了以下输出(截断)

{
 id = 1010827848,
 createdAt = sun.org.mozilla.javascript.internal.NativeDate@66106135
}
...

很明显,它已 "converted" 为日期,但未以人类可读的格式显示。在日期对象上执行 toString() 只会导致字段显示为 Invalid Date.

  1. 是否可以将 Long 字段格式化为 Date 字段?
  2. 使用 VisualVM 查询时,id 字段的值也已关闭。当我使用 Eclipse Analyzer 查询同一个堆转储时,我看到了正确的值(即 BE27C51E8BF185A2FB3AA9164EC0C647)。那会发生什么?
  1. 输出显示您正在创建 JavaScript 日期对象。你的 OQL 的正确部分应该是:createdAt: new java.util.Date(s.creationTime)
  2. 名为 id 的字段存在已知问题。有关详细信息,请参阅 。作为解决方法,您可以使用 s["wrapped-object"].getValueOfField("id") 而不是 s.id.toString()

通过上述更改,您的查询应为:

select { id: s["wrapped-object"].getValueOfField("id"),
createdAt: new java.util.Date(s.creationTime).toString() }
from org.apache.catalina.session.StandardSession s