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