Java Daily Dose
7 subscribers
14 photos
1 video
10 files
6 links
Way of Java man☕️🍀🚶
Download Telegram
Forwarded from Java Learning
#Вопросы_с_собеседования
Объясните принципы работы Java Garbage Collection. Какие виды сборщиков мусора существуют в Java? Напишите код с утечкой памяти и объясните, как ее можно обнаружить и предотвратить.


Ответ:

В Java, управление памятью осуществляется автоматически с помощью механизма сборки мусора. Основные принципы работы:

— JVM отслеживает все активные ссылки на объекты в программе.
— Определение мертвых объектов: Объект считается мертвым (готовым к удалению), если на него нет активных ссылок.
— JVM автоматически освобождает память, занятую мертвыми объектами.

Виды сборщиков мусора в Java:

Serial Collector (Serial GC): Однопоточный, используется в небольших приложениях или на однопроцессорных системах.
Parallel Collector (Parallel GC): Многопоточный, предназначен для многопроцессорных систем.
Concurrent Mark-Sweep (CMS) Collector: Позволяет сократить время простоя приложения, так как многие его этапы выполняются параллельно с работой приложения.
G1 (Garbage-First) Collector: Пытается сбалансировать время простоя приложения и эффективность сборки.

Обнаружение и предотвращение утечек памяти:

— Инструменты профилирования, такие как VisualVM или YourKit, могут помочь обнаружить утечки памяти.
— Внимательный анализ кода с использованием статических анализаторов, таких как FindBugs или SonarQube, может выявить потенциальные проблемы.
— Для ресурсов, реализующих интерфейс AutoCloseable (например, InputStream), следует использовать try-with-resources для автоматического освобождения ресурсов.
— Важно убедиться, что ресурсы (файлы, сетевые соединения и т. д.) освобождаются явным образом, например, в блоке finally.
— Если объект может быть удален, даже если на него есть ссылки, рассмотрите использование weak-ссылок, таких как WeakReference или SoftReference.
— Объединение жизненных циклов объектов помогает предотвратить утечки памяти. Например, закрывайте ресурсы вместе с объектом, который их использует.
1🤔1👾1
Forwarded from Java Guru 🤓
Чем отличается Comparator от Comparable?

Интерфейс Comparable определяет естественный порядок среди объектов. Java Collections Framework активно использует этот порядок. По нему упорядочены элементы SortedSet/SortedMap, им упорядочиваются элементы списков и массивов в методе sort().

Порядок определяется единственным методом compareTo. Отрицательный результат означает что текущий объект «меньше» чем переданный параметром, 0 – равен, положительный – больше. Рекомендуется чтобы равные с точки зрения equals объекты всегда были равны с точки зрения compareTo.

С математической точки зрения это должен быть линейный порядок. Он требует выполнения четырех свойств:
1. Антирефлексивность: x.compareTo(x) всегда 0;
2. Антисимметричность: если x.compareTo(y) > 0, то y.compareTo(x) < 0;
3. Транзитивность: если x.compareTo(y) > 0 и y.compareTo(z) > 0, то x.compareTo(z) > 0;
4. Полнота: отношение определено для любых объектов класса (кроме null).

Интерфейс Comparator – это логика Comparable, вынесенная в отдельный объект. Компаратор реализует паттерн Стратегия. Большинство платформенных методов, использующих Comparable имеют перегруженный вариант с не-comparable объектом и внешним компаратором.

Comparator бывает полезен, когда класс предоставлен сторонней библиотекой, и нет возможности его менять. Другой случай – особая логика упорядочивания, не свойственная классу объектов в общем, но нужная для отдельной ситуации.

Кроме основного метода compare(), в компараторе есть набор утилитарных методов для комбинирования и модификации компараторов. Все они возвращают новый компаратор, позволяя сделать его иммутабельным.
1
Java from EPAM: Учебно-методическое пособие, 2-е изд. (2021) PDF

Второе издание пособия предназначено для программистов, начинающих и продолжающих изучение технологий Java SE. В книге рассматриваются основы языка Java и концепции объектно-ориентированного и функционального программирования. Также изложены аспекты применения библиотек классов языка Java, включая файлы, коллекции, Stream API, сетевые и многопоточные приложения, а также взаимодействие с СУБД и XML. В конце каждой главы даются теоретические вопросы по изученной главе, тестовые вопросы по материалу главы и задания для выполнения. В приложениях приведены дополнительные материалы с кратким описанием технологий Log4J2 и TestNG.

Функциональное программирование (ФП) было добавлено в очередную версию Java и ориентировано на вычисления и обработку информации. Этот подход предполагает формирование функции как объекта и передачу этого объекта в метод для использования или, наоборот, сама функция есть возвращаемое методом значение. Функциональный стиль программирования не заменит другие подходы к созданию кода. Многие действительно последовательные процессы, такие как поведение программных моделей в реальном времени, игровые и другие программы, организующие взаимодействие компьютера с человеком, не могут быть выражены в функциональном стиле. Функциональное программирование позволяет по-иному взглянуть на процесс программирования, а некоторые приемы программирования, которые предназначены для написания программ в чисто функциональном стиле, могут с успехом использоваться и в традиционном программировании вместе с ООП.
1
Core Java Interview Questions You'll Most Likely Be Asked (Job Interview Questions Series) (2021) PDF

● Concept refresher for Java (includes Java 8 and Java 9)
● Ideal prep guide for coding interviews - technical and HR rounds
● Guidance for Resume building and Aptitude tests
● Includes Scenario based questions
● Developed and recommended by industry experts and placement experts

Core Java Interview Questions You’ll Most Likely Be Asked: Second Edition is your perfect companion to stand above the rest in today’s competitive job market.

With this guide, you learn or refresh Core Java fundamentals and principles necessary for cracking the coding interview and acquaint yourself with real-life interview questions and strategies to reach the solutions. The Resume building tutorial and the Aptitude tests equip you to present yourself better even before the job interview.

This book is a complete course in itself to prepare for your dream Java job placement.
1
Погружение в паттерны проектирования (2021) PDF + Архив с примерами кода

Книга «Погружение в Паттерны Проектирования» описывает 22 классических паттерна проектирования, а также 8 принципов проектирования, на которых они основаны.

Каждая глава начинается с разбора определённой проблемы, возникающей при проектировании, и шаг за шагом подводит читателя к решению с помощью одного из паттернов.
Далее идёт детальный разбор структуры паттерна и его вариаций, а также пример реализации в коде.
Затем, читатель знакомится с кейсами использования паттерна и учится воспроизводить паттерн по шагам.
Заканчиваются главы обсуждением плюсов и минусов паттерна, а также обзором его связей с другими паттернами.
1
Swift_Основы_разработки_приложений_под_iOS,_iPadOS_и_macOS.pdf
10.8 MB
🕊️ Swift. Основы разработки приложений под iOS, iPadOS и macOS.

📖 Автор: Усов Василий
📄 Страниц: 545
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁1
Forwarded from Java Developer
This media is not supported in your browser
VIEW IN TELEGRAM
📱 8 архитектурных подходов

🟣 REST — Каждый ресурс системы представлен уникальным URL и взаимодействие с ними осуществляется через стандартные HTTP-методы.

🟣 SOAP — Обмен сообщениями между сервисами происходит через строго структурированные XML-запросы и ответы.

🟣 GraphQL — Позволяет клиентам формировать запросы к API, точно определяя необходимые данные, минимизируя избыточность.

🟣 gRPC — Использует протоколы буферов и HTTP/2 для создания высокопроизводительных и масштабируемых сервисов с двусторонней связью.

🟣 WebSockets — Создаёт постоянное соединение между клиентом и сервером, и обеспечивает двусторонний обмен данными в реальном времени.

🟣 Webhooks — Асинхронное взаимодействие, где сервер уведомляет клиента о событиях через HTTP-запросы, инициированные самим сервером.

🟣 MQTT — Оптимизирован для IoT-устройств, поддерживает легковесный обмен сообщениями с низким потреблением ресурсов.

🟣 AMQP Для высоконадёжных систем, ориентирован на очереди сообщений и гарантированную доставку данных между сервисами.

➡️ Java Developer | #полезное
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🖥 Освежите свои знания о CompletableFuture

Задачи, которые требуют асинхронного выполнения, могут стать настоящей головной болью, если использовать устаревшие методы. Однако, есть мощный инструмент — CompletableFuture, который упрощает работу с параллельными вычислениями, обеспечивая гибкость, читаемость и исключение возможных ошибок в многозадачности. Статья содержит интересный пример использования этого инструмента. В ней описана реализация веб-сканера, который будет по ссылкам искать новости, посвященные хакингу.

🔗 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Вопросы, которые мне задали
1. Стирание типов в Java
2. Админ панель для бизнеса
3. Метрики и мониторинг (куда смотреть если сервис завис)
4. SQL запрос "select for update"
5. ThreadLocale - что такое?
6. Соберет ли объекты GC (приведен код). Как работает garbage Collector
7. Что такое интерфейсы - маркеры (Serializable,Closeable)
8, Что такое индексы в базе данных?
9. Как оптимизировать запросы в базу данных? (зависит от запроса)
10. как решается many-to-many отношение в базе данных
11. Кеш в базе данных. Как работать? Какой кеш лучше использовать (распределенный или локальный)
1
Что выведет программа?
public class Increment {
private static int counter1 = 0;
private static int counter2 = 0;

public static void main(String[] args) throws InterruptedException {
int tasksCount = 100_000;
CountDownLatch latch = new CountDownLatch(tasksCount);
ExecutorService executor = Executors.newFixedThreadPool(100);

for (int i = 0; i < tasksCount; i++) {
executor.submit(() -> {
counter1++;
counter2++;
latch.countDown();
});
}

latch.await();

System.out.println(counter1);
System.out.println(counter2);
System.exit(0);
}
}
Что выведет код?
  String a = "123";
String b = "123";
String c = new String("123");

System.out.println(a == b);
System.out.println(a == c);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
Соберет ли GC эти объекты?
class A {
B b;
}

class B {
A a;
}

public class Main {
public static void main(String[] args) {
A objA = new A();
B objB = new B();

objA.b = objB;
objB.a = objA;

objA = null;
objB = null;

// Удалятся ли объекты A и B?
System.gc();
}
}
📊 Как работает CopyOnWriteArrayList под капотом?

CopyOnWriteArrayList — это потокобезопасная реализация списка, оптимизированная для сценариев с частым чтением и редкими изменениями. Когда происходит изменение в CopyOnWriteArrayList, создаётся новая копия базового массива, в которую вносятся изменения. Таким образом, чтение и запись изолированы: до завершения модификации читающие потоки получают доступ к старому массиву, а запись завершает свою работу, не блокируя других потоков.

💡 Основные механизмы:

🔹 До завершения операции модификации все читающие потоки продолжают работать с текущей неизменяемой версией массива.
🔹 При вызове методов, изменяющих список (например, add, remove), создаётся новый массив на основе старого. Изменения применяются именно к новому массиву.
🔹 После завершения модификации ссылка на массив обновляется на новую версию. Теперь все новые операции чтения будут работать с обновлённой версией.

⚠️ Особенности:

▪️ Высокие накладные расходы на запись из-за создания копий.
▪️ Подходит для случаев, где чтение доминирует над изменением.
▪️ Не рекомендуется для сценариев с частыми обновлениями из-за увеличения потребления памяти.

CopyOnWriteArrayList идеально подходит для кешей, обработчиков событий и других структур данных, где важна стабильность чтения при редких изменениях.

Документация
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Какие типы ссылок существуют?

Существует 4 типа ссылок, которые определяют, как объект будет обрабатываться сборщиком мусора (Garbage Collector).

1️⃣ Strong Reference

Это ссылки, которые используются по умолчанию.
String strongRef = new String("Strong Reference");


Объект, на который указывает сильная ссылка, никогда не будет удален сборщиком мусора, пока существует эта ссылка.
Используйте, когда объект нужен в течение всего времени выполнения.

2️⃣ Soft Reference

Создаются с помощью класса SoftReference. Soft ссылка удерживает объект в памяти, пока в JVM достаточно свободной памяти. Если памяти не хватает, объект будет удален.
SoftReference<String> softRef = new SoftReference<>(new String("Soft Reference"));
String softObj = softRef.get();


Удобны для реализации кэшей. Например, если объект можно восстановить, но не хочется держать его в памяти постоянно.
Сборщик мусора удаляет объекты, на которые ссылаются мягкие ссылки, только в случае нехватки памяти.

3️⃣ Weak Reference

Создаются с помощью класса WeakReference. Объект, на который ссылается слабая ссылка, удаляется сборщиком мусора, как только на него больше нет сильных или мягких ссылок.
WeakReference<String> weakRef = new WeakReference<>(new String("Weak Reference"));
String weakObj = weakRef.get();


Часто используются в структурах данных, таких как WeakHashMap, для предотвращения удержания ненужных объектов.
Удобны для создания ссылок на временные объекты.

4️⃣ Phantom Reference

Создаются с помощью класса PhantomReference. Эти ссылки используются исключительно для отслеживания, когда объект будет удален сборщиком мусора.
PhantomReference<String> phantomRef = new PhantomReference<>(new String("Phantom Reference"), new ReferenceQueue<>());


Метод get() у фантомной ссылки всегда возвращает null.
Объекты, на которые ссылаются фантомные ссылки, добавляются в ReferenceQueue, когда сборщик мусора их удаляет.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Channel name was changed to «Java Daily Dose »
Channel photo updated