Our team has a Java process running (on a 64-bit server OpenJDK 1.8.0_171-b10) in which some unexplainable things happen regarding the value of (boxed) Long
objects. We have created a heap dump to analyse with jhat
and here something really strange occurs.
Having jhat
running, we issue one of the following OQL queries:
select l from java.lang.Long l where l.value.toString().equals("20180919141719600")
select l from java.lang.Long l where l.value == 20180919141719600
Both result in the same three objects being returned. However, when we inspect the objects, all three have a different value in value
and neither of those equals 20180919141719600
.
- Screenshot of OQL query with results of three objects
- Screenshot of details of one of the objects, showing a different value than used in the query
This in itself bothers us and is the core of our question.
Additionally, we can make the situation a bit more interesting. It seems as if the running Java code uses the actual values (as we see using jhat
in the value
field of the Long
objects), except in JSON serialisation, because the REST endpoint returns the value 20180919141719600
. This signals that somehow both values are actually in memory (and heap dump) and somehow JSON serialisation (using Jackson) does something different, congruent to what jhat
does when running OQL queries.
What would be the next step to analyse this situation?