JavaRush /Java Blog /Random-KO /Java 메모리 관리(및 코드 저장) 가이드
pandaFromMinsk
레벨 39
Минск

Java 메모리 관리(및 코드 저장) 가이드

Random-KO 그룹에 게시되었습니다
번역가의 메모: 이 메모를 번역하고 싶은 마음은 6월의 어느 이른 아침 지하철에서 반쯤 잠들어 있던 메모를 읽은 후 나타났습니다. 대상: Java 세계에 첫 발을 내딛는 사람들, 기본 기술 배경이나 욕구의 특성으로 인해 Java의 내부로 들어가 모든 "전기 역학" 프로세스를 배우고 싶어하는 사람들입니다. 이 글을 읽는 분들에게는 이것이 JVM과 GC 구성의 세계로 여행을 떠나는 출발점이 될 것이라고 확신합니다. 순풍! 원본 기사는 여기 개발자로서 Java 애플리케이션에서 버그를 제거하고 필요한 성능을 얻는 데 수많은 시간을 소비합니다. 테스트하는 동안 애플리케이션이 점차적으로 느리게 실행되고 결국 완전히 충돌하거나 성능이 저하되는 것을 발견했습니다. 결국 메모리 누수가 발생한다는 사실을 받아들입니다. 가비지 수집기 Java는 이러한 누출을 처리하기 위해 최선을 다합니다. 하지만 이런 상황에 직면했을 때 할 수 있는 일은 너무 많습니다. 메모리 누수 호출을 식별하고, 원인을 식별하고, 전체 애플리케이션 성능에 영향을 미치는 Java 가비지 수집기의 역할을 이해하는 방법이 필요합니다.

Java 메모리 누수의 주요 증상

응용 프로그램에 메모리 누수 문제가 있음을 나타내는 몇 가지 증상이 있습니다. 갑작스러운 애플리케이션 오류가 아니라 성능이 약간 저하되는 것은 메모리 누수를 나타낼 뿐입니다. 문제는 작동 중에 매번 또는 애플리케이션이 대량의 데이터로 작업을 시작하거나 반대로 애플리케이션 확장을 시작할 때만 발생할 수 있습니다. 누수로 인해 사용 가능한 메모리 리소스가 모두 소모되면 애플리케이션에 메모리 부족 오류가 표시될 수 있습니다. 애플리케이션을 다시 시작하고 최선의 결과를 기대한다면 누출이 수정될 때까지 반복적으로 충돌이 발생하게 됩니다. 일반적으로 메모리 누수는 메모리를 해제하는 대신 객체 참조가 누적될 때 발생합니다. 이는 사용 가능한 모든 메모리를 점유하고 애플리케이션이 필요한 리소스에 액세스하는 것을 불가능하게 만듭니다.

메모리 누수로 나타나는 구성 오류

Перед тем, How заглянете в ситуации вызывающие проблемы с памятью Java и проведете анализ, необходимо убедиться, что исследования не имеют отношения к абсолютно другой задаче. Часть ошибок out-of-memory возникают из-за различных ошибок, например ошибок конфигурации. У applications, возможно, недостаток памяти в куче or оно конфликтует в системе с другими applicationsми. Если начинаете говорить о проблемах нехватки памяти, но не можете определить что вызывает утечку, взгляните на приложение по-другому. Обнаружится, что нужно сделать изменения в потоке финализации or увеличить объем permanent generation пространства, являющегося областью памяти JVM для хранения описания классов Java и некоторых дополнительных данных.

Преимущества инструментов мониторинга памяти

Инструменты мониторинга памяти дают бОльшую видимость использования доступных ресурсов приложением 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 делают ваш процесс разработки намного легче.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION