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 代码使用实际值(正如我们在对象字段中看到jhat
的value
那样Long
),但在 JSON 序列化中除外,因为 REST 端点返回 value 20180919141719600
。这表明不知何故这两个值实际上都在内存中(和堆转储),并且不知何故 JSON 序列化(使用 Jackson)做了一些不同的事情,与jhat
运行 OQL 查询时所做的一致。
分析这种情况的下一步是什么?