提问者:小点点

在VisualVM中格式化oql的结果


我有以下oql查询在Visualvm上针对堆转储运行,并希望将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
}
...

很明显,它已被“转换”为日期,但不会将其显示为人类可读的格式。在日期对象上执行toString()只会导致该字段显示为无效日期

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

共1个答案

匿名用户

  1. 输出显示您正在创建JavaScript Date对象。OQL的正确部分应该是:createdAt: newjava.util.Date(s.creationTime)
  2. 一个名为id的字段存在已知问题。有关更多详细信息,请参阅通过VisualVM OQL查询检索“id”字段值。作为解决方法,您可以使用的["包装对象"]. 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