1

Long我们的团队有一个 Java 进程正在运行(在 64 位服务器 OpenJDK 1.8.0_171-b10 上),其中发生了一些关于(装箱)对象值的无法解释的事情。我们创建了一个堆转储来分析,jhat这里发生了一些非常奇怪的事情。

jhat运行后,我们发出以下 OQL 查询之一:

  • select l from java.lang.Long l where l.value.toString().equals("20180919141719600")
  • select l from java.lang.Long l where l.value == 20180919141719600

两者都会返回相同的三个对象。但是,当我们检查对象时,所有三个都有不同的值 invalue并且它们都不等于20180919141719600

这本身就困扰着我们,也是我们问题的核心。

此外,我们可以使情况变得更有趣。似乎正在运行的 Java 代码使用实际值(正如我们在对象字段中看到jhatvalue那样Long),但在 JSON 序列化中除外,因为 REST 端点返回 value 20180919141719600。这表明不知何故这两个值实际上都在内存中(和堆转储),并且不知何故 JSON 序列化(使用 Jackson)做了一些不同的事情,与jhat运行 OQL 查询时所做的一致。

分析这种情况的下一步是什么?

4

0 回答 0