Как работает сборка мусора в Java (JVM)
Источник:
DZoneПроцесс сборки мусора в Java
Сборка мусора в Java автоматически выделяет и освобождает память, поэтому разработчикам не нужно писать отдельную программу для управления памятью, что является одним из основных преимуществ программирования на Java.
Каждый раз, когда Java-программа запускается на JVM, объекты создаются в куче (heap) и представляют собой часть памяти, предназначенную для программы. Со временем некоторые предметы больше не понадобятся. Сборщик мусора находит эти неиспользуемые объекты и удаляет их, чтобы освободить память.
Сборщик мусора, оценив кучу памяти, определит, какие объекты используются, а какие нет, и удалит неиспользуемые объекты. Используемый объект или объект, на который имеется ссылка, означает, что некоторая часть вашей программы все еще поддерживает указатель на этот объект.
Если объект уже не используется или, на него нет ссылок, то какая-либо часть программы на него больше не будет ссылаться. Таким образом, память, которая используется объектом, на который нет ссылки, может быть освобождена путем выполнения сборки мусора.
Освобождение памяти можно описать тремя основными процессами:
- Маркировка.
- Обычное удаление.
- Удаление с уплотнением.
Маркировка — это процесс идентификации частей памяти, которые используются и не используются сборщиком мусора. Обычно маркировка является первым этапом.
Обычное удаление — процесс удаления объектов, на которые нет ссылок, с оставлением в свободном пространстве объектов и указателей, на которые есть ссылки.
Удаление с уплотнением — помимо удаления объектов, на которые нет ссылок, оно сжимает оставшиеся объекты, на которые имеются ссылки, перемещая объекты вместе, чтобы сделать новое выделение памяти намного проще и быстрее.
JVM Heap Memory
Young Generation
Вновь созданные объекты начинаются в Young Generation. Его еще называют ясли, так как здесь начинают жить новые объекты. Young Generation подразделяется на Eden Space, где начинаются все новые объекты, и два пространства Survivor , где объекты перемещаются из Eden после сохранения (surviving) в одном цикле сборки мусора. Они вызывают повторную сборку мусора, когда объекты собираются сборщиком мусора из Young Generation.
Eden Space
Все новые объекты сначала создаются в Eden Space. Незначительный сбор мусора сработает, когда он достигнет порога, определяемого JVM. Упомянутые объекты перемещаются из Eden Space в пространство первого сохранения (‘Eden’ and ‘from’ —> ‘to’). Объекты, на которые нет ссылок, удаляются при очистке Eden Space.
Survivor 0 (S0) and Survivor 1 (S1)
Оба поля survivor (From and to) начинаются пустыми. Когда происходит повторная сборка мусора, все объекты, на которые есть ссылки, перемещаются в оставшееся пространство. Когда сборка мусора закончится, места (имена) survivor «from» и «to» меняются местами. Если во время предыдущей сборки мусора S1 был в роли «to», то теперь S1 заполнен и становится «from». Соответственно, если S0 пусто, то оно станет «to».
Old Generation
После незначительной сборки мусора, когда устаревшие объекты достигают определенного порога возраста (по умолчанию порог современных JVM установлен на 15 циклов сборки мусора), они вместе с объектами-долгожителями переходят из молодого поколения в старое.
Поскольку второстепенные сборщики мусора продолжают возникать, объекты продолжают перемещаться в пространство Old Generation, оно начнет заполняться и произойдет основной сбор мусора.
Основная сборка мусора происходит, когда объекты собираются сборщиком мусора Old Generation.
Permanent Generation
Метаданные, такие как классы и методы, хранятся в Permanent Generation (постоянном поколении). Классы, которые больше не используются, могут быть из него удалены сборщиком мусора. Во время полного сбора мусора неиспользуемые объекты всех поколений собираются.
Типы сборки мусора
Сборки мусора, очищающие различные части внутри кучи, часто называют Minor, Major и Full сборками мусора. Но, поскольку термины Minor, Major и Full широко используются и без надлежащего определения, мы рассмотрим объяснение всех этих типов сборки мусора.
Minor Garbage Collection
Сборка мусора из пространства Young Generation называется Minor Garbage Collection. Этот тип сборки всегда запускается, когда JVM не может выделить место для нового объекта, то есть когда Eden Space заполняется. Таким образом, чем выше скорость выделения, тем чаще происходит Minor Garbage Collection.
Major Garbage Collection
Major Garbage Collection очищает Tenured (старое пространство). Поскольку Old Generation больше по размеру, сборка происходит реже, чем у Young Generation. Когда объекты исчезают из Old Generation, мы говорим, что произошел «большая сборка мусора». Сборщик Old Generation попытается предугадать, когда ему нужно начать сборку, чтобы избежать неудач в продвижении со стороны Young Generation.
Сборщики отслеживают порог заполнения для Old Generation и начинают сборку, когда этот порог превышен. Если этого порога недостаточно для удовлетворения требований продвижения, запускается «Full Garbage Collection».
Full Garbage Collection
Full Garbage Collection очищает всю кучу — как молодые, так и старые пространства. Многие путаются между Major (только OLD поколение) и Full GC (Young + OLD (Heap)). Full Garbage Collection включает продвижение всех живых объектов от молодого до старого поколения после сборки и уплотнения старого поколения. Полная сборка мусора будет остановкой для Stop-the-World. Она следит за тем, чтобы новые объекты не выделялись и объекты не становились недоступными во время работы сборщика.
15 важных вопросов про Spring на техническом собеседовании
Источник:
Dev.to
Spring Framework — это универсальный фреймворк для платформы Java. Его основные функции могут использоваться любым приложением Java, также существуют расширения для создания веб-приложений на основе Java EE. Представляем вашему вниманию список вопросов и ответов на собеседовании, относящихся к кодированию на Spring. Надеемся, что они помогут вам подготовиться к техническому собеседованию в 2021 году.
1. Что такое Spring?
Ответ:
Spring — это фреймворк с открытым исходным кодом для разработки приложений на Java. Основные функции Spring Framework можно использовать при разработке любого приложения Java, также имеются расширения для создания веб-приложений на основе платформы Java EE. Фреймворк Spring нацелен на упрощение использования J2EE в разработке, и улучшение практики программирования путем включения модели на основе POJO (Plain Old Java Object).
2. Какова область действия по умолчанию у bean-компонента в Spring framework?
Ответ:
Область действия bean-компонента по умолчанию —
Singleton (шаблон проектирования).
3. Что такое Bean wiring?
Ответ:
Bean wiring (подключение Bean) — это действие по созданию ассоциаций между компонентами приложения (beans) в контейнере Spring.
4. Что такое Spring Security?
Ответ:
Spring Security — это отдельный модуль инфраструктуры Spring, который фокусируется на предоставлении методов аутентификации и авторизации в приложениях Java. Он также устраняет большинство распространенных уязвимостей безопасности, таких как атаки CSRF.
Чтобы использовать Spring Security в веб-приложениях, можно начать с простой аннотации: @EnableWebSecurity.
5. Что содержится в определении bean-компонента?
Ответ:
Определение bean-компонента содержит информацию, называемую метаданными конфигурации, которая необходима контейнеру, чтобы знать следующее:
- Как создать bean;
- Подробности жизненного цикла bean;
- Зависимости bean.
6. Что такое Spring Boot?
Ответ:
Spring Boot — это проект, который предоставляет предварительно настроенный набор фреймворков для уменьшения шаблонной конфигурации, чтобы вы могли запускать и запускать приложение Spring с минимальным объемом кода.
7. Что такое DispatcherServlet и для чего он используется?
Ответ:
DispatcherServlet — это реализация шаблона проектирования Front Controller, который обрабатывает все входящие веб-запросы к приложению Spring MVC. Шаблон Front Controller (шаблон проектирования корпоративного приложения) — это распространенный шаблон в веб-приложениях, задача которого заключается в получении всего запроса и его маршрутизации в различные компоненты приложения для фактической обработки.
В Spring MVC DispatcherServlet используется для поиска правильного контроллера для обработки запроса. Это делается с помощью сопоставления обработчиков: например, аннотации @RequestMapping.
8. Нужен ли spring-mvc.jar в пути к классам или он является частью spring-core?
Ответ:
Spring-mvc.jar является частью spring-core, что означает, что если вы хотите использовать инфраструктуру Spring MVC в своем проекте Java, то вы должны включить ее spring-mvc.jar в путь к классам вашего приложения. В веб-приложении Java spring-mvc.jar обычно помещается в папку /WEB-INF/lib.
9. Каковы преимущества использования Spring?
Ответ:
Ниже приводится список некоторых преимуществ использования Spring Framework:
- Легкость — Spring относительно легкий, когда дело касается размера и прозрачности. Базовая версия Spring Framework составляет около 2 МБ.
- Инверсия управления (Inversion of control, IOC) — Слабая связанность (loose coupling) достигается в Spring с использованием техники инверсии управления. Объекты предоставляют свои зависимости вместо того, чтобы создавать или искать зависимые объекты.
- Аспектно-ориентированность — Spring поддерживает аспектно-ориентированное программирование и обеспечивает согласованную разработку, отделяя бизнес-логику приложения от системных служб.
- Контейнеры — Spring Container создаёт объекты, связывает их вместе, настраивает и управляет ими от создания до момента удаления.
- MVC Framework — веб-фреймворк Spring — это хорошо спроектированный веб-фреймворк MVC, который обеспечивает альтернативу таким веб-фреймворкам, как Struts или другим излишне спроектированным или менее популярным веб-фреймворкам.
- Управление транзакциями — Spring имеет согласованный интерфейс управления транзакциями, который может масштабироваться до локальной транзакции (например, с использованием одной базы данных) или глобальных транзакций (например, с использованием JTA).
- Обработка исключений — Spring предоставляет удобный API для преобразования исключений, связанных с конкретной технологией (например, вызванных JDBC, Hibernate или JDO) в согласованные, непроверенные исключения.
10. Что такое Spring beans?
Ответ:
Spring beans — это экземпляры объектов, которыми управляет Spring Container. Они создаются и подключаются фреймворком и помещаются в «мешок объектов» (контейнер), откуда вы можете их позже извлечь.
«Связка» (wiring) — это то, что является внедрением зависимостей. Это означает, что вы можете просто сказать: «Мне нужна эта вещь», и фреймворк будет следовать определенным правилам для получения этого объекта.
11. Какова цель модуля Core Container?
Ответ:
Контейнер ядра обеспечивает основные функции платформы Spring. Первичным компонентом основного контейнера является BeanFactory — реализация шаблона Factory. BeanFactory применяет Инверсию управление для разделения конфигурации и зависимостей спецификации приложения от фактического кода приложения.
12. Что такое контекст приложения (Application Context)?
Ответ:
На первый взгляд, контекст приложения такой же, как и фабрика компонентов (bean factory). Оба загружают определения bean-компонентов, объединяют bean-компоненты вместе и распределяют их по запросу. Но он также обеспечивает:
- Средство для разрешения текстовых сообщений, включая поддержку интернационализации.
- Общий способ загрузки файловых ресурсов.
- События для beans, которые зарегистрированы как слушатели (listeners).
13. Как интегрировать Java Server Faces (JSF) с Spring?
Ответ:
JSF и Spring действительно имеют одни и те же функции, особенно в области сервисов Инверсии управления. Объявляя управляемые компоненты JSF в файле конфигурации faces-config.xml, вы позволяете FacesServlet создавать экземпляр этого bean-компонента при запуске. Ваши страницы JSF имеют доступ к этим bean-компонентам и всем их свойствам. JSF и Spring можно интегрировать двумя способами:
DelegatingVariableResolver: Spring поставляется с преобразователем переменных JSF, который позволяет вам использовать JSF и Spring вместе. DelegatingVariableResolver сначала делегирует поиск значений интерпретатору по умолчанию базовой реализации JSF, а затем — «бизнес-контексту» Spring WebApplicationContext. Это позволяет легко внедрять зависимости в JSF-управляемые компоненты.
FacesContextUtils: настраиваемый VariableResolver хорошо работает при отображении своих свойств на bean-компоненты в faces-config.xml. Но если потребуется захватить bean-компонент, то класс FacesContextUtils это упрощает. Он похож на WebApplicationContextUtils, за исключением того, что принимает параметр FacesContext, а не параметр ServletContext.
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext (FacesContext.getCurrentInstance ());
14. Что такое Spring MVC framework?
Ответ:
Инфраструктура
Spring Web MVC предоставляет архитектуру model-view-controller и готовые компоненты, которые можно использовать для разработки гибких и слабосвязанных веб-приложений. Шаблон MVC приводит к разделению различных аспектов приложения (логика ввода, бизнес-логика и логика пользовательского интерфейса), обеспечивая при этом слабую связь между этими элементами.
15. Как происходит обработка событий в Spring?
Ответ:
Обработка в
ApplicationContext обеспечивается через
ApplicationEvent класса и
ApplicationListener интерфейса. То есть если bean-компонент реализует
ApplicationListener, то каждый раз, когда
ApplicationEvent публикуется в
ApplicationContext, этот bean-компонент регистрируется.
Спасибо за чтение и удачи в вашем техническом собеседовании!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ