Удостоверьтесь, что у вас достаточно памяти: Java String для хранения 8 МБ сериализованного JSON требует около 16 мегабайт смежных памяти в куче.
Но что еще более важно: почему вы создаете java.lang.String
в памяти? Какое возможное использование существует для такой огромной строки?
Если вам нужно записать содержимое JSON в файл, для этого существуют разные методы; аналогично для записи в сетевой сокет. По крайней мере, вы можете написать вывод как byte[]
(занимает 50% меньше памяти), но в большинстве случаев инкрементная запись во внешний поток требует очень небольшой памяти.
15 секунд, безусловно, очень медленно. Без проблем с GC, после первоначального разминки, Джексон должен написать 8 мегабайт за долю секунды, что-то вроде 10-20 миллисекунд для простого объекта, состоящего из стандартных типов Java.
EDIT:
Просто понял, что во время строительства строки результата, использование временной памяти будет в два раза, а также, поскольку буферизацией содержание пока не очищается, когда String
построен. Таким образом, для построения String потребуется 8 Мбайт, по крайней мере, 32 МБ. С кучей по умолчанию 64 МБ это не сработает.
Обновите свой процессор. Вот и все. Или попробуйте разные сторонние библиотеки для этой задачи. Может быть, один из них быстрее для вас – Kon
Я думаю, что 15 секунд для объекта whitch занимает 8 МБ для создания, 15 секунд достаточно хорош – libik
Как вы оцениваете производительность? (Я имею в виду, вы делаете тест один или несколько раз и принимаете среднее значение? С разными наборами данных или только с одним?). Вам не нужно создавать новый «ObjectMapper» для каждого запуска, если это так, см. Http://stackoverflow.com/questions/3907929/should-i-make-jacksons-objectmapper-as-static-final – BretC