Виробництво сміття Java G1 у виробництві


91

Оскільки Java 7 збирається використовувати новий збір сміття G1 за замовчуванням, чи зможе Java обробляти купу на порядок більший без передбачуваних "руйнівних" пауз GC? Хтось насправді впроваджував G1 у виробництво, який у вас був досвід?

Чесно кажучи, єдиний раз, коли я бачив справді довгі паузи GC, це дуже великі купи, набагато більше, ніж було б на робочій станції. Для роз’яснення мого питання; чи G1 відкриє шлюз до куп в сотні Гб? Туберкульоз?


15
Хоча це можна переформулювати більш конкретно, це не жахливе питання. Я дуже хочу, щоб людям довелося пояснити себе краще, ніж "Не питання", коли голосували за закриття.
Білл К

Я не голосував за закриття, але хотів би, щоб Оператор зробив більш об'єктивну роботу, деталізуючи свої стосунки з поточним ГК. Крім того, "Java" - це мова, тоді як він говорить про реалізацію, і я не знаю, що означає "впровадження G1 у виробництво", особливо з майбутнім часом решти питання. Якщо це буде на Java 7, то, напевно, ніхто не використовував його у виробництві?
Паскаль Куок,

6
@Pascal G1 є експериментальною функцією, доступною в JDK з моменту оновлення 14. JDK 6. "Впроваджуючи G1 у виробництво", я думаю, він мав на увазі насправді використовувати його, не так важко зрозуміти. І хоча я погоджуюсь, що G1 є частиною JDK 7, а не Java, пошук Java 7 у Google повертає домашню сторінку JDK 7 як перший результат, і обидва терміни часто використовуються як взаємозамінні. @Benju, я б не довіряв результатам, отриманим з G1 для поточного JDK, оскільки це експериментально, багато речей може змінитися відтепер до офіційного випуску.
тето

2
Здається, JDK 7, включаючи оновлення 1,2 та 3, за замовчуванням не використовує G1 GC. Ви можете перевірити це за допомогою jinfo -flag UseG1GC pid
Джордж

Відповіді:


34

Здається, сенс G1 - мати менший час паузи, навіть до того моменту, коли він має можливість вказати максимальний час паузи.

Вивіз сміття - це не просто проста угода "Ей, вона повна, давайте перенесемо все відразу і почнемо спочатку" - це фантастично складна, багаторівнева, фонова різьбова система. Він може виконувати більшу частину свого обслуговування у фоновому режимі без взагалі пауз, а також використовує знання очікуваних шаблонів системи під час виконання - наприклад, припускаючи, що більшість об’єктів гине відразу після створення тощо.

Я б сказав, що час паузи GC буде продовжувати вдосконалюватися, а не погіршуватись, з наступними версіями.

РЕДАГУВАТИ:

під час повторного читання мені спало на думку, що я щодня використовую Java - Eclipse, Azureus та додатки, які розробляю, і вже давно, коли я побачив паузу. Не суттєва пауза, але я маю на увазі будь-яку паузу взагалі.

Я бачив паузи, коли я клацаю правою кнопкою миші на провіднику Windows або (зрідка), коли я підключаю певне обладнання USB, але з Java - взагалі жодного.

GC все ще є проблемою з кимось?


Погодьтеся - єдиний раз, коли я бачив паузи в GC, це коли я навмисно або випадково провокував їх масово паралельним кодом створення сміття .....
mikera

28
Так, GC все ще залишається проблемою, коли ви починаєте мати справу з великими купами (> 16 ГБ), особливо з великими поколіннями.
Алхімік

2
@ the-alchemist wow, я кілька разів бачив твій коментар, і мене просто вразило, що ти сказав 16 Гб !! Хоча я абсолютно впевнений, що ви праві, що це може спричинити величезні затримки, я хочу перевірити, чи ви вимкнули ВСІ обміни. У великій системі пам’яті будь-яка обміна Java абсолютно вб’є вашу систему (оскільки GC дуже недружній до обміну). Я впевнений, що ви це вже зробили, але я просто хотів про це згадати - адже це мало б величезну різницю. Я ніколи не бачив ПК з такою кількістю оперативної пам'яті - скільки у вас є? 32г?
Білл К

8
Так, GC є проблематичним для служб, оскільки саме вони ускладнюють ДУЖЕ важке вдосконалення обмежень TP99.9 (і вище). Зокрема, ГК «старого покоління» можуть бути пастками смерті, які, окрім заморозки JVM (і сервісу) на кілька секунд; а для служб, які зазвичай обслуговують запити за однозначні (або низькі двоцифрові) мілі секунд, це проблематично. Для чого це варте, це була практична проблема з внутрішньою системою зберігання даних, яка використовується службою простої черги Amazon (не можна вникати в тонни деталей, оскільки це внутрішній AWS).
StaxMan

21
Прикро в GC полягає в тому, що Azul багато років тому винайшов геніальний алгоритм GC (Azul C4), який легко справляється з сотнями гігабайт без помітних пауз, дуже розумно використовуючи апаратне забезпечення пам'яті процесорів. Але цього ніхто не знає, і це не скоро буде впроваджено у основних версіях Java, оскільки йому потрібна певна підтримка з боку операційної системи. І постачальники операційних систем нічого не робитимуть, поки люди не дізнаються про алгоритм і не тиснуть на постачальників операційних систем. Дивіться azulsystems.com/zing/pgc , managedruntime.org
Hans-Peter Störr

58

Я тестував це з важким додатком: 60-70 Гб, виділених до купи, з 20-50 Гб, що використовуються в будь-який час. З такими видами програм недопустимо стверджувати, що ваш пробіг може відрізнятися. Я використовую JDK 1.6_22 на Linux. Малі версії важливі - до приблизно 1.6_20 в G1 були помилки, які спричиняли випадкові NullPointerExceptions.

Я виявив, що дуже добре дотримуватися мети паузи, яку ви надаєте їй більшу частину часу. За замовчуванням видається пауза в 100 мс (0,1 секунди), і я казав їй зробити половину (-XX: MaxGCPauseMillis = 50). Однак, коли пам’яті стає дуже мало, вона панікує і робить повний збір сміття у світі. Завдяки 65 ГБ це займає від 30 секунд до 2 хвилин. (Кількість процесорів, ймовірно, не має різниці; можливо, вона обмежена швидкістю шини.)

Порівняно з CMS (яка не є стандартною GC сервера, але вона повинна бути для веб-серверів та інших додатків у режимі реального часу), типові паузи набагато передбачуваніші і можуть бути значно коротшими. Поки що я маю більше удачі з CMS для величезних пауз, але це може бути випадковим; Я бачу їх лише кілька разів кожні 24 години. Я не впевнений, який з них на даний момент буде більш доречним у моєму виробничому середовищі, але, мабуть, G1. Якщо Oracle продовжить налаштовувати його, я підозрюю, що G1 зрештою стане безперечним переможцем.

Якщо у вас немає проблем із існуючими збирачами сміття, зараз немає причин розглядати G1. Якщо у вас запущена програма з низькою затримкою, наприклад, програма з графічним інтерфейсом, G1, мабуть, є правильним вибором, оскільки MaxGCPauseMillis встановлений дуже низько. Якщо ви використовуєте пакетний режим, G1 вам нічого не купує.


14

Хоча я не тестував G1 у виробництві, я думав, що прокоментую, що GC вже є проблематичним для випадків без "величезних" куп. Зокрема, послуги з лише, скажімо, 2 або 4 концертами можуть сильно вплинути на GC. GC молодого покоління, як правило, не є проблематичним, оскільки вони закінчуються за однозначні мілісекунди (або щонайбільше двозначні). Але колекції старого покоління є набагато проблематичнішими, оскільки вони займають кілька секунд із розмірами старих поколінь 1 гіг або вище.

Тепер: теоретично CMS може там дуже допомогти, оскільки більшу частину своєї роботи вона може виконувати одночасно. Однак з часом траплятимуться випадки, коли він не може цього зробити, і йому доводиться відступати, щоб "зупинити світ". І коли це трапиться (скажімо, через 1 годину - не часто, але все-таки занадто часто), добре, тримайся своїх капелюхів. Це може зайняти хвилину і більше. Це особливо проблематично для служб, які намагаються обмежити максимальну затримку; замість того, щоб подати запит, скажімо, 25 мілісекунд, зараз потрібно десять секунд або більше. Щоб додати шкоди образі, клієнти часто таймають час запиту та повторюють спробу, що призводить до подальших проблем (інакше як "лайна").

Це одна область, де сподівалися, що G1 дуже допоможе. Я працював у великій компанії, яка пропонує хмарні послуги для зберігання та відправлення повідомлень; і ми не могли використовувати CMS, оскільки, хоча більшу частину часу він працював краще, ніж паралельні сорти, він мав ці розпади. Тож протягом години все було приємно; а потім речі потрапляють у вентилятор ... і оскільки сервіс базувався на кластерах, коли один вузол потрапляв у неприємності, інші, як правило, слідували (оскільки індуковані GC тайм-аути призводять до того, що інші вузли вважають, що вузол аварійно завершився, що призвело до повторних маршрутів).

Я не думаю, що GC є такою великою проблемою для програм, і, можливо, навіть некластеризовані послуги рідше зачіпаються. Але все більше і більше систем є кластеризованими (зокрема завдяки сховищам даних NoSQL) і розміри купи зростають. GC OldGen надзвичайно лінійно пов'язані з розміром купи (це означає, що подвоєння розміру купи більше, ніж подвоює час GC, припускаючи, що розмір поточного набору даних також подвоюється).


13

Технічний директор Azul Гіл Тене має хороший огляд проблем, пов’язаних зі збиранням сміття, та огляд різних рішень у своїй презентації « Розуміння збору сміття Java та те, що ви можете зробити з цим» , а в цій статті є додаткові подробиці: http: // www.infoq.com/articles/azul_gc_in_detail .

Колекціонер сміття Azul C4 у нашому Zing JVM одночасно паралельний і одночасний, і використовує один і той же механізм GC як для нового, так і для старих поколінь, працюючи одночасно та ущільнюючи в обох випадках. Найголовніше, що у C4 немає зупинки світу. Все ущільнення виконується одночасно з запущеним додатком. У нас є клієнти, що працюють дуже великими (сотні Гбайт), з гіршими випадками часу паузи GC <10 мсек, а залежно від програми часто менше, ніж 1-2 мсек.

Проблема CMS і G1 полягає в тому, що в якийсь момент пам'ять купи Java повинна бути ущільнена, і обидва ці збирачі сміття зупиняють світ / STW (тобто призупиняють програму) для виконання ущільнення. Отже, хоча CMS і G1 можуть виштовхувати паузи STW, вони їх не усувають. Однак C4 Azul повністю усуває паузи STW, і тому Zing має такі низькі паузи GC навіть для гігантських розмірів купи.

А щоб виправити заяву, зроблену в попередній відповіді, Zing не вимагає жодних змін в операційній системі. Він працює так само, як і будь-який інший JVM на незмінених дистрибутивах Linux.


3
Мені просто цікаво, як C4 Azul досяг того, що ви сказали, і чому Sun або Oracle не можуть. Чи є якась велика таємниця, чи це просто якийсь компроміс?
Джордж

5
Azul C4 має дуже унікальну технологію, котра бере свій початок від апаратних обчислювальних приладів Azul (яка використовує спеціалізовані процесори, побудовані для запуску корпоративних програм Java) і була розроблена для роботи на звичайних серверах x86 під управлінням Linux. Кожен інший збирач сміття корпоративного класу (чи то від Oracle, чи від IBM) у певний момент повинен робити паузи, що зупиняють світ - унікальним атрибутом C4 Azul є те, що він ніколи не робить цих проблемних пауз STW. Якщо вам цікаво, винахідники колектора C4 опублікували статтю про те, як це працює: dl.acm.org/citation.cfm?id=1064988 .
Скотт Селлерс

Скотте , я прочитав тут blog.mikemccandless.com/2012/07/…, що Azul постачає модуль ядра, який попередньо виділяє пам’ять для використання JVM. Це не правда? Якщо вірно, не велика частина модифікації ядра, але все ж модифікація.
Dan Pritts

4
Джордж, два слова: патент захищений. Ден, коли ти купуєш Zing, частина того, за що ти платиш, полягає в тому, щоб люди, які їх підтримують, налаштували його на твій додаток - і це включає розподіл загального використання системної пам'яті. Сам модуль ядра запобігає запису в блок пам'яті, який збирається сміттям. Це секретний соус, який робить його «безпаузним»: нитки призупиняються, лише якщо вони намагаються написати в один із цих блоків, а потім лише настільки довго, щоб ущільнити цей блок.
Девід Леппік,

13

Ми вже використовуємо G1GC, починаючи з майже двох років. Це чудово справляється з нашою критично важливою системою обробки транзакцій, і це виявилося чудовою підтримкою з високою пропускною здатністю, низькими паузами, паралельністю та оптимізованим важким управлінням пам'яттю.

Ми використовуємо такі налаштування JVM:

-server -Xms512m -Xmx3076m -XX:NewRatio=50 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000 -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

Оновлено

-d64 -server -Xss4m -Xms1024m -Xmx4096m -XX:NewRatio=50 -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:-DisableExplicitGC -XX:+AggressiveOpts -Xnoclassgc -XX:+UseNUMA -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=48m -XX:+UseStringCache -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000

5
На Java 8 не потрібно встановлювати -XX: + UseCompressedOops або -XX: + DoEscapeAnalysis, кабінка ввімкнена за замовчуванням. Див .: docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
Мірко Еберт

8

Колектор G1 зменшує вплив повних колекцій. Якщо у вас є програма, де ви вже зменшили потребу в повних колекціях, колектор одночасної розгортки карт так само хороший, і, на мій досвід, коротший час незначного збору.


"зауважте, що виробниче використання G1 дозволено лише там, де придбано контракт на підтримку Java.", groups.google.com/forum/#!topic/javaposse/Vm0a4H-QY54 , то це міф чи ні?
Крістоф Руссі

1
@ChristopheRoussy Я не знаю, чи це вже правда (чи справді маю докази, що це коли-небудь було правдою). Для цього не потрібно -XX: + UnlockCommercialFeatures, тому я підозрюю, що G1 не вимагає ліцензії.
Пітер Лорі


5

Нещодавно мене переїхали з

Від CMS до G1GC з купою 4G і 8-ядерним процесором на серверах з JDK 1.7.45 .

(JDK 1.8.x G1GC є кращим за 1.7, але через деякі обмеження я повинен дотримуватися версії 1.7.45)

Я налаштував нижче ключові параметри і зберіг усі інші параметри до значень за замовчуванням.

-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, 
-XX:ConcGCThreads=n apart from -Xms and -Xmx

Якщо ви хочете точно налаштувати ці параметри, перегляньте цю статтю оракула .

Основні спостереження:

  1. Використання пам’яті відповідає G1GC, на відміну від високих і низьких значень із CMS
  2. Максимальний час паузи GC менше, ніж у CMS
  3. Час, витрачений на збір сміття, трохи більший у G1GC порівняно з CMS.
  4. Кількість основних колекцій майже незначна порівняно з CMS
  5. Кількість незначних колекцій знаходиться на вищому рівні порівняно з CMS

Але все одно я радий, що час паузи Max GC менше, ніж у CMS. Я встановив максимальний час паузи GC 1,5 секунди, і це значення ще не перекреслено.

Пов’язане питання SE:

Збір сміття Java 7 (JDK 7) та документація щодо G1


4

Система управління вмістом може призвести до повільної погіршення продуктивності, навіть якщо ви запускаєте її без накопичення об'єктів, що зберігаються. Це пов’язано з фрагментацією пам’яті, якої G1 нібито уникає.

Міф про G1, доступний лише з платною підтримкою, є саме цим, міфом. Sun і зараз Oracle пояснили це на сторінці JDK.


4

G1 GC повинен працювати краще. Але якщо встановити -XX: MaxGCPauseMill занадто агресивно, сміття буде збиратися занадто повільно. І тому повний GC спрацював на прикладі Девіда Леппіка.


4

Я щойно реалізував Смітник G1 у нашому проекті «Велика пам’ять» з теракоти. Під час роботи над різними типами колекторів G1 дав нам найкращі результати за час відгуку менше 600 мс.

Ви можете знайти результати тесту (загалом 26) тут

Сподіваюся, це допоможе.


3

Нещодавно я переніс частину Twicsy на новий сервер із 128 ГБ оперативної пам'яті і вирішив використати 1.7. Я почав використовувати ті самі налаштування пам'яті, що і в 1.6 (у мене є кілька екземплярів, які виконують різні дії, десь від 500 МБ купи до 15 ГБ, а тепер новий із 40 ГБ), і це не вдалося взагалі. . Здається, 1.7 використовує більше купи, ніж 1.6, і я відчував багато проблем протягом перших кількох днів. На щастя, у мене було багато оперативної пам’яті, з якою я працював, і я нарізав оперативну пам’ять для більшості своїх процесів, але все одно мав деякі проблеми. Моїм звичайним MO було використовувати дуже малий мінімальний розмір купи 16 м, навіть з максимальною купою в кілька гігабайт, а потім увімкнути поступовий GC. Це зводило паузи до мінімуму. Це зараз не працює, і мені довелося збільшити мінімальний розмір приблизно до того, що я очікував використовувати в середньому в купі, і це вдалося дуже добре. У мене все ще ввімкнено поступовий GC, але я буду намагатися без нього. Зараз немає жодних пауз, і, здається, все працює дуже швидко. Отже, я думаю, що мораль історії - не чекайте, що ваші налаштування пам’яті будуть ідеально перекладені з 1,6 на 1,7.


2

G1 робить додаток набагато спритнішим: латентність програми зросте - додаток можна назвати "м'яким реальним часом". Це робиться шляхом заміни двох видів пробігів GC (малих другорядних та одного великого на Tenured Gen) на рівновеликі малі.

Детальніше див. Тут: http://geekroom.de/java/java-expertise-g1-fur-java-7/


1

Я працюю з Java для маленької та великої купи, і питання про GC та Full GC з’являється щодня, оскільки обмеження можуть бути більш суворими, ніж інші: в певному середовищі 0,1 секунди GC для сміття або Full GC вбивають просто fonctionnalité, і мають чітку конфігурацію та можливості, це важливо (CMS, iCMS, інші ... ціль тут, щоб мати якнайкращий час реакції при майже реальному часі обробки (тут обробка в реальному часі часто становить 25 мс) , тому, в основному, вітаються будь-які вдосконалення в ергономічності та евристиці GC!


1

Я використовую G1GC на Java 8, а також з Groovy (також Java 8), і я роблю різні види навантажень, і в цілому G1GC працює так:

  • Використання пам’яті дуже низьке, наприклад 100 Мб замість 500 Мб порівняно із налаштуваннями Java за замовчуванням

  • Час відгуку постійний і дуже низький

  • Продуктивність між налаштуваннями за замовчуванням і G1GC становить 20% уповільнення при використанні G1GC в гіршому випадку (без налаштування, однопоточна програма). Це мало що враховує хороший час відгуку та низьке використання пам'яті.

  • При запуску від багатопоточного Tomcat загальна продуктивність на 30% краща, а використання пам'яті значно нижче, а також час відгуку значно нижчий.

Отже, загалом, використовуючи дійсно різні робочі навантаження, G1GC є дуже хорошим колектором для Java 8 для багатопотокових програм, і навіть для однопотокових є деякі переваги.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.