Объект, возвращаемый из запроса OQL в jhat, не соответствует запросу - PullRequest
0 голосов
/ 24 сентября 2018

В нашей команде запущен процесс 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.

Что будет следующимшаг проанализировать эту ситуацию?

...