В нашей команде запущен процесс Java (на 64-битном сервере OpenJDK 1.8.0_171-b10), в котором происходят некоторые необъяснимые вещи, связанные со значением (в штучной упаковке) Long
объектов.Мы создали дамп кучи для анализа с помощью 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
В результате оба возвращаемых объекта будут одинаковыми.Однако при проверке объектов все три имеют различное значение в value
, и ни одно из них не равно 20180919141719600
.
Это само по себе беспокоит нас и является ядромнаш вопрос.
Кроме того, мы можем сделать ситуацию немного более интересной.Кажется, что выполняющийся код Java использует фактические значения (как мы видим, используя jhat
в поле value
объектов Long
), за исключением сериализации JSON, поскольку конечная точка REST возвращает значение 20180919141719600
.Это сигнализирует о том, что оба значения фактически находятся в памяти (и дамп кучи), и каким-то образом сериализация JSON (с использованием Джексона) делает что-то другое, что согласуется с тем, что jhat
делает при выполнении запросов OQL.
Что будет следующимшаг проанализировать эту ситуацию?