Сборщик мусора (Garbage Collector) должен делать всего две вещи:
☕️ Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
☕️ Освобождать память от мусора.
Существуют два подхода к обнаружению мусора:
☕️ Reference counting;
☕️ Tracing.
Reference counting (подсчёт ссылок). Суть этого подхода состоит в том, что каждый объект имеет счетчик. Счетчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счетчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором. Главным минусом такого подхода является сложность обеспечения точности счетчика. Также при таком подходе сложно выявлять циклические зависимости (когда два объекта указывают друг на друга, но ни один живой объект на них не ссылается), что приводит к утечкам памяти.
Главная идея подхода Tracing (трассировка) состоит в утверждении, что живыми могут считаться только те объекты, до которых мы можем добраться из корневых точек (GC Root) и те объекты, которые доступны с живого объекта. Всё остальное - мусор.
Существует 4 типа корневых точки:
☕️ Локальные переменные и параметры методов;
☕️ Потоки;
☕️ Статические переменные;
☕️ Ссылки из JNI.
Самое простое java приложение будет иметь корневые точки:
☕️ Локальные переменные внутри main() метода и параметры main() метода;
☕️ Поток, который выполняет main();
☕️ Статические переменные класса, внутри которого находится main() метод.
Таким образом, если мы представим все объекты и ссылки между ними как дерево, то нам нужно будет пройти с корневых узлов (точек) по всем рёбрам. При этом узлы, до которых мы сможем добраться - не мусор, все остальные - мусор. При таком подходе циклические зависимости легко выявляются. HotSpot VM использует именно такой подход.
☕️ Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
☕️ Освобождать память от мусора.
Существуют два подхода к обнаружению мусора:
☕️ Reference counting;
☕️ Tracing.
Reference counting (подсчёт ссылок). Суть этого подхода состоит в том, что каждый объект имеет счетчик. Счетчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счетчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором. Главным минусом такого подхода является сложность обеспечения точности счетчика. Также при таком подходе сложно выявлять циклические зависимости (когда два объекта указывают друг на друга, но ни один живой объект на них не ссылается), что приводит к утечкам памяти.
Главная идея подхода Tracing (трассировка) состоит в утверждении, что живыми могут считаться только те объекты, до которых мы можем добраться из корневых точек (GC Root) и те объекты, которые доступны с живого объекта. Всё остальное - мусор.
Существует 4 типа корневых точки:
☕️ Локальные переменные и параметры методов;
☕️ Потоки;
☕️ Статические переменные;
☕️ Ссылки из JNI.
Самое простое java приложение будет иметь корневые точки:
☕️ Локальные переменные внутри main() метода и параметры main() метода;
☕️ Поток, который выполняет main();
☕️ Статические переменные класса, внутри которого находится main() метод.
Таким образом, если мы представим все объекты и ссылки между ними как дерево, то нам нужно будет пройти с корневых узлов (точек) по всем рёбрам. При этом узлы, до которых мы сможем добраться - не мусор, все остальные - мусор. При таком подходе циклические зависимости легко выявляются. HotSpot VM использует именно такой подход.
#вопросы_с_собеседований
Какое из следующих утверждений о потоках неверно?
☕️ Если метод start() вызывается дважды для одного и того же объекта Thread, во время выполнения генерируется исключение.
☕️ Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
☕️ Если метод run() вызывается напрямую для объекта Thread, во время выполнения генерируется исключение.
☕️ Если метод sleep() вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.
Какое из следующих утверждений о потоках неверно?
☕️ Если метод start() вызывается дважды для одного и того же объекта Thread, во время выполнения генерируется исключение.
☕️ Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
☕️ Если метод run() вызывается напрямую для объекта Thread, во время выполнения генерируется исключение.
☕️ Если метод sleep() вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.
Правильный ответ: 3. Если метод run() вызывается напрямую для объекта Thread, во время выполнения исключение не генерируется. Однако, код, написанный в методе run() будет выполняться текущим, а не новым потоком. Таким образом, правильный способ запустить поток – это вызов метода start(), который приводит к выполнению метода run() новым потоком.
Вызов метода start() дважды для одного и того же объекта Thread приведёт к генерированию исключения IllegalThreadStateException во время выполнения, следовательно, утверждение 1 верно. Утверждение 2 верно, так как порядок, в котором выполняются потоки, определяется Планировщиком потоков, независимо от того, какой поток запущен первым. Утверждение 4 верно, так как поток не освободит блокировки, которые он держит, когда он переходит в состояние Ожидания.
Вызов метода start() дважды для одного и того же объекта Thread приведёт к генерированию исключения IllegalThreadStateException во время выполнения, следовательно, утверждение 1 верно. Утверждение 2 верно, так как порядок, в котором выполняются потоки, определяется Планировщиком потоков, независимо от того, какой поток запущен первым. Утверждение 4 верно, так как поток не освободит блокировки, которые он держит, когда он переходит в состояние Ожидания.
❓ Почему нельзя соглашаться на тестовый кодинг во время собеседования
Собеседования по программной инженерии часто включают в себя какое-то тестовое задание по программированию, и это не очень хорошо. Объясним, почему.
https://proglib.io/sh/2kaXGotdi0
Собеседования по программной инженерии часто включают в себя какое-то тестовое задание по программированию, и это не очень хорошо. Объясним, почему.
https://proglib.io/sh/2kaXGotdi0
Хочешь начать карьеру Java-разработчика? Наставники из Java Mentor подготовят тебя на позицию Java-программиста за 8 месяцев. Оплата только после успешного трудоустройства в IT.
Пройти входное тестирование🙋♂️👉 https://clck.ru/SkKyp
Ты освоишь востребованный стек технологий, получишь опыт в коммерческом проекте, а в конце программы менторы подготовят тебя к трудным вопросам на собеседовании и помогут составить конкурентное резюме. Тебя ждет высокая зарплата в топовых компаниях Москвы и минимум 10 предложений о работе.
Пройти входное тестирование🙋♂️👉 https://clck.ru/SkKyp
Ты освоишь востребованный стек технологий, получишь опыт в коммерческом проекте, а в конце программы менторы подготовят тебя к трудным вопросам на собеседовании и помогут составить конкурентное резюме. Тебя ждет высокая зарплата в топовых компаниях Москвы и минимум 10 предложений о работе.
#вопросы_с_собеседований
Что такое ZonedDateTime?
Что такое ZonedDateTime?
This media is not supported in your browser
VIEW IN TELEGRAM
Приглашаем на бесплатную образовательную программу Тинькофф Финтех по направлениям: Java, Scala, Kotlin.
Занятия стартуют 8 февраля и продлятся 3 месяца. Все будет онлайн, поэтому география — вся Россия. Для поступления необходимо успешно сдать вступительные испытания. Участников программы ждет много практики, актуальных задач, интересных и обязательных к выполнению домашних заданий.
Заявки принимаем до 27 января, экзамены пройдут с 21 по 27 января. Рекомендуем не откладывать все на последний день и отправлять заявку в ближайшее время: https://fintech.tinkoff.ru/study/fintech/
Кроме того, очень важно сразу же зарегистрироваться в личном кабинете, там будут проходить экзамены: https://fintech.tinkoff.ru/sign-in
Занятия стартуют 8 февраля и продлятся 3 месяца. Все будет онлайн, поэтому география — вся Россия. Для поступления необходимо успешно сдать вступительные испытания. Участников программы ждет много практики, актуальных задач, интересных и обязательных к выполнению домашних заданий.
Заявки принимаем до 27 января, экзамены пройдут с 21 по 27 января. Рекомендуем не откладывать все на последний день и отправлять заявку в ближайшее время: https://fintech.tinkoff.ru/study/fintech/
Кроме того, очень важно сразу же зарегистрироваться в личном кабинете, там будут проходить экзамены: https://fintech.tinkoff.ru/sign-in
java.time.ZonedDateTime — аналог java.util.Calendar, класс с самым полным объемом информации о временном контексте в календарной системе ISO-8601. Включает временную зону, поэтому все операции с временными сдвигами этот класс проводит с её учётом.
☕️ Топ-10 книг по Java, вышедших за последние два года
Подборка лучших книг последних двух лет для тех, кто хочет вывести свои навыки в Java на новый уровень. В них вы найдете экспертные советы от лидеров. Только читая книги можно взглянуть на проблемы иначе, изучить новые техники и стать востребованным специалистом.
https://proglib.io/sh/9R8tIo0ZNn
Подборка лучших книг последних двух лет для тех, кто хочет вывести свои навыки в Java на новый уровень. В них вы найдете экспертные советы от лидеров. Только читая книги можно взглянуть на проблемы иначе, изучить новые техники и стать востребованным специалистом.
https://proglib.io/sh/9R8tIo0ZNn
🐛 ТОП-7 признаков неопытного программиста
Зная эти признаки, вы сможете избежать распространенных среди неопытных программистов ошибок и будете эффективнее строить карьеру разработчика.
https://proglib.io/sh/CZOPJGkxfo
Зная эти признаки, вы сможете избежать распространенных среди неопытных программистов ошибок и будете эффективнее строить карьеру разработчика.
https://proglib.io/sh/CZOPJGkxfo
#вопросы_с_собеседований
Какова цель метода filter() в стримах?
Какова цель метода filter() в стримах?
Метод filter() является промежуточной операцией, принимающей предикат, который фильтрует все элементы, возвращая только те, что соответствуют условию.
#вопросы_с_собеседований
Можно ли объявить метод абстрактным и статическим одновременно?
Можно ли объявить метод абстрактным и статическим одновременно?
Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and ‘static’". Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
#вопросы_с_собеседований
Существует ли возможность перенаправить потоки стандартного ввода/вывода?
Существует ли возможность перенаправить потоки стандартного ввода/вывода?
Класс System позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:
☕️ setIn(InputStream) - для ввода;
☕️ setOut(PrintStream) - для вывода;
☕️ setErr(PrintStream) - для вывода ошибок.
☕️ setIn(InputStream) - для ввода;
☕️ setOut(PrintStream) - для вывода;
☕️ setErr(PrintStream) - для вывода ошибок.
Кто такой DevOps-инженер и как им стать? Познакомься с востребованной IT-профессией и попробуй себя в этом направлении на бесплатном онлайн-интенсиве старшего DevOps-инженера Тимура Батыршина: 👉https://clc.am/enF-BA
⌨️ Ты научишься использовать Docker-compose и Kubernetes.
⌨️ Соберёшь контейнер с приложением.
⌨️ Узнаешь, как организовать непрерывную интеграцию и автоматически собирать новую версию приложения при обновлении исходного кода.
⌨️ Получишь практические советы эксперта и неограниченный доступ к материалам занятий.
Авторы трёх лучших проектов получат сертификаты на 30 000 рублей для обучения в онлайн-университете Skillbox!
Регистрируйся и расширяй свои знания в IT!
⌨️ Ты научишься использовать Docker-compose и Kubernetes.
⌨️ Соберёшь контейнер с приложением.
⌨️ Узнаешь, как организовать непрерывную интеграцию и автоматически собирать новую версию приложения при обновлении исходного кода.
⌨️ Получишь практические советы эксперта и неограниченный доступ к материалам занятий.
Авторы трёх лучших проектов получат сертификаты на 30 000 рублей для обучения в онлайн-университете Skillbox!
Регистрируйся и расширяй свои знания в IT!
#вопросы_с_собеседований
Есть ли смысл определять для сервлета конструктор? Каким образом лучше инициализировать данные?
Есть ли смысл определять для сервлета конструктор? Каким образом лучше инициализировать данные?
Большого смысла определять для сервлета конструктор нет, т.к. инициализировать данные лучше не в конструкторе, а переопределив метод init(), в котором имеется возможность доступа к параметрам инициализации сервлета через использование объекта ServletConfig.
Java in 24 Hours (2017)
Автор: Rogers Cadenhead
Количество страниц: 448
Программирование на Java изучить проще, чем кажется. Всего за 24 урока по часу или меньше вы можете научиться писать компьютерные программы на Java. Используя простой пошаговый подход, популярный автор Роджерс Кейденхед поможет вам овладеть навыками и технологиями, необходимыми для создания настольных и веб-программ, веб-сервисов, приложений для Android и даже модов для Minecraft на Java.
Скачать книгу
Автор: Rogers Cadenhead
Количество страниц: 448
Программирование на Java изучить проще, чем кажется. Всего за 24 урока по часу или меньше вы можете научиться писать компьютерные программы на Java. Используя простой пошаговый подход, популярный автор Роджерс Кейденхед поможет вам овладеть навыками и технологиями, необходимыми для создания настольных и веб-программ, веб-сервисов, приложений для Android и даже модов для Minecraft на Java.
Скачать книгу
Telegram
Книги для программистов (reserved)
Java in 24 Hours (2017)
Автор: Rogers Cadenhead
Автор: Rogers Cadenhead