Проверь насколько хорошо ты знаешь Java и готов освоить Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍1
Какие существуют литералы?
Литерал – последовательность символов, обозначающая значение примитивного типа (или строки).
🔘 Целочисленные (Integer). Возможные форматы: 2019, 1__000_000 (с Java 7), 10048L (можно l, но будет путаться с 1), 0xfd12aa, 0b1011101, 07654321.
🔘 С плавающей точкой (floating-point). Возможные форматы: 123.4, 56.7e8, .07, 42F, 1.4D (избыточно, по умолчанию и так double).
🔘 Символы и строки. Символ (char) – в одинарных кавычках: 'R'. Спецсимволы пишутся с бэкслешем: '\n'. Любой символ можно представлять в виде escape-последовательности: '\u00F1'. Строковый литерал – последовательность символов в двойных кавычках: "Blabla". Для символов строки действуют те же правила.
🔘 Логические (boolean). true и false.
🔘 Специальный литерал null.
Все нюансы описаны в официальной документации.
Литерал – последовательность символов, обозначающая значение примитивного типа (или строки).
🔘 Целочисленные (Integer). Возможные форматы: 2019, 1__000_000 (с Java 7), 10048L (можно l, но будет путаться с 1), 0xfd12aa, 0b1011101, 07654321.
🔘 С плавающей точкой (floating-point). Возможные форматы: 123.4, 56.7e8, .07, 42F, 1.4D (избыточно, по умолчанию и так double).
🔘 Символы и строки. Символ (char) – в одинарных кавычках: 'R'. Спецсимволы пишутся с бэкслешем: '\n'. Любой символ можно представлять в виде escape-последовательности: '\u00F1'. Строковый литерал – последовательность символов в двойных кавычках: "Blabla". Для символов строки действуют те же правила.
🔘 Логические (boolean). true и false.
🔘 Специальный литерал null.
Все нюансы описаны в официальной документации.
👍4❤1⚡1
Бесплатный практический вебинар — Java: с чего начать карьеру в программировании?
⏰ Когда: 23 января в 19:00 по мск.
Расскажем за 2 часа, как освоить базовые навыки программирования на Java, найти удаленную работу и расти в профессии.
На практике познакомимся с синтаксисом языка и напишем программу, которую часто дают новичкам на техническом интервью.
🎁 Всем, кто зарегистрировался — Гайд «Как заговорить на сленге IT-специалистов», а каждому участнику — Карта компетенций Java-разработчика.
Погрузитесь в основы Java и задайте вопросы опытному разработчику!
Реклама. АНПОО "ХЕКСЛЕТ КОЛЛЕДЖ". ИНН 7839056670.
⏰ Когда: 23 января в 19:00 по мск.
Расскажем за 2 часа, как освоить базовые навыки программирования на Java, найти удаленную работу и расти в профессии.
На практике познакомимся с синтаксисом языка и напишем программу, которую часто дают новичкам на техническом интервью.
🎁 Всем, кто зарегистрировался — Гайд «Как заговорить на сленге IT-специалистов», а каждому участнику — Карта компетенций Java-разработчика.
Погрузитесь в основы Java и задайте вопросы опытному разработчику!
Реклама. АНПОО "ХЕКСЛЕТ КОЛЛЕДЖ". ИНН 7839056670.
👍2❤1
Чем отличаются checked и unchecked исключения?
Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации.
Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе throws; перехватывать или добавлять в throws в вызывающем его методе. Unchecked можно добавить, но не обязательно, перехватывать не обязательно даже если указана в throws.
🔘 Throwable – базовый класс для всего что может быть использовано с оператором throw и в конструкции try-catch
🔘 RuntimeException – «нормальные» unchecked-исключения
🔘 Error – unchecked исключения, которые означают «серьезные проблемы» приложения. Не должны обрабатываться (хотя технически можно). Теоретически JVM может находиться в невалидном состоянии и не давать больше никаких гарантий
🔘 Exception (кроме RuntimeException) – checked исключения
Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации.
Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе throws; перехватывать или добавлять в throws в вызывающем его методе. Unchecked можно добавить, но не обязательно, перехватывать не обязательно даже если указана в throws.
🔘 Throwable – базовый класс для всего что может быть использовано с оператором throw и в конструкции try-catch
🔘 RuntimeException – «нормальные» unchecked-исключения
🔘 Error – unchecked исключения, которые означают «серьезные проблемы» приложения. Не должны обрабатываться (хотя технически можно). Теоретически JVM может находиться в невалидном состоянии и не давать больше никаких гарантий
🔘 Exception (кроме RuntimeException) – checked исключения
👍9
Что такое synchronized?
Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется this, статического – .class текущего класса.
Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока synchronized на одном и том же объекте. Такая блокировка называется intrinsic lock или monitor lock, подробно рассматривается в Java Concurrency in Practice 2.3.1.
Блок synchronized также необходим для использования методов wait, notify, notifyAll.
Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется this, статического – .class текущего класса.
Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока synchronized на одном и том же объекте. Такая блокировка называется intrinsic lock или monitor lock, подробно рассматривается в Java Concurrency in Practice 2.3.1.
Блок synchronized также необходим для использования методов wait, notify, notifyAll.
👍11
Бесплатный практический вебинар — Java: с чего начать карьеру в программировании?
⏰ Когда: 23 января в 19:00 по мск.
Расскажем за 2 часа, как освоить базовые навыки программирования на Java, найти удаленную работу и расти в профессии.
На практике познакомимся с синтаксисом языка и напишем программу, которую часто дают новичкам на техническом интервью.
🎁 Всем, кто зарегистрировался — Гайд «Как заговорить на сленге IT-специалистов», а каждому участнику — Карта компетенций Java-разработчика.
Погрузитесь в основы Java и задайте вопросы опытному разработчику!
Реклама. АНПОО "ХЕКСЛЕТ КОЛЛЕДЖ". ИНН 7839056670.
⏰ Когда: 23 января в 19:00 по мск.
Расскажем за 2 часа, как освоить базовые навыки программирования на Java, найти удаленную работу и расти в профессии.
На практике познакомимся с синтаксисом языка и напишем программу, которую часто дают новичкам на техническом интервью.
🎁 Всем, кто зарегистрировался — Гайд «Как заговорить на сленге IT-специалистов», а каждому участнику — Карта компетенций Java-разработчика.
Погрузитесь в основы Java и задайте вопросы опытному разработчику!
Реклама. АНПОО "ХЕКСЛЕТ КОЛЛЕДЖ". ИНН 7839056670.
🔥3👍2
new String("Hello_42") == "Hello_" + 42?
Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.
Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.
Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42 ложно.
Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.
Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.
Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42 ложно.
👍18🔥6👏3
На бесплатном практическом уроке «Основы работы с Spring Data JDBC» от OTUS и Александра Фисунова — Senior Kotlin Developer в SSP Software на проекте ВТБ.
На вебинаре:
- разберемся, как работать с реляционными базами данных из Spring Boot приложения с использованием Spring Data JDBC;
- проведем небольшое сравнение с модулем Spring Data JPA;
- ответим на все возникающие вопросы.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Параметры в Java передаются по ссылке или по значению?
Этот вопрос уходит корнями в C++ прошлое (скорее всего интервьюера), это терминология из C++. Для начала нужно разобраться в этой терминологии.
В C++ ссылка – это переменная-псевдоним для другой переменной. Меняя значение ссылки, поменяется и оригинал. В Java такого нет, легко понять это подумав например о ссылке на int.
Ссылка в Java – это нечто похожее на адрес объекта в памяти. Похожая сущность в C++ называется указатель.
Передача параметра по значению – это копирование значения в переменную-параметр метода. По ссылке – передача ссылки, то есть по сути использование той же самой переменной.
В Java параметр метода – всегда копия. Значит параметры передаются всегда по значению, просто это значение может быть ссылкой на объект. Код выше это демонстрирует.
Этот вопрос уходит корнями в C++ прошлое (скорее всего интервьюера), это терминология из C++. Для начала нужно разобраться в этой терминологии.
В C++ ссылка – это переменная-псевдоним для другой переменной. Меняя значение ссылки, поменяется и оригинал. В Java такого нет, легко понять это подумав например о ссылке на int.
Ссылка в Java – это нечто похожее на адрес объекта в памяти. Похожая сущность в C++ называется указатель.
Передача параметра по значению – это копирование значения в переменную-параметр метода. По ссылке – передача ссылки, то есть по сути использование той же самой переменной.
В Java параметр метода – всегда копия. Значит параметры передаются всегда по значению, просто это значение может быть ссылкой на объект. Код выше это демонстрирует.
👍16👏6🎉4
☕️ Освойте Java с нуля на курсе «Профессия Java-разработчик». Станьте IT-специалистом, которому уже в начале карьеры готовы платить до 100 000 рублей в месяц.
Что вам даст этот курс?
✅ Изучите синтаксис Java и пройдёте основы объектно-ориентированного программирования.
✅ Узнаете, как работать с файловой системой, сетью и базами данных — познакомитесь с SQL.
✅ Научитесь вести контроль версий в Git.
✅ Создадите 2 мощных приложения для портфолио: разработаете поисковый движок и книжный интернет-магазин — аналог ЛитРес.
✅ Новая работа уже через 8 месяцев.
Узнать подробнее о курсе можно здесь: https://epic.st/mzix-v
Оставьте заявку на курс сейчас и получите 6 месяцев бесплатного обучения и год английского в подарок!
☃️🎁Начните год с новых знаний! Новогодняя скидка до 60% и второй курс в подарок!
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
Что вам даст этот курс?
✅ Изучите синтаксис Java и пройдёте основы объектно-ориентированного программирования.
✅ Узнаете, как работать с файловой системой, сетью и базами данных — познакомитесь с SQL.
✅ Научитесь вести контроль версий в Git.
✅ Создадите 2 мощных приложения для портфолио: разработаете поисковый движок и книжный интернет-магазин — аналог ЛитРес.
✅ Новая работа уже через 8 месяцев.
Узнать подробнее о курсе можно здесь: https://epic.st/mzix-v
Оставьте заявку на курс сейчас и получите 6 месяцев бесплатного обучения и год английского в подарок!
☃️🎁Начните год с новых знаний! Новогодняя скидка до 60% и второй курс в подарок!
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
👍3
Какие в Java бывают виды ссылок?
Кроме обычной жесткой ссылки на объект существуют варианты ссылок, которые обрабатываются сборщиком мусора особым образом. Это наследники класса java.lang.ref.Reference. Все они реализуют разного рода слабые ссылки. Технически это обертки над объектом, который доступен по методу get(), и может быть удален сборщиком мусора пока объект-обертка еще не удален. Используются они для экономии памяти, для реализации кэшей, для финализации внешних ресурсов. Например в Android слабые ссылки иногда используются для борьбы с утечкой Activity.
Виды ссылок в порядке убывания «жесткости»:
Обычная жесткая ссылка – любая переменная ссылочного типа. Очистится сборщиком мусора не раньше, чем станет неиспользуемой (перестанет быть доступной из GC roots, подробнее в следующих постах).
SoftReference – мягкая ссылка. Объект не станет причиной израсходования всей памяти – гарантированно будет удален до возникновения OutOfMemoryError. Может быть раньше, зависит от реализации сборщика мусора.
WeakReference – слабая ссылка. Слабее мягкой. Не препятствует утилизации объекта, сборщик мусора игнорирует такие ссылки.
PhantomReference – фантомная ссылка. Используется для «предсмертной» обработки объекта: объект доступен после финализации, пока не очищен сборщиком мусора.
Кроме обычной жесткой ссылки на объект существуют варианты ссылок, которые обрабатываются сборщиком мусора особым образом. Это наследники класса java.lang.ref.Reference. Все они реализуют разного рода слабые ссылки. Технически это обертки над объектом, который доступен по методу get(), и может быть удален сборщиком мусора пока объект-обертка еще не удален. Используются они для экономии памяти, для реализации кэшей, для финализации внешних ресурсов. Например в Android слабые ссылки иногда используются для борьбы с утечкой Activity.
Виды ссылок в порядке убывания «жесткости»:
Обычная жесткая ссылка – любая переменная ссылочного типа. Очистится сборщиком мусора не раньше, чем станет неиспользуемой (перестанет быть доступной из GC roots, подробнее в следующих постах).
SoftReference – мягкая ссылка. Объект не станет причиной израсходования всей памяти – гарантированно будет удален до возникновения OutOfMemoryError. Может быть раньше, зависит от реализации сборщика мусора.
WeakReference – слабая ссылка. Слабее мягкой. Не препятствует утилизации объекта, сборщик мусора игнорирует такие ссылки.
PhantomReference – фантомная ссылка. Используется для «предсмертной» обработки объекта: объект доступен после финализации, пока не очищен сборщиком мусора.
👍9😁1
Освойте востребованный фреймворк для создания приложений на Java, чтобы выйти на новый профессиональный уровень.
Что вы получите:
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Из чего состоит .class-файл?
.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:
🔘 Свойства файла: определяющее тип файла «волшебное слово» 0xCAFEBABE и версия формата;
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;
Для внутренних классов тоже создаются отдельные файлы с названиями формата OuterClass$InnerClass.class. Если класс анонимный, вместо имени используются номера с 1.
.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:
🔘 Свойства файла: определяющее тип файла «волшебное слово» 0xCAFEBABE и версия формата;
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;
Для внутренних классов тоже создаются отдельные файлы с названиями формата OuterClass$InnerClass.class. Если класс анонимный, вместо имени используются номера с 1.
🔥6👏1
Java-разработчики, вас зовут в Тинькофф
Участвуйте в Java Weekend Offer, если ваш опыт больше 3 лет. Пройдите все этапы собеседования за выходные и, если все понравится, получите оффер.
Сможете решать сложные задачи, расти в сильной команде, работать на топовом стеке и пользоваться бенефитами.
Выбирайте удобную дату и пробуйте свои силы. Оставьте заявку до 14 февраля
АО «Тинькофф Банк», ИНН 7710140679
Участвуйте в Java Weekend Offer, если ваш опыт больше 3 лет. Пройдите все этапы собеседования за выходные и, если все понравится, получите оффер.
Сможете решать сложные задачи, расти в сильной команде, работать на топовом стеке и пользоваться бенефитами.
Выбирайте удобную дату и пробуйте свои силы. Оставьте заявку до 14 февраля
АО «Тинькофф Банк», ИНН 7710140679
👍3🥱3😐2👏1
Какой результат выведет следующая программа?
Anonymous Quiz
37%
Hello world!
34%
Ошибку при выполнении
28%
Ошибку компиляции
👍14🔥6⚡2
Как пройти собеседование в компанию мечты? ☄️
26 января проведем техническое собеседование на позицию Senior Java Developer в «Цифровые Привычки», 350.000₽+
В прямом эфире:
А после эфира поделимся чек-листом, который поможет учесть все требования 2024 года при подготовке к собеседованию.
Интервьюер – Роберт Мазипов. Java Architect с опытом программирования на Java 4 года. Преподаватель на курсе Senior Java Developer.
Больше — в прямом эфире!
Регистрация по ссылке: https://clck.ru/38B54b
Реклама. ООО "Платформа непрерывного обучения" ИНН 7839405924
erid: 2VtzqvnhPUz
26 января проведем техническое собеседование на позицию Senior Java Developer в «Цифровые Привычки», 350.000₽+
В прямом эфире:
• Разберем реальное CV; • Обсудим, на что обращают внимание рекрутеры, а на что — интервьюеры; • Расскажем о частых ошибках на собеседовании и как не допустить их.А после эфира поделимся чек-листом, который поможет учесть все требования 2024 года при подготовке к собеседованию.
Интервьюер – Роберт Мазипов. Java Architect с опытом программирования на Java 4 года. Преподаватель на курсе Senior Java Developer.
Больше — в прямом эфире!
Регистрация по ссылке: https://clck.ru/38B54b
Реклама. ООО "Платформа непрерывного обучения" ИНН 7839405924
erid: 2VtzqvnhPUz
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏1🥱1
Сколько памяти занимает объект?
Размер экземпляров ссылочных типов, как и примитивов, зависит от конкретной реализации JVM и параметров ее запуска. Обычно в вопросе подразумевается самая популярная машина – HotSpot от Oracle.
Размеры полей-примитивов бывают больше чем необходимо, например в целях выравнивания (alignment). Из-за того же выравнивания между полями в памяти могут возникать пустоты.
Как говорилось ранее, ссылка в Java – не то же самое что указатель в C++, это не адрес в памяти. Из-за этого размер поля-ссылки может не совпадать с размером машинного слова, например когда HotSpot использует оптимизацию «сжатие ссылок» (Compressed OOP).
Кроме полей и промежутков, каждый объект в HotSpot начинается с заголовка – runtime-метаинформации. Заголовок занимает от 8 до 16 байт.
В общем можно только сказать, что размер объекта строго больше суммы размеров его полей. Примерный размер конкретного объекта измеряется средствами инструментации.
Размер экземпляров ссылочных типов, как и примитивов, зависит от конкретной реализации JVM и параметров ее запуска. Обычно в вопросе подразумевается самая популярная машина – HotSpot от Oracle.
Размеры полей-примитивов бывают больше чем необходимо, например в целях выравнивания (alignment). Из-за того же выравнивания между полями в памяти могут возникать пустоты.
Как говорилось ранее, ссылка в Java – не то же самое что указатель в C++, это не адрес в памяти. Из-за этого размер поля-ссылки может не совпадать с размером машинного слова, например когда HotSpot использует оптимизацию «сжатие ссылок» (Compressed OOP).
Кроме полей и промежутков, каждый объект в HotSpot начинается с заголовка – runtime-метаинформации. Заголовок занимает от 8 до 16 байт.
В общем можно только сказать, что размер объекта строго больше суммы размеров его полей. Примерный размер конкретного объекта измеряется средствами инструментации.
👍17❤4🔥3
На какие области делится память JVM?
Следует помнить, что это внутренние особенности HotSpot (и её opensource-версии OpenJDK). В других виртуальных машинах (например в Android) всё может быть абсолютно по-другому. Области-поколения кучи вообще зависят от используемого алгоритма сборки мусора, и могут отличаться в рамках одной и той же реализации виртуальной машины.
Stack – место под примитивы и ссылки на объекты (но не сами объекты). Хранит локальные переменные и возвращаемые значения функций. Здесь же хранятся ссылки на объекты пока те конструируются. Все данные в стеке – GC roots. Освобождается сразу на выходе из функции. Принадлежит потоку, размер по-умолчанию указывается параметром виртуальной машины -Xss, но при создании потока программно можно указать отличное значение. Подробнее.
PermGen – В этой области хранятся загруженные классы (экземпляры класса Class<T>). Здесь же с Java 7 хранится пул строк. Изначально размера -XX:PermSize, растет динамически до -XX:MaxPermSize. Не считается частью кучи.
Metaspace – с Java 8 заменяет permanent generation. Отличие в том, что по умолчанию metaspace ограничен только размерами доступной на машине памяти, но так же как PermGen может быть ограничен, параметром -XX:MaxMetaspaceSize.
Heap – куча, вся managed-память, в которой хранятся все пользовательские объекты. Все следующие разделы – части кучи. Параметры -Xms, -Xmn и -Xmx устанавливают начальный, минимальный и максимальный размеры хипа соответственно.
Eden, New Generation, Old Generation и другие – специфичные для сборщика мусора части кучи, поколения. Могут быть разные, но общий подход сохраняется: долго живущий объект постепенно двигается во всё более старое поколение; сборка мусора в разных поколениях происходит раздельно; чем поколение старше, тем сборка в нём реже, но и дороже.
Хотя устройство памяти – это детали реализации виртуальной машины, для Java-разработчика знания о них несут практическую пользу. Эти знания необходимы для передачи правильных значений параметров JVM, что в свою очередь спасает от просадок производительности GC и остановок с OutOfMemoryError.
Следует помнить, что это внутренние особенности HotSpot (и её opensource-версии OpenJDK). В других виртуальных машинах (например в Android) всё может быть абсолютно по-другому. Области-поколения кучи вообще зависят от используемого алгоритма сборки мусора, и могут отличаться в рамках одной и той же реализации виртуальной машины.
Stack – место под примитивы и ссылки на объекты (но не сами объекты). Хранит локальные переменные и возвращаемые значения функций. Здесь же хранятся ссылки на объекты пока те конструируются. Все данные в стеке – GC roots. Освобождается сразу на выходе из функции. Принадлежит потоку, размер по-умолчанию указывается параметром виртуальной машины -Xss, но при создании потока программно можно указать отличное значение. Подробнее.
PermGen – В этой области хранятся загруженные классы (экземпляры класса Class<T>). Здесь же с Java 7 хранится пул строк. Изначально размера -XX:PermSize, растет динамически до -XX:MaxPermSize. Не считается частью кучи.
Metaspace – с Java 8 заменяет permanent generation. Отличие в том, что по умолчанию metaspace ограничен только размерами доступной на машине памяти, но так же как PermGen может быть ограничен, параметром -XX:MaxMetaspaceSize.
Heap – куча, вся managed-память, в которой хранятся все пользовательские объекты. Все следующие разделы – части кучи. Параметры -Xms, -Xmn и -Xmx устанавливают начальный, минимальный и максимальный размеры хипа соответственно.
Eden, New Generation, Old Generation и другие – специфичные для сборщика мусора части кучи, поколения. Могут быть разные, но общий подход сохраняется: долго живущий объект постепенно двигается во всё более старое поколение; сборка мусора в разных поколениях происходит раздельно; чем поколение старше, тем сборка в нём реже, но и дороже.
Хотя устройство памяти – это детали реализации виртуальной машины, для Java-разработчика знания о них несут практическую пользу. Эти знания необходимы для передачи правильных значений параметров JVM, что в свою очередь спасает от просадок производительности GC и остановок с OutOfMemoryError.
👍22🔥6👏2🥰1
💻Бесплатный практический урок по работе с Apache Kafka «Пишем продьюсер и консьюмер на Alpakka» от Валентина Шилина – старшего программиста и аналитика данных в Deutsche Telekom IT GmbH.
На занятии:
- продемонстрируем интересную связку Scala Alpakka (Kafka);
- напишем продьюсер и будем ловить его сообщения в консьюмере;
- покажем, насколько легко и элегантно можно реализовать трудоемкую задачу распределенных вычислений.
Встречаемся 6 февраля в 20:00 мск в рамках подготовки к курсу «Apache Kafka». Обучение доступно в рассрочку!
👉Регистрируйтесь прямо сейчас, чтобы не пропустить урок и получить запись: https://otus.pw/OPmC/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
На занятии:
- продемонстрируем интересную связку Scala Alpakka (Kafka);
- напишем продьюсер и будем ловить его сообщения в консьюмере;
- покажем, насколько легко и элегантно можно реализовать трудоемкую задачу распределенных вычислений.
Встречаемся 6 февраля в 20:00 мск в рамках подготовки к курсу «Apache Kafka». Обучение доступно в рассрочку!
👉Регистрируйтесь прямо сейчас, чтобы не пропустить урок и получить запись: https://otus.pw/OPmC/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍5❤3😁1