JavaRush /Java Blog /Random-IT /Una guida per gestire la memoria Java (e salvare il codic...
pandaFromMinsk
Livello 39
Минск

Una guida per gestire la memoria Java (e salvare il codice)

Pubblicato nel gruppo Random-IT
Nota del traduttore: il desiderio di tradurre il biglietto è apparso una mattina presto di giugno dopo averlo letto mezzo addormentato in un vagone della metropolitana. Destinatari: persone che stanno muovendo i primi passi nel mondo di Java e, per la natura del loro background tecnico di base o del loro desiderio, sono molto desiderosi di entrare nel cofano di Java e apprendere tutti i processi “elettrodinamici”. Sono sicuro che per chi leggerà questo, questo sarà il punto di partenza per un viaggio nel mondo della configurazione della JVM e del GC. Buon vento! Articolo originale qui In qualità di sviluppatore, trascorri innumerevoli ore a eliminare i bug da un'applicazione Java e ottenere prestazioni dove è necessario. Durante il test, noti che l'applicazione funziona gradualmente più lentamente e alla fine si blocca completamente o mostra semplicemente prestazioni scadenti. Alla fine accetta che si verifichino perdite di memoria. Garbage Collector Java fa del suo meglio per gestire queste perdite. Ma ci sono solo un certo numero di cose che si possono fare di fronte a situazioni come queste. Sono necessari metodi per identificare le chiamate di perdita di memoria, identificare le cause e comprendere il ruolo del Garbage Collector Java nell'influenzare le prestazioni complessive dell'applicazione.

Principali sintomi delle perdite di memoria Java

Esistono diversi sintomi che indicano che un'applicazione presenta problemi di perdita di memoria. Un leggero calo delle prestazioni, anziché un improvviso errore dell'applicazione, indica solo una perdita di memoria. Il problema può verificarsi ogni volta durante il funzionamento oppure solo quando l'applicazione inizia a lavorare con una grande quantità di dati o, al contrario, si inizia a ridimensionare l'applicazione. L'applicazione mostrerà probabilmente un errore di memoria esaurita una volta che la perdita ha consumato tutte le risorse di memoria disponibili. Se riavvii l'applicazione e speri per il meglio, incontrerai ripetuti arresti anomali finché la perdita non verrà risolta. In generale, le perdite di memoria si verificano quando i riferimenti agli oggetti si accumulano invece di liberare memoria. Occupano tutta la memoria disponibile e rendono impossibile all'applicazione l'accesso alle risorse di cui ha bisogno.

Errori di configurazione visualizzati come perdite di memoria

Prima di esaminare le situazioni che causano problemi di memoria Java e condurre un'analisi, è necessario assicurarsi che la ricerca non sia correlata a un problema completamente diverso. Alcuni errori di memoria insufficiente si verificano a causa di vari errori, come errori di configurazione. L'applicazione potrebbe avere memoria heap insufficiente o potrebbe essere in conflitto con altre applicazioni nel sistema. Se inizi a parlare di problemi di memoria insufficiente ma non riesci a capire cosa causa la perdita, dai un'occhiata diversa all'applicazione. Scoprirai che è necessario apportare modifiche al thread di finalizzazione o aumentare la quantità di spazio di generazione permanente, che è un'area della memoria JVM per archiviare le descrizioni delle classi Java e alcuni dati aggiuntivi.

Vantaggi degli strumenti di monitoraggio della memoria

Инструменты мониторинга памяти дают бОльшую видимость использования доступных ресурсов приложением Java. Используя данное ПО, вы делаете шаг для сужения поиска корня проблемы утечки памяти и прочих инцидентов связанных с производительностью. Инструменты идут в нескольких категориях, и вам, возможно, нужно использовать множество приложений, чтобы разобраться How начать правильно обозначать проблему и что пошло не так, даже если вы имеете дело с утечками памяти. Heap dump (дампа кучи) файлы дают необходимые сведения для анализа Java-памяти. В этом случае вам нужно использовать два инструмента: один для генерации дамп-file и другой для подробного анализа. Такое решение дает детализированную информацию о том, что происходит с приложением. Один раз инструмент указывает места возможных проблем и работает над сужением площади, чтобы обнаружить точное место возникновения инцидента. И этот период времени - время самой длинной и портящей настроение части проб и ошибок. Анализатор памяти указывает несколько проблем в codeе, но вы не уверены абсолютно, с Howими проблемами столкнулось ваше приложение. Если всё ещё сталкиваетесь с прежней ошибкой, начните сначала и поработайте над другой возможной ошибкой. Сделайте одно изменение за раз и попытайтесь продублировать ошибку. Нужно будет дать приложению поработать некоторое время, чтобы продублировать условия возникновения ошибки. Если при первом тесте происходит утечка памяти, не забудьте протестировать приложение под нагрузкой. Приложение может работать отлично с небольшим количеством данных, но может снова выбросить прежние ошибки при работе с большим объемом данных. Если еще возникает всё та же самая ошибка, нужно начать сначала и разобрать другую возможную причину. Инструменты мониторинга памяти доказывают свою пользу после того, когда приложение стало fully работающим. Можно удаленно наблюдать за производительностью JVM и проактивным обнаружением сбойных ситуаций перед тем, How разработчик погрузится в проблему и будет собирать исторические данные производительности, чтобы помочь себе в будущем улучшить техники программирования и наблюдать How Java работает под тяжелой нагрузкой. Многие решения включают режимы оповещения "опасность" or другие подобные режимы и разработчик сразу может знать, что происходит не так, How хотелось. Каждый разработчик не хочет, чтобы критическое приложение, будучи в промэксплуатации, падало и являлось причиной потери десятков or сотен тысяч долларов во время простоя applications, поэтому инструменты мониторинга памяти уменьшают время реагирования разработчика. Приложения мониторинга памяти дают начать процесс диагностики мгновенно, instead of того, чтобы попросить вас пойти к заказчику, где никто не скажет Howая именно ошибка случилось or Howой code ошибки выдало приложение. Если часто погружаетесь в проблемы памяти и производительности вашего Java-applications, плотно возьмитесь за процесс тестирования. Обозначьте каждую слабую область в процессе разработки и измените стратегии тестирования. Посоветуйтесь с коллегами и сравните свои подходы тестирования с существующими лучшими практиками. Иногда вам надо пересмотреть маленький фрагмент codeа и далее обеспечить длительное воздействие на все приложение.

Роль Garbage Collector на память Java и утечки памяти

Garbage Collector (cборщик мусора) в Java играет ключевую роль в производительности applications и использования памяти. Он ищет неиспользуемые (мертвые) an objectы и удаляет их. Эти an objectы больше не занимают память, так что ваше приложение продолжает обеспечивать доступность ресурсов. Иногда приложение не дает GC достаточно времени or ресурсов для удаления мертвых an objectов и они накапливаются. Можно столкнуться с такой ситуацией когда идет активное обращение к an objectм, которые, вы полагаете, мертвы. Сборщик мусора не может сделать ничего c этим, т.к. его механизм автоматизированного управления памяти обходит активные an objectы. Обычно сборщик мусора работает автономно, но необходимо настроить его поведение на реагирование тяжелых проблем с памятью. Однако, GC может сам приводить к проблемам производительности.

Области GC

Сборщик мусора для оптимизации сборки разделяет an objectы на разные области. В Young Generation представлены an objectы, которые отмирают быстро. Сборщик мусора часто работает в этой области, с того момента, когда он должен проводить очистку. Объекты оставшиеся живыми по достижению определенного периода переходят в Old Generation. В области Old Generation an objectы остаются долгое время, и они не удаляются сборщиком так часто. Однако, когда сборщик работает в области, приложение проходит проходит через большую операцию, где сборщик смотрит сквозь живые an objectы для очистки мусора. В итоге an objectы applications находятся в конечной области permanent generation. Обычно, эти an objectы включают нужные метаданные JVM. Приложение не генерирует много мусора в Permanent Generation, но нуждается в сборщике для удаления классов когда классы больше не нужны.

Связь между Garbage Collector и временем отклика

Сборщик мусора, независимо от приоритета исполнения потоков applications, останавливает их не дожидаясь завершения. Такое явление называется событием "Stop the World". Область Young Generation сборщика мусора незначительно влияет на производительность, но проблемы заметны, если GC выполняет интенсивную очистку. В конечном итоге вы оказываетесь в ситуации, когда минорная сборка мусора Young Generation постоянно запущена or Old Generation переходит в неконтролируемое состояние. В такой ситуации нужно сбалансировать частоту Young Generation с производительностью, которая требует увеличение размера этой области сборщика. Области Permanent Generation и Old Generation сборщика мусора значительно влияют на производительность applications и использования памяти. Эта операция major очистки мусора проходит сквозь heap, чтобы вытолкнуть отмершие an objectы. Процесс длится дольше чем minor сборка и влияние на производительность может идти дольше. Когда высокая интенсивность очистки и большой размер области Old Generation, производительность всего applications увязывает из-за событий "Stop the world". Оптимизация сборки мусора требует мониторинга How часто программа запущена, влияния на всю производительность и способов настройки параметров applications для уменьшения частоты мониторинга. Возможно нужно будет идентифицировать один и тот же an object, размещенный больше, чем один раз, причем приложению не нужно отгораживаться от размещения or вам надо найти точки сжатия, сдерживающие всю систему. Получение правильного баланса требует уделения близкого внимания ко всему от нагрузки на CPU до циклов вашего сборщика мусора, особенно если Young и Old Generation несбалансированы. Адресация утечек памяти и оптимизация сборки мусора помогает увеличить производительность Java-applications. Вы буквально жонглируете множеством движущихся частей. Но с правильным подходом устранения проблем и инструментами анализа, спроектированных чтобы дать строгую видимость, вы достигнете света в конце туннеля. В противном случае замучаетесь с возникающими неполадками связанных с произодительностью. Тщательное размещение памяти и её мониторинг играют критическую роль в Java-приложении. Необходимо fully взять в свои руки взаимодействие между сборкой мусора, удалением an objectов и производительностью, чтобы оптимизировать приложение и избежать ошибок упирающихся в нехватку памяти. Инструменты мониторинга дают оставаться на высоте, чтобы обнаружить возможные проблемы и обозначить тенденции утorзации памяти так, что вы принимаете проактивный подход к исправлению неисправностей. Утечки памяти часто показывают неэффективность устранения неисправностей обычным путем, особенно если вы сталкиваетесь с неверными значениями параметров конфигурации, но решения вопросов связанных с памятью помогают быстро избежать инцидентов стоящих у вас на пути. Совершенство настройки памяти Java и GC делают ваш процесс разработки намного легче.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION