JavaRush /Курсы /Java Collections /Вопросы к собеседованию 4 уровень

Вопросы к собеседованию 4 уровень

Java Collections
4 уровень , 14 лекция
Открыта

— Привет, Амиго!

Вопросы к собеседованиям
1 Что такое сборка мусора?
2 Когда вызывается метод finalize?
3 Что произойдет, если в методе finalize возникнет исключение?
4 Что такое SoftReference?
5 Что такое WeakReference?
6 Что такое PhantomReference?
7 Как работает WeakHashMap? Где он используется?
8 Зачем нужно передавать очередь в конструктор PhantomReference?
9 Зачем нужен логгер?
10 Какие настройки логгера вы знаете?
Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Denis Odesskiy Уровень 42
7 ноября 2024
1. Сборщиков мусора сегодня много у java разных, работают некоторые из них сильно иначе. В последних так вообще размыто само по себе понятие Eden и прочее (их по сути нет, есть фрагментированные области и с разными областями сборщик и работает, например такой как ZGC). Для ознакомления хороший видосик. 2. Перед тем как объект будет уничтожен сборщиком мусора, но бывает что никогда😏. Также статья на хабре. 3. Выход из метода произойдет и gs продолжит работу, однако финализатор вещь опасная (но не бесполезная, аккуратно просто нужно😄), легко выстрелить себе в ногу и java не исключение в c# тоже... Почему? Финализируемые объекты в классе могут не завершится корректно в в случае ошибки, что приведет к утечки памяти и другим чудесам в работе программы. Найти такую ошибку будет крайне непросто. Также если финализатор по какой-то причине загружен какими-нибудь ресурсоёмкими действиями, это может привести к задержкам в работе gs и как следствие увеличению времени STW. 4-8. Статья на хабре. 9. Логгер нужен для логирования.😄 Для поиска ошибок, для оповещения статуса, что происходит в программе, для вывода информации на разные источники, консоль терминала, файл и т.п. Ведение журнала событий и прочее и прочее.... 10. Эээ... их как-бы очень много, как собственно и реализаций логгеров... Популярные log4j, log4j2, logger. Настройки можно прописывать в пропертях в xml в yml...
milniy87 Уровень 41
27 марта 2023
1. Сборка мусора (Garbage Collection) - это процесс автоматического освобождения памяти от объектов, которые больше не используются в программе. Сборщик мусора определяет, какие объекты могут быть удалены из памяти, основываясь на доступности объекта и его связей с другими объектами. 2. Метод finalize() вызывается перед удалением объекта из памяти сборщиком мусора. Этот метод может быть переопределен в классе для выполнения определенных действий перед удалением объекта, например, для освобождения ресурсов, связанных с объектом. 3. Если в методе finalize() возникнет исключение, оно будет проигнорировано и не будет обработано. Однако, если в классе есть финализируемые объекты, которые не могут быть удалены из-за ошибки в методе finalize(), это может привести к утечке памяти и неожиданному поведению программы. 4. SoftReference - это класс в Java, который позволяет создавать ссылки на объекты с мягкой ссылкой. Объекты, на которые есть только мягкая ссылка, будут удалены сборщиком мусора только в том случае, если в памяти не будет достаточно места. Это может быть полезно для кэширования объектов, которые не используются часто, но необходимы в программе. 5. WeakReference - это класс в Java, который позволяет создавать ссылки на объекты с слабой ссылкой. Объекты, на которые есть только слабая ссылка, будут удалены сборщиком мусора в любой момент, когда нет других ссылок на этот объект. Это может быть полезно для кэширования объектов, которые не нужны в программе, если есть малая вероятность их использования в будущем. 6. PhantomReference - это класс в Java, который позволяет создавать ссылки на объекты с фантомной ссылкой. Объекты, на которые есть только фантомная ссылка, будут удалены сборщиком мусора, когда нет других ссылок на этот объект и он помечен как "забытый" (phantomized). Это может быть полезно для уведомления программы о том, что объект был удален из памяти.
milniy87 Уровень 41
27 марта 2023
7. Как работает WeakHashMap? Где он используется? WeakHashMap - это реализация интерфейса Map, где ключи сохраняются как WeakReference. Это означает, что если ключ больше не используется другими частями программы и на него больше нет сильных ссылок, то он будет удален сборщиком мусора, и его значение в WeakHashMap также будет удалено. Основным применением WeakHashMap является кэширование. Когда данные больше не нужны в кэше, они автоматически удаляются, освобождая память. WeakHashMap также может использоваться для создания многопоточной коллекции, где каждый поток должен иметь свой собственный экземпляр Map, но каждый из них должен удалить свои ключи и значения, когда они больше не нужны, чтобы предотвратить утечку памяти. Пример использования WeakHashMap:


// Создаем WeakHashMap
WeakHashMap<MyKey, MyValue> weakHashMap = new WeakHashMap<>();

// Создаем ключ и значение для WeakHashMap
MyKey key = new MyKey();
MyValue value = new MyValue();

// Добавляем пару ключ-значение в WeakHashMap
weakHashMap.put(key, value);

// Вызываем сборщик мусора
System.gc();

// Проверяем, что ключ больше не находится в WeakHashMap
if (weakHashMap.get(key) == null) {
    System.out.println("Key has been removed from the WeakHashMap");
}
Здесь мы создаем WeakHashMap и добавляем в нее пару ключ-значение. Затем мы вызываем сборщик мусора, чтобы удалить объекты, на которые больше нет ссылок. В результате ключ будет удален из WeakHashMap, и мы проверяем, что он действительно был удален.
milniy87 Уровень 41
27 марта 2023
8. PhantomReference - это еще один тип ссылок в Java, который используется для отслеживания объектов, которые уже удалены сборщиком мусора. Как и WeakReference, PhantomReference может использоваться для предотвращения утечек памяти. Однако, в отличие от WeakReference, объекты, на которые ссылается PhantomReference, не удаляются немедленно после уничтожения последней сильной ссылки. Вместо этого они помещаются в специальную очередь, которую можно получить с помощью метода ReferenceQueue. При создании PhantomReference необходимо передать ссылку на объект, который будет отслеживаться, и ссылку на ReferenceQueue. Когда объект удаляется сборщиком мусора, его PhantomReference помещается в очередь. Это позволяет приложению выполнить необходимые действия перед окончательным удалением объекта.

// Объект, который будет отслеживаться
MyObject obj = new MyObject();

ReferenceQueue<MyObject> queue = new ReferenceQueue<>();

// Создаем PhantomReference, передавая объект и очередь
PhantomReference<MyObject> phantomRef = new PhantomReference<>(obj, queue);

obj = null;

System.gc();

PhantomReference<MyObject> refFromQueue = (PhantomReference<MyObject>) queue.remove();
if (refFromQueue == phantomRef) {
    // Выполняем необходимые действия перед окончательным удалением объекта
}
Здесь мы создаем объект MyObject и создаем PhantomReference, передавая этот объект и ссылку на очередь. Затем мы удаляем объект и вызываем сборщик мусора. После этого мы получаем PhantomReference из очереди и выполняем необходимые действия перед окончательным удалением объекта. Передача очереди в конструктор PhantomReference важна, потому что она позволяет приложению выполнять необходимые действия перед окончательным удалением объекта. Без очереди PhantomReference не будет выполнять свою функцию, поскольку объекты, на которые она ссылается, будут удаляться немедленно после уничтожения последней сильной ссылки.
milniy87 Уровень 41
27 марта 2023
9. Зачем нужен логгер? Логгирование (logging) является важной практикой в разработке программного обеспечения, которая позволяет записывать информацию о том, что происходит в программе во время ее выполнения. Логгирование может быть полезно в различных ситуациях, например: Помощь в поиске и устранении ошибок (debugging) Мониторинг производительности и использования ресурсов Построение аналитики использования приложения В Java для логгирования можно использовать различные библиотеки, такие как Log4j, java.util.logging и slf4j (Simple Logging Facade for Java). Логгеры позволяют управлять уровнем подробности записываемой информации, выбирать место записи логов (например, файл или консоль), а также настраивать формат выводимых сообщений. Логгирование может быть полезно как в разработке приложения, так и в его эксплуатации. Например, если у пользователя возникнут проблемы с приложением, логи могут помочь разработчикам идентифицировать и исправить проблему.
milniy87 Уровень 41
27 марта 2023
10. Какие настройки логгера вы знаете? В Java для настройки логгера используются файлы конфигурации. Наиболее распространенные файлы конфигурации - это log4j.properties для Log4j и logging.properties для java.util.logging. Настройки логгера включают в себя уровень логирования, место вывода логов, формат выводимых сообщений, а также дополнительные настройки для каждого конкретного логгера. Уровень логирования определяет, какие сообщения будут записываться в лог. Существуют следующие уровни логирования (в порядке возрастания уровня подробности): SEVERE WARNING INFO CONFIG FINE FINER FINEST Место вывода логов может быть настроено на консоль, в файл, на удаленный сервер, в базу данных и т.д. Формат выводимых сообщений может быть настроен с помощью форматтеров. Форматтеры могут использоваться для добавления дополнительной информации в логи, например, даты и времени, имени потока, имени класса и т.д. Дополнительные настройки могут включать в себя установку фильтров сообщений, задание максимального размера лог-файла, а также настройку поведения при возникновении ошибок в процессе логирования. Некоторые наиболее распространенные настройки логгера для Log4j:


# Установка уровня логирования
log4j.rootLogger=INFO, stdout

# Настройка вывода логов в консоль
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Некоторые наиболее распространенные настройки логгера для java.util.logging:
Артур Харатян Уровень 41
16 января 2021
15 августа 2022
thnx
Vorlock Уровень 31
21 января 2020
Igor Petrashevsky Уровень 47
23 августа 2022
404
Camilla Уровень 41
27 марта 2019
https://javarush.com/groups/posts/1762-chto-to-ne-nashjel-otvetov-na-voprosih-iz-sobesedovaniy-na-34-levele
yury Уровень 41
29 августа 2019
Хороший конспект, спасибо!
Koval Уровень 37
24 марта 2020
Ответы(Кому лень копировать)
Артур Харатян Уровень 41
16 января 2021
скопировал, позже дочитал коммент)