JavaStart
908 subscribers
909 photos
28 videos
619 links
Учи Java вместе с нами!
Наша платформа с курсом - https://javastart.tech
Ютуб с обучающими видео - https://www.youtube.com/@javastart_tech
Download Telegram
Память в Java. Часть 1.

Как устроена память в Java?

Для оптимальной работы приложения JVM делит память на область Stack (стек) и область Heap (куча). Всякий раз, когда мы объявляем новые переменные, создаем объекты или вызываем новый метод, JVM выделяет память для этих операций в стеке или в куче.

Объекты попадают в Heap, а значения примитивных переменных, вызовы методов, а также ссылки на объекты попадают в Stack.

Подробнее об этих областях памяти поговорим далее.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5👨‍💻21🤓1
Память в Java. Часть 2. Область памяти Stack.

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

Стек работает по схеме LIFO (последним вошел, первым вышел).

Основные особенности Стека:

Stack заполняется и освобождается по мере вызова и завершения новых методов

– Переменные в стеке существуют до тех пор, пока выполняется метод, в котором они были созданы

– Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError

– Доступ к этой области памяти осуществляется быстрее, чем к куче

– Является потокобезопасным, поскольку для каждого потока создается свой отдельный стек

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4👨‍💻3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👨‍💻3🔥21👍1
Какая структура данных используется для быстрого поиска элемента по ключу?
Anonymous Quiz
0%
Очередь
2%
Стек
77%
Хэш-таблица
10%
Связанный список
9%
Массив
2%
Посмотреть ответ
🎉521👍1🔥1
Память в Java. Часть 3. Область памяти Heap.

Что такое Heap?

Heap - это область памяти в виртуальной машине Java (JVM), где хранятся объекты, созданные вашим приложением. Это место, где происходит выделение и освобождение памяти для динамически создаваемых объектов. Новые объекты всегда создаются в Heap (куча), а ссылки на них хранятся в стеке (Stack).
Эти объекты имеют глобальный доступ и могут быть получены из любого места программы.

Эта область памяти разбита на несколько более мелких частей:

Young Generation – область где размещаются недавно созданные объекты. Когда она заполняется, происходит быстрая сборка мусора. Эта область еще делится на Eden и Survivor Space, в которые попадают объекты по мере времени их жизни в программе.

Old (Tenured) Generation – здесь хранятся долгоживущие объекты. Когда объекты из Young Generation достигают определенного порога «возраста», они перемещаются в Old Generation.

Permanent Generation – эта область до Java 8 содержала метаинформацию о классах и методах приложения, но начиная с Java 8 данная область памяти была упразднена.

Про основные особенности Heap поговорим в следующем посте.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍32👨‍💻2
Память в Java. Часть 4. Особенности памяти Heap.

– Динамическое выделение памяти в Heap: Объекты в Heap создаются и уничтожаются во время выполнения программы;

– Когда эта область памяти Heap полностью заполняется, Java бросает java.lang.OutOfMemoryError;

–Доступ к Heap медленнее, чем к Stack;

Heap в отличие от Stack, автоматически не освобождается. Для сбора неиспользуемых объектов используется сборщик мусора (Garbage Collection);

– Жизненный цикл объектов: Объекты в Heap проходят через различные фазы жизненного цикла, такие как создание, использование и уничтожение.

– В отличие от стека, куча не является потокобезопасной и ее необходимо контролировать, правильно синхронизируя код.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
4👨‍💻3👍1🤓1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁32
Please open Telegram to view this post
VIEW IN TELEGRAM
😁124💯2
Что такое пул строк в Java?

Очень часто этот вопрос задают джунам и интернам на собеседованиях.

Пул строк (String Pool) – это множество строк в кучи (Java Heap memory). Мы знаем, что String – особый класс в java, с помощью которого мы можем создавать строковые объекты. Строковый пул возможен только потому, что строки в Java неизменные.

На картинке мы видим как именно строковый пул расположен в памяти Java Heap. И как разные способы создания строк влияют на расположение их в памяти.

Метод intern().

Вы можете использовать метод .intern() у созданной строки, чтобы явно поместить эту строку в Пул Строк. Это может быть полезно, если вам нужно сравнивать строки с использованием ==.

Экономия ресурсов:

Использование Пула Строк позволяет экономить память, так как одинаковые строки не будут дублироваться. Вместо этого будет использоваться один экземпляр строки.

Строки из пула:

Когда вы создаете строку литералом, Java сначала проверяет, есть ли такая строка в Пуле. Если она там уже существует, то используется существующий экземпляр.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2👨‍💻2🔥1🤓1
Конструктор в Java. Часть 1.

Сегодня поговорим о конструкторах в Java - важном аспекте объектно-ориентированного программирования.

Конструкторы играют ключевую роль в создании и инициализации объектов. Давайте разберемся, что это такое.

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

Основные черты конструкторов:

1) Название совпадает с именем класса.
У конструктора имя точно такое же, как у класса, к которому он принадлежит.

2) Вызывается при создании объекта.
Конструктор автоматически вызывается при создании нового экземпляра класса с использованием оператора new.

3) Может принимать параметры.
Конструктор может принимать параметры, что позволяет передавать значения для инициализации объекта.

Пример простого конструктора на Картинке.

Далее рассмотрим типы конструкторов и причины их использовать!

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3👨‍💻21🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12💯21👍1
Конструктор в Java. Часть 2.

Зачем нужны конструкторы?

1) Инициализация объектов.
Конструкторы позволяют установить начальные значения полей объекта при его создании.

2) Предоставление гибкости.
Конструкторы могут принимать параметры, что делает возможным создание объектов с различными характеристиками.

3) Выполнение дополнительных действий.
В конструкторе можно реализовать дополнительные логику, которая будет выполнена при создании объекта.

Типы конструкторов:

1) По умолчанию (default).
Если вы не создаете явно конструктор, компилятор Java добавит конструктор по умолчанию без параметров (на Картинке).

2) С параметрами.
Принимает параметры для инициализации объекта.

Важный момент:

Если вы явно определяете хотя бы один конструктор в классе, компилятор больше не добавит конструктор по умолчанию!

Подытожим:

Конструкторы - это ключевой элемент создания объектов в Java. Они обеспечивают начальную настройку объектов, делая ваш код более структурированным и управляемым.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻52👍21🔥1
Вакансия для Go разработчиков 😁👍

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
😁82💯1
Garbage Collector в Java. Часть 1.

Перейдем с вами к большой теме под названием Garbage Collector.

Поиском и освобождением ненужных участков в памяти в JVM занимается специальный процесс, который называется Garbage Collector или коротко GC. У Garbage Collector всего две задачи – это обнаружение и очистка мусора.

Мусор – это структура данных (объект) в памяти не достижимый из программного кода.

Как работает Garbage Collector:

1) Маркировка (Marking).
GC определяет, какие объекты доступны для использования, и маркирует их.

2) Определение объектов для удаления.
GC определяет объекты, которые не помечены как доступные для использования (мусор).

3) Освобождение памяти.
GC освобождает память, занятую удаленными объектами, делая ее доступной для новых объектов.

В следующих постах разберем различные реализации Garbage Collector и подходы для поиска мусора.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52👨‍💻2
Garbage Collector в Java. Часть 2.

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

По спецификации нет никаких правил для реализации GC, кроме соблюдения корректности – это значит, что нельзя собирать объекты, которые в будущем в приложении будут использоваться.

Мы уже много раз замечаем слово "ненужные" объекты. Но как определить, что объект не нужен, что объект не используется и это мусор?

Существует несколько подходов для поиска мусора:

– Reference counting
– Tracing (GC Root)

Поговорим об этих подходах далее.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻4🤓3👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9👍3👨‍💻21
Как создать переменную с числовым значением 5 в Java?
Anonymous Quiz
2%
x = 5;
3%
num x = 5
2%
float x = 5;
92%
int x = 5;
1%
Посмотреть ответ
4🎉4👍1👨‍💻1
Garbage Collector в Java. Reference Counting. Часть 3.1.

Reference Counting – данный подход основан на подсчете ссылок, о чем можно догадаться из названия.

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

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

Из плюсов данного подхода можно выделить несколько: простота, не требуются долгие паузы для сборки мусора.

Однако, есть и существенные минусы:

– Плохо сочетается с многопоточностью;

– Сложно выявлять циклические зависимости;

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

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

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👨‍💻31
Garbage Collector в Java. Reference Counting. Часть 3.2.

Одним из минусов подхода Reference Counting является сложность выявления циклических зависимостей.

Циклические зависимости – когда два объекта указывают друг на друга, но ни одна ссылка из Stack на них не ссылается. Это приводит к утечкам памяти. Наглядно можно посмотреть на картинке – каждый из объектов на рисунке имеет по одной ссылке на себя, однако только один является по-настоящему "живым" и нужным.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42👨‍💻2