Введение
Управление памятью — это процесс распознавания, когда выделенные объекты больше не нужны, освобождения (освобождения) памяти, используемой такими объектами, и предоставления ее для последующего выделения . В некоторых языках программирования за управление памятью отвечает программист. Распространенной проблемой явного управления памятью является утечка места. Эти утечки происходят, когда память выделяется и больше не используется, но не освобождается. Альтернативный подход к управлению памятью, который сейчас широко используется, особенно в большинстве современных объектно-ориентированных языков, — это автоматическое управление программой, называемой сборщиком мусора.
Преимущество сборки мусора :
Сборка мусора избавляет программистов от бремени освобождения выделенной памяти. Знать, когда следует явно освобождать выделенную память, может быть очень непросто. Передача этой работы JVM имеет несколько преимуществ.
Сборщик мусора отвечает за
- распределение памяти
- Обеспечение того, чтобы все объекты, на которые имеются ссылки, оставались в памяти, и
- Восстановление памяти, используемой объектами, которые больше не доступны по ссылкам в исполняемом коде.
Корни сборки мусора — источник всех деревьев объектов
Каждое дерево объектов должно иметь один или несколько корневые объекты. Пока приложение может достигать этих корней, все дерево доступно, но когда эти корневые объекты считаются достижимыми? Специальные объекты, называемые корнями сборки мусора (корни сборки мусора; см. Рисунок ниже), всегда доступны, как и любой объект, имеющий корень сборки мусора в своем собственном корне.
В Java есть четыре типа корней GC:
- Локальные переменные поддерживаются стеком потока. Это не виртуальная ссылка на реальный объект, поэтому она не видна. Во всех смыслах локальные переменные являются корнями сборщика мусора.
- Активные потоки Java всегда считаются живыми объектами и, следовательно, являются корнями сборки мусора. Это особенно важно для локальных переменных потока.
- На статические переменные ссылаются их классы. Этот факт делает их де-факто корнями GC. Сами классы могут быть обработаны сборщиком мусора, что приведет к удалению всех статических переменных, на которые имеются ссылки. Это особенно важно, когда мы используем серверы приложений, контейнеры OSGi или загрузчики классов в целом. Мы обсудим связанные проблемы в разделе «Шаблоны проблем».
- Ссылки JNI — это объекты Java, созданные собственным кодом как часть вызова JNI. Созданные таким образом объекты обрабатываются особым образом, потому что JVM не знает, ссылается на нее собственный код или нет. Такие объекты представляют собой особую форму корня сборщика мусора..
Создание кучи для сборки мусора в Java
Java-объекты создаются в куче, а куча делится на три части или поколения для сборки мусора в Java, они называются молодым поколением, постоянным или старым поколением и пермской областью кучи.
В типичном приложении большинство объектов очень недолговечны. С другой стороны, некоторые объекты существуют очень долго и даже до завершения работы приложения. При использовании сборки мусора по поколениям область кучи делится на две области — молодое поколение и старое поколение, которые собираются с помощью разных стратегий. Объекты обычно создаются в молодой области. После того, как объект пережил пару циклов сборки мусора, он передается старому поколению.
Новое поколение далее делится на три части, известные как пространство Эдема, пространство Выжившего 1 и Выжившего 2. Когда объект впервые создается в куче, он создается в новом поколении внутри пространства Eden, а после последующей сборки второстепенного мусора, если объект выживает, он перемещается в
Survivor 1, а затем Survivor 2 до того, как основная сборка мусора переместится, что объект для старой или постоянной генерации.
Постоянная генерация кучи или пермской области кучи является чем-то особенным и используется для хранения метаданных, связанных с классами и методами, в JVM, а также содержит пул строк, предоставляемый JVM.
Полный GC и параллельная сборка мусора в Java
Параллельный сборщик мусора в java использует один поток сборщика мусора, который выполняется одновременно с потоками приложения с целью завершения сбора временного поколения до того, как оно заполнится. В нормальном режиме параллельный сборщик мусора может выполнять большую часть своей работы с запущенными потоками приложения, поэтому потоки приложения видят только короткие паузы. В качестве отката, если параллельный сборщик мусора не может завершить работу до заполнения временного поколения, приложение приостанавливается, а сборка завершается со всеми остановленными потоками приложения. Такие коллекции с остановленным приложением называются полными сборками мусора или полным сборщиком мусора и являются признаком того, что необходимо внести некоторые изменения в параметры параллельной сборки. Всегда старайтесь избегать или минимизировать полную сборку мусора или Полный сборщик мусора, потому что это влияет на производительность приложения Java. Когда вы работаете в сфере финансов для электронной торговой платформы и с системами большого объема с малой задержкой, производительность Java-приложения становится чрезвычайно важной, и вам определенно хотелось бы избежать полного GC в течение периода торговли.
Пример сборки мусора и управления памятью с использованием кода Java. В приведенном ниже коде мы проверяем размер памяти перед созданием массива из 10000 строк, после его создания, после инициализации и после освобождения всех объектов.. Использование памяти печатается после каждого этапа.
Код Java: перейдите в редактор
открытый класс MemoryDemo {public static void main (String [ ] args) выбрасывает InterruptedException {Runtime r = Runtime.getRuntime (); long mem1, mem2; String someints [] = new String [10000]; System.out.println ("Общий объем памяти:" + r.totalMemory ()) ; mem1 = r.freeMemory (); System.out.println ("Начальная свободная память:" + mem1); r.gc (); mem1 = r.freeMemory (); System.out.println ("Свободная память после мусора collection: "+ mem1); for (int i = 0; i
Вывод:
(ваш вывод может соответствовать версии JVM и ОС )
Резюме:
- Java Heap разделен на три поколения для сбора мусора: молодое поколение, старое или старое поколение и Пермский край.
- Новые объекты — это создается в молодом поколении и впоследствии передается старому поколению.
- Строковый пул создается в пермской области кучи, мусорное кольцо Лекция может происходить в перманентном пространстве, но зависит от JVM в JVM.
- Незначительная сборка мусора используется для перемещения объекта из пространства Eden в пространство Survivor 1 и Survivor 2, а Major collection используется для перемещения объекта. от молодого поколения к постоянному поколению.
- Каждый раз, когда происходит крупная сборка мусора, потоки приложения останавливаются в течение этого периода, что снижает производительность и пропускную способность приложения.
- Улучшения производительности незначительны. был применен в сборке мусора в java 6, и мы обычно используем JRE 1.6.20 для запуска нашего приложения.
- Параметры командной строки JVM –Xmx и -Xms используются для установки начального и максимального размера для Java Heap . Идеальное соотношение этого параметра — 1: 1 или 1: 1,5, исходя из моего опыта, например, вы можете иметь либо –Xmx, и –Xms как 1 ГБ, либо –Xms 1,2 ГБ и 1,8 ГБ.
- В Java нет ручного способа сборки мусора.
Редактор кода Java: