1

我在 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
}
...

很明显,它已被“转换”为日期,但并未将其显示为人类可读的格式。对日期对象执行 atoString()只会导致字段显示为Invalid Date

  1. 是否可以将 Long 字段格式化为 Date 字段?
  2. 使用 VisualVM 查询时,id 字段的值也是关闭的。当我使用 Eclipse Analyzer 查询同一个堆转储时,我看到了正确的值(即BE27C51E8BF185A2FB3AA9164EC0C647)。那会发生什么?
4

1 回答 1

2
  1. 输出显示您正在创建 JavaScript Date 对象。OQL 的正确部分应该是:createdAt: new java.util.Date(s.creationTime)
  2. 一个名为 的字段存在一个已知问题id。有关更多详细信息,请参阅通过 VisualVM OQL 查询检索“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
于 2018-05-16T11:15:37.063 回答