JavaRush /Курсы /Java Collections /Учимся гуглить | 4 уровень | 11 лекция

Учимся гуглить | 4 уровень | 11 лекция

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

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

Продолжаем наши уроки – учимся гуглить.

Вот тебе несколько заданий:

Что надо найти в Google
1 Как работает сборщик мусора в Java
2 Какие бывают виды сборщиков мусора
3 Что такое «поколения» объектов
4 Для чего используется SoftReference
5 Пример использования SoftReference
6 Пример использования WeakReference
7 Зачем нужен WeakHashMap
8 Что такое логгер
9 Как настроить логгер
Комментарии (31)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
{Java_Shark} Уровень 36
13 февраля 2025
++
7 декабря 2023
Если кто найдет хорошее видео / статью где описывается Metaspace помимо поколений Eden, Survivor и Tenured буду очень благодарна, если поделитесь ссылкой. Какие бывают GC и их устройство, видео
milniy87 Уровень 41
25 марта 2023
1. Как работает сборщик мусора в Java? Сборщик мусора в Java автоматически удаляет объекты, которые больше не используются в программе, чтобы освободить память для новых объектов. Он работает путем периодического анализа всех объектов в куче памяти, чтобы определить, какие из них больше не доступны для программы, и освобождает память, занятую ими. 2. Какие бывают виды сборщиков мусора? В Java есть несколько видов сборщиков мусора: Serial: это простой и быстрый сборщик мусора, который работает в одном потоке и останавливает выполнение программы во время сборки мусора. Parallel: этот сборщик мусора использует несколько потоков для ускорения процесса сборки мусора. CMS (Concurrent Mark Sweep): этот сборщик мусора основан на алгоритме "маркировка-очистка" и работает с минимальными задержками, так как проводит сборку мусора параллельно с выполнением программы. G1 (Garbage First): это новый сборщик мусора, который разбивает кучу памяти на несколько регионов и проводит сборку мусора с приоритетом для наиболее заполненных регионов. 3. Что такое "поколения" объектов? Поколения объектов - это концепция, используемая в сборщиках мусора Java, которая предполагает, что объекты могут разделяться на группы в зависимости от их возраста и времени жизни. Обычно в Java выделяются три поколения объектов: Young Generation: это поколение объектов, которые были созданы недавно и которые быстро удаляются сборщиком мусора. Old Generation: это поколение объектов, которые прожили долгую жизнь и которые могут пережить несколько циклов сборки мусора. Perm Generation: это поколение объектов, содержащее метаданные приложения, такие как классы и методы, которые не изменяются во время выполнения программы.
milniy87 Уровень 41
25 марта 2023
4. SoftReference в Java используется для ссылки на объект, который должен быть удален из памяти только при необходимости. Это позволяет программе сохранять объекты в памяти, даже если на них нет явных ссылок, что может быть полезно для кэширования данных. В отличие от WeakReference, объекты, на которые ссылается SoftReference, не будут удалены из памяти, пока память не станет критически недостаточной. Когда память становится критически недостаточной, сборщик мусора может удалить объекты, на которые ссылается SoftReference, чтобы освободить память для более важных объектов. 5. SoftReference может быть использован для реализации кэширования данных. В следующем примере мы можем сохранить результаты вычисления функции в кеше SoftReference, чтобы не перевычислять их при каждом запросе:

public class FunctionCache {
    private final Map<String, SoftReference<Double>> cache = new HashMap<>();

    public double compute(String input) {
        SoftReference<Double> cachedResult = cache.get(input);
        if (cachedResult != null) {
            Double result = cachedResult.get();
            if (result != null) {
                return result;
            }
        }

        // Если результат не был найден в кеше, перевычисляем его и сохраняем в кеше
        double res = computeResult(input);
        cache.put(input, new SoftReference<>(result));
        return res;
    }

    private double computeResult(String input) {
        // Вычисление результата для заданного входного параметра
        return input.length() * Math.PI;
    }
}
В этом примере мы сохраняем результаты вычисления функции computeResult в кеше SoftReference, чтобы не перевычислять их при повторном вызове функции compute с тем же входным параметром. Если в кеше уже есть результат для заданного входного параметра, мы извлекаем его из SoftReference и возвращаем. Если результат не найден в кеше, мы его перевычисляем.
milniy87 Уровень 41
25 марта 2023
6. Пример использования WeakReference WeakReference может быть использован для сохранения ссылок на объекты, которые могут быть удалены из памяти в любое время, когда на них нет явных ссылок. Например, в следующем примере мы можем использовать WeakReference для хранения ссылок на объекты типа LargeObject, которые могут быть удалены из памяти, если на них больше не ссылается ни один другой объект:

import java.lang.ref.WeakReference;

public class LargeObject {
    // Класс, представляющий большой объект
}

public class WeakReferenceExample {
    public static void main(String[] args) {
        LargeObject largeObject = new LargeObject();
        WeakReference<LargeObject> weakReference = new WeakReference<>(largeObject);

        // В этом месте largeObject может быть удален из памяти, если на него больше не ссылается ни один другой объект

        // Можно получить ссылку на объект из WeakReference
        LargeObject reference = weakReference.get();
        if (reference != null) {
            // Обрабатываем объект
        } else {
            // Объект был удален из памяти, нужно выполнить соответствующие действия
        }
    }
}
В этом примере мы создаем объект типа LargeObject и сохраняем его в WeakReference. Затем мы получаем ссылку на объект из WeakReference и проверяем, не был ли он удален из памяти. Если объект все еще существует, мы можем работать с ним. Если объект был удален из памяти, мы можем выполнить соответствующие действия.
milniy87 Уровень 41
25 марта 2023
7. Зачем нужен WeakHashMap WeakHashMap - это реализация интерфейса Map, которая использует WeakReference для хранения ключей. Когда на ключ не остается явных ссылок, он может быть удален из WeakHashMap автоматически при следующей операции сборки мусора. Это может быть полезно для кэширования данных, когда ключи могут быть удалены из кеша, когда на них больше не ссылается ни один другой объект. Например, в следующем примере мы можем использовать WeakHashMap для реализации кеша, который автоматически удаляет неиспользуемые объекты:

import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;

public class Cache {
    private final Map<String, WeakReference<LargeObject>> cache = new WeakHashMap<>();

    public LargeObject get(String key) {
        WeakReference<LargeObject> cachedObject = cache.get(key);
        if (cachedObject != null) {
            return cachedObject.get();
        }
        return null;
    }

    public void put(String key, LargeObject value) {
        cache.put(key, new WeakReference<>(value));
    }
}
В этом примере мы используем WeakHashMap для сохранения ссылок на объекты типа LargeObject. Когда на ключ не остается явных ссылок, он может быть удален из WeakHashMap автоматически при следующей операции очистки сборщиком мусора.
milniy87 Уровень 41
25 марта 2023
8. Что такое логгер Логгер (logger) - это инструмент, который используется для записи информации о работе программы в лог-файлы. Лог-файлы содержат информацию о событиях, происходящих в программе, например, об ошибках, предупреждениях, информационных сообщениях и т.д. Java предоставляет встроенный механизм логгирования в виде пакета java.util.logging. Этот механизм позволяет записывать лог-сообщения в различные источники, такие как файлы, консоль, сеть и т.д. Кроме того, существуют и другие библиотеки для логгирования в Java, такие как Log4j и SLF4J.
milniy87 Уровень 41
25 марта 2023
9. Как настроить логгер Настройка логгера в Java может быть выполнена с помощью файлов конфигурации, которые содержат информацию о том, какие лог-сообщения должны быть записаны и в какой источник. Файлы конфигурации могут быть написаны в формате XML или в формате свойств. Пример файлов конфигурации для логгера в формате свойств:

# Определяем, какие пакеты должны логироваться
# В этом примере все пакеты логируются
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = INFO
com.example.level = ALL

# Настройки для FileHandler
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

# Настройки для ConsoleHandler
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Этот файл конфигурации определяет, что все пакеты должны логироваться с уровнем INFO и выше. Лог-сообщения записываются в файл и выводятся на консоль. Для записи в файл используется FileHandler, а для вывода на консоль - ConsoleHandler. Формат лог-сообщений определяется с помощью SimpleFormatter. Файл конфигурации должен быть загружен в приложении во время инициализации логгера, например, с помощью метода LogManager.readConfiguration(). Этот метод принимает в качестве параметра InputStream, содержащий файл конфигурации.
milniy87 Уровень 41
25 марта 2023
Кроме настройки логгера с помощью файла конфигурации, можно настроить его программно с помощью методов класса java.util.logging.Logger. Например, можно установить уровень логирования для отдельных пакетов:

import java.util.logging.Logger;

public class MyApp {
    private static final Logger LOGGER = Logger.getLogger(MyApp.class.getName());

    public void myMethod() {
        LOGGER.setLevel(Level.INFO);
        LOGGER.info("Метод myMethod() был вызван");
    }
}
В этом примере устанавливается уровень логирования INFO для класса MyApp. При вызове метода myMethod() в лог-файл будет записано сообщение "Метод myMethod() был вызван" с уровнем INFO. Кроме установки уровня логирования, можно настроить другие параметры логгера, такие как источник записи (Handler), формат лог-сообщений (Formatter) и т.д.

import java.util.logging.ConsoleHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class MyApp {
    private static final Logger LOGGER = Logger.getLogger(MyApp.class.getName());

    public void myMethod() {
        ConsoleHandler handler = new ConsoleHandler();
        handler.setFormatter(new SimpleFormatter());
        LOGGER.addHandler(handler);
        LOGGER.info("Метод myMethod() был вызван");
    }
}
В этом примере создается новый Handler, который выводит лог-сообщения на консоль. Для этого Handler устанавливается формат SimpleFormatter. Затем Handler добавляется в логгер MyApp, и при вызове метода myMethod() сообщение будет записано в лог-файл и выведено на консоль.
milniy87 Уровень 41
25 марта 2023
9. SLF4J (Simple Logging Facade for Java) - это фасадный API для логирования в Java, который предоставляет унифицированный интерфейс для работы с различными библиотеками логирования, такими как Logback, Log4j и java.util.logging. Для настройки логгера с помощью SLF4J необходимо сначала добавить зависимость от нужной реализации библиотеки логирования (например, Logback) в файл pom.xml или build.gradle проекта. Для настройки логгера можно использовать файл конфигурации, который содержит параметры для библиотеки логирования. Файл конфигурации должен находиться в корневом каталоге проекта и иметь имя logback.xml для Logback или log4j2.xml для Log4j. Пример файла конфигурации logback.xml для вывода лог-сообщений на консоль и в файл:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>myapp.log</file>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="com.myapp" level="DEBUG" additivity="false">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </logger>
    <root level="INFO">
        <appender-ref ref="console" />
    </root>
</configuration>
В этом примере определены два Appender: ConsoleAppender и FileAppender, которые выводят лог-сообщения на консоль и в файл myapp.log соответственно. Затем определены два Logger: com.myapp и root. Логгер com.myapp настроен на уровень DEBUG и добавлены два Appender: console и file.
milniy87 Уровень 41
25 марта 2023
Чтобы использовать настроенный логгер в коде, необходимо создать объект LoggerFactory и получить экземпляр логгера по имени:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyApp.class);

    public void myMethod() {
        LOGGER.info("Метод myMethod() был вызван");
    }
}
В этом примере создается новый экземпляр логгера для класса MyApp с помощью метода getLogger() класса LoggerFactory. Затем в методе myMethod() логируется.
Daniel Уровень 51
4 мая 2023
Партия гордится тобой!
LuneFox Уровень 41 Expert
24 января 2022
Я на собеседовании: - Какие бывают сборщики мусора? - Самосвал, дворник, бомж.
7 марта 2023
🤣🤣🤣
Елена Попова Уровень 41
29 ноября 2020
https://habr.com/ru/post/130195/ https://javarush.com/groups/posts/2388-logirovanie-chto-kak-gde-i-chem логирование http://java-online.ru/garbage-collection.xhtml сборщик мусора
Александр Уровень 41
21 августа 2021
Статья на хабре весьма хороша. Спасибо!
sunshine4545 Уровень 41
30 апреля 2020
Татьяна Уровень 41
9 декабря 2020
Большое спасибо очень круто!
LuneFox Уровень 41 Expert
24 января 2022
Учимся заглядывать в комментарии | 4 уровень | 11 лекция
Лена Зелёная Уровень 41
5 апреля 2020
https://ziginsider.github.io/Garbage_Collector_Java/ просто огонь какой текст про GC
Сирожиддин Уровень 33
7 января 2023
Vorlock Уровень 31
21 января 2020
;)
Дворник Уровень 41
5 декабря 2019
1. https://javarush.com/groups/posts/917-sborka-musora https://javarush.com/groups/posts/1931-ejshje-o-sborjshike-musora- 2 https://eax.me/garbage-collection/ https://habr.com/ru/post/269863/ 7. Класс WeakHashMap является реализацией интерфейса Map, который хранит только слабые ссылки в качестве ключей. Это позвоялет сборщику мусора удалять элемент структуры в том случае, если на ключ элемента типа “ключ – значение” за пределами таблицы никто не ссылается.
29 ноября 2019
Так я не понял, что расслабились тут все без меня? Почему нет линка на уже готовые ответы? Я что гуглить должен?!
vinograd Уровень 33
27 февраля 2020
😂