Фон
У меня есть пакетная программа Spring, которая читает файл (пример файла, с которым я работаю, размером ~ 4 ГБ), выполняет небольшую обработку в файле и затем записывает его в базу данных Oracle.
Моя программа использует 1 поток для чтения файла и 12 рабочих потоков для обработки и ввода базы данных.
Я собираю много-много и много молодой памяти, что заставляет мою программу идти медленнее, чем я думаю, что это должно быть.
Настройка
JDK 1.6.18
Spring пакет 2.1.x
4 Core Machine с 16 ГБ оперативной памяти
-Xmx12G
-Xms12G
-NewRatio=1
-XX:+UseParallelGC
-XX:+UseParallelOldGC
Проблема
С этими параметрами JVM я получаю где-то около 5.x ГБ памяти для Tenured Generation и около 5.X ГБ памяти для Young Generation.
В процессе обработки этого одного файла мое Tenured Generation прекрасное. Он растет до максимума, возможно, 3 ГБ, и мне никогда не нужно делать один полный GC.
Однако, молодое поколение поражает его максимум много раз. Он достигает диапазона до 5 ГБ, а затем выполняется параллельный младший GC и очищает Young Gen до 500 МБ. Незначительные GC файлы хороши и лучше, чем полный GC, но он по-прежнему значительно замедляет мою программу (я уверен, что приложение все еще зависает, когда происходит создание коллекции gen gen, потому что я вижу, что активность базы данных отмирает). Я трачу более 5% от моего времени программы, замороженного для небольших GC, и это кажется чрезмерным. Я бы сказал, в процессе обработки этого 4-Гбайт файла, я отказываюсь от 50-60 ГБ памяти младшего поколения.
Я не вижу явных недостатков в своей программе. Я стараюсь подчиняться общим принципам OO и писать чистый Java-код. Я стараюсь не создавать объекты без причины. Я использую пулы потоков и, по возможности, передаю объекты вместо создания новых объектов. Я собираюсь начать профилирование приложения, но Мне было интересно, есть ли у кого-то хорошие общие правила или анти-шаблоны, чтобы избежать чрезмерного оттока памяти? Является ли 50-60 ГБ сбоя памяти для обработки файла размером 4 ГБ лучшим, что я могу сделать? Должен ли я возвращаться к JDk 1.2 трюкам, таким как Object Pooling? (хотя Брайан Гетц дает представление о том, почему пул объектов путают, и нам больше не нужно это делать. Я доверяю ему гораздо больше, чем доверяю себе:):)