как программировать на java в linux

Как начать программировать на Java

Чтобы начать программировать на Java, требуется установить JDK (java development kit — набор разработки для Java). Его скачивают с сайта компании Oracle. Например, JDK восьмой версии https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

JDK включает JRE и пакет разработчика, в который входит компилятор с языка Java, документация и др.

JRE (java runtime enviroment) – виртуальная машина для выполнения приложений, скомпилированных в соответствующий объектный код. Также включает библиотеки, но не компилятор и другие инструменты разработчика. Скачать JRE можно с сайта java.com. Грубо говоря, JRE – урезанная версия JDK. Поэтому разработчику, а не пользователю java-программ, этот пакет не нужен.

После распаковки пакета JDK в его подкаталоге bin вы найдете файл javac, запускающий компилятор, и файл java, запускающий виртуальную машину. Куда вы положите каталог с JDK, по большому счету не важно. Однако если это сделано не в предусмотренный для программ каталог (в случае Linux скорее всего это так), ОС не будет знать, что в ней появились новые программы. Тогда вам надо будет каждый раз указывать полный путь до компилятора и виртуальной машины.

В любом случае Bash должен видеть как java, так и javac. Чтобы убедиться, наберите java и два раза нажмите Tab. В списке должны быть оба. Если в систему были установлены разные JDK, то узнать какой используется можно с помощью команды which:

Зачем нужна виртуальная машина Java

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

Байт-код – это не машинный код. Поэтому он машинно-независим и может выполнять по большому счету на любых устройствах. Байт-код интерпретирует/компилирует на машинный язык виртуальная машина java в момент выполнения программы.

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

Таким образом, javac’ом мы компилируем до байт-кода. А java интерпретирует байт-код на машинный язык.

Первая программа

Примечание. Если вы хотите освоить работу в Vim, наберите в терминале vimtutor. Откроется небольшой курс, обучающий работе в редакторе.

Далее передаем этот файл javac’у. Он нам выдает файл HelloWorld.class, содержащий байт-код. Его мы передаем виртуальной машине java, не указывая расширение:

IntelliJ IDEA

Существует множество специализированных сред для разработки на Java. Они удобны для работы надо проектами, однако для обучения – не лучший выбор, так как создают структуру каталогов проекта, вспомогательные файлы, требуют настройки, включает множество дополнительных инструментов. Таким образом вы начинаете не столько с изучения языка, сколько с адаптации к среде программирования, зачастую не понимая смысла того, что делаете.

Плюсом здесь является то, что среда заставляет писать и форматировать код правильно, в ней есть автодополнение и подсказки.

Наиболее популярной IDE для Java является IntelliJ IDEA от компании JetBrains. Существует две версии – бесплатная Community и платная Ultimate (30 дней триальный период). В случае Linux в документации рекомендуют распаковывать скаченный архив в каталог /opt/. После этого из подкаталога bin запускают скрипт idea.sh, который запускает мастер установки.

В одном из окон мастера будет предложено выбрать SDK (в данном случае JDK). Следует указать каталог, куда вы распаковывали пакет JDK. IDEA будет использовать компилятор и другое отсюда.

Когда вы напишите первую программу, надо будет сконфигурировать запуск, указав главный класс, содержащий функцию main(), или нажимать Ctrl + Shift + F10.

Источник

Java IDE для разработчиков с Linux’ом

Дата публикации: 2018-11-15

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

От автора: трудно представить, где была бы разработка Java-приложений, если бы не существовало операционной системы Linux. Она привлекает все больше поклонников, ведь развивается с каждым годом. Благодаря тому, что над этими системами работает мировое сообщество, а не ограниченный круг сотрудников компании, Линуксы владеют гораздо более широким функционалом, чем их коммерческие оппоненты – Mac и Windows. Если вы начинающий джавист и тоже хотите присоединится к линуксоидам, значит нужно подобрать хорошую среду разработки. Хватит забивать в Google «linux java ide» – читайте все что ниже!

Новичок против

По критике, обрушенной на операционную систему, Linux может соперничать разве что с Windows. Последнюю и вовсе не жалуют разработчики: то, что плохо работает на Windows, гораздо сложнее исправить, чем ошибку в операционной системе из семейства Linux. Сегодня мы не будем говорить о том, насколько хороши эти системы. Зато рассмотрим пункты, которые обычно отпугивают новичков от разработки на Linux.

Среди проблем, характерных для Linux, называют:

трудно использовать. Этот тезис может убедительно звучать из уст разработчика, которому не хватает Photoshop или другого профессионального программного обеспечения. Но, когда речь идет о простых пользователях, для которых нужен браузер, текстовые редакторы и видеокодеки, то этот аргумент сразу ломается. Со всеми «простыми» функциями эти OS отлично справляются. Иногда, даже лучше пресловутого Windows. Старые компьютеры «оживают», когда на него прямыми руками устанавливают качественный дистрибутив;

подключение сторонних устройств. Для полноценной веб-разработки иногда необходимо подключение внешних дисков и других девайсов. К сожалению, начинающие пользователи не знают, что поддержкой «осей» должен заниматься вендор – тот, кто производит устройство. Так что, если Linux не видит накопитель, это вина накопителя, а не операционной системы. К тому же, на рынке уже не встретишь устройство не совместимое с Linux-семейством;

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

время работы батареи. Единственный минус для разработчика, который взаимодействует с портативным ПК (80%). Windows и Mac научились рационально распределять использование батареи. Ни один «голый» дистрибутив не может с ним сравниться. И это очевидно: в распоряжении сообщества разработчиков Linux нет таких экспериментальных возможностей, как у компаний Apple и Microsoft. Лучшее, что они могут предложить для Linux – это некоторые утилиты, которые оптимизируют батарею.

IDE, которых много

Сам Linux очень хорош для Java: это будто операционная система, которая является средой разработки. Сама операционная система разработана на основе компилируемых языков. Значит, лучшее, что можно создать для Linux – это группа компиляторов, которые будут оптимизировать работу системы. Им стал GCC (GNU Compiler Collection). Кроме компиляции, GCC выполняет функцию фронта для языков C, С++, Java. И это не все плюшки, которые Linux приготовил для программистов. Сегодня эта система стоит на 3 из 5 машинах разработчиков. IDE для Java, которые поддерживают Linux – масса.

Каждый разработчик ставит к среде разработки определённые требования. К примеру, кому-то предельно важна стоимость программного обеспечения. И это не порок: когда вы программируете на Java лишь для утилитарных целей своего предприятия, трудно раскошелится на платный софт. Для других нужно чтобы IDE поддерживала сразу несколько операционных систем, для работы в команде это необходимое условие.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Множество школ, колледжей и университетов используют Java, как первый язык программирования для ученика. Стоит ли говорить на какой платформе работают школьные компьютеры? Конечно же Linux! Ведь это гораздо дешевле, чем приобретение корпоративной лицензии для машин. Для обучения нужна и среда разработки, которая не будет генерировать код, но подсветит место ошибки. Выбрать лучшую не получится, но можно отметить сильные стороны каждой из сред разработки на Линукс.

Топ по категориям

Сегодняшний топ-лист сред для разработки на Линукс чем-то напомнит школьный конкурс красоты: без титула не останется ни один участник. К тому же, зачем описывать IDE, которые не имеют никаких достоинств? Концентрируя внимание на том, что лучше для Linux и эффективности самой программы, мы поможем новичку выбрать среду разработки, которая будет выполнять конкретную роль.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Универсальность не стоит денег

Обычно стоит, но не в случае с JDeveloper. Это среда разработки на Java, которая имеет славу наиболее универсальной IDE, если говорить о языке Java. Является одной из сред разработки для Java, которая разработана компанией Oracle. Их главной целью было создание Java IDE, которая вытеснит всех других игроков из этой ниши.

JDeveloper поддерживает взаимодействие с системами контроля версий, такими как Git. Благодаря этому, среда разработки активно используется в open-source проектах, включая и сводные дистрибутивы Linux. Вместе с гит-подобными в эту IDE внедрили поддержку облака от компании Oracle, редакторы всех основных веб-языков и веб-сервер. JDeveloper впечатляет разнообразием и функциональностью графического интерфейса, что делает его привлекательным для новичков. Кроме того, что эта программа отлично ладит с Java-кодом, она еще и написана на Java, что дает повод для создания расширений к этому ПО.

Фактором выбора для серьезных разработчиков стала поддержка Java EE – фреймворка по созданию приложений с уклоном на e-commerce. Тем не менее, JDeveloper не так распространен, как другие среды разработки на Линукс. Полноценно он ориентирован на Java, а один язык редко используется в крупной разработке. Хотя для Java трудно найти что-то более подходящее.

Лидер фримиума – NetBeans

Вот вам еще один пример софта от компании Oracle. Здесь нет прямой конкуренции «сам с собой», и вы поймете почему: это две разных среды разработки, которые используются для разных целей. Общим здесь будет разработка на Java и бесплатное распространение.

NetBeans не только разработан на Java, как и предшественник, но и является настоящим open-source, с двумя GPL на структурные элементы программы. Это значит, что все необходимые улучшения может провести тот, кто использует программу – джавист.

Из бесплатных IDE, NetBeans является наиболее распространенной средой разработки, в том числе и для Linux. Считается, что «бобы» всецело ориентированы на веб-разработку, и это не беспочвенные заявления. Среда поддерживает PHP, Ruby и Python – лидеров веба. Правда для этих PL необходимо установить соответствующий плагин.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

У NetBeans есть еще один очень привлекательный элемент для разработки – GUI Builder. Из названия вы могли догадаться о его предназначении: составление интерфейсов для программ. Только у NetBeans он делает программирование все больше похожим на дизайн. Вы просто перетаскиваете нужные элементы и конструируете из них интерфейс.

Лидер топа в будущем – MyEclipse

Со средой разработки Eclipse вы уже, наверняка, знакомы – одна из самых популярных в свободном доступе. Ее создали в ответ на Visual Studio и понемногу она отбирает поклонников у продукта Microsoft.

Для Java-разработчика Eclipse привлекателен тем, что владеет Java Development Tools, которые существенно ускоряют разработку. Ну, а если к этому добавить еще различных фишек из My, получается полноценный элемент для веб-разработки на Java.

По сути, это совокупность плагинов и расширений Eclipse. MyEclipse можно собрать самостоятельно, скачав плагины из магазина на сайте eclipse.org. Но, здесь уже все адаптировано для фулл-стека: присутствует даже редактор изображений, хоть и довольно примитивный. Несмотря на красивый лозунг – «Лучшая Java EE IDE для разработчика-фуллстека», продукт еще не нашел признания у масс. Впереди развитие!

Оффтоп: кроме этих серьезных инструментов, существуют и решения для обучения такие, как DrJava. Исключительно университетский вариант, но, как это бывает среди программистов, существуют фанаты этой системы. Ее легко настроить и немедленно приступить к созданию программы. Здесь вы не установите массу плагинов и не расширите функционал. Но, как инструмент обучения – эта среда разработки идеальна. Особенно, если учесть, что она «дружит» с Linux. Популярности этой IDE способствует и то, что у нее не так много конкурентов. Самый яркий из них – BlueJ, но с ним мы встретимся в других обзорах. А пока все!

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Full-Stack практика. Создание JavaScript блога

Создание веб-приложения с нуля на JavaScript, NodeJS, ExpressJS

Источник

Настраиваем рабочее окружение для разработки на Java под Linux

Ну вот, эпоха моего вынужденного эникейства подошла к концу. Снова я в своей струе, занимаясь своей любимой java, правда, все равно с некоторым таким горьким послевкусием. Разрабатывая ПО для банков и до этого периодически отходя к 1С, почему то у меня теперь четкая ассоциация с тем, что пишу туже конфигурацию 1С, но только на джаве. Ладно, хоть мозги снова запущу, деградировавшие на прошлой работе.

Как всегда заведено в программерских конторах, работать приходилось под Линуксом. Почему-то в офисе любимым дистрибутивом оказался Mint, уж с чем такое связано мне не понять. Упрощенный Убунту уж явно путь в никуда, только упрощенный синтаксис apt уже заставляет лениться и потом работая в Debian как-то себя не очень комфортно начинаешь ощущать.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Ну что поделать, Mint так Mint. Остается лишь настроить для разработки рабочее окружение.

Итак, сама разработка ведется на старой java 1.7, потому как ядро программы написано именно на ней. Поэтому я и решил написать такой небольшой мануал для тех, кто столкнется с такими небольшими проблемами.

Итак, пишем на java 1.7, используем IntelliJ IDEA Community в качестве IDE, SQL Developer в качестве управления базами данных, git и maven в качестве сборщика.

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

Все, больше дефолтный jdk нас не беспокоит. Теперь нужно установить нужные нам версии оракловой джавы. Сразу сделаю уточнение – мой стенд работает на джаве 1.7, а вот последняя версия sql developer – на jdk 1.8. Поэтому нам нужно будет установить обе версии. Нам нужно будет подключить нужный оракловый репозиторий, для этого в терминале введем:

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update
sudo apt-get install oracle-java7-installer
sudo apt-get install oracle-java8-installer

На самом деле, здесь я немного сделал не совсем правильный ход, удалив сначала openjdk. Гораздо лучше сначала установить оракловые пакеты, а потом сделать чистку дефолтного пакета, чтобы зависимости не нарушились. Но у меня система была чистая, поэтому я могу так поступить. Вы же делайте на свое усмотрение.
Итак, обе версии джавы установлены в системе. Однако есть одно «но» — при запуске команды java –version вам система покажет, что установлена именно 1.8 в качестве jdk по умолчанию. Лично меня это в корне не устраивает. К счастью, в Debian подобных системах можно легко переключаться между различными версиями джавы всего одной строчкой кода:

Соответсвенно, эта же команда будет для переключения на джава 8, только вместо цифры 7 нужно поставить 8.

Если захотите указать java 1.7 в качестве дефолтной системы, делается это командой:

sudo apt-get install oracle-java7-set-default

Теперь установим Sql Developer. Вот здесь и начинаются пляски с бубном, так как этой среды пока нет в виде deb пакетов. Что ж, выкрутимся таким способом:
1. Выкачиваем rpm пакет на компьютер.
2. Теперь при помощи утилиты alien мы преобразуем скачанный пакет в deb. У меня это версия 4.1.5.21.78, поэтому команда будет выглядеть в моем случае так:

3. Установим преобразованный пакет:

После этого осталось сделать очень важную вещь – прописать путь для sql developer к jdk 1.8, иначе на 1.7 он у вас просто не заведется. Для этого в файле sqldeveloper.conf нужно раскомментировать строчку с указанием пути до jdk и прописать нужный путь в него. Сохранить и проверить. Студия должна завестись.

Теперь остается установить в систему maven, git и Идею. С IntelliJ IDEA Community все просто – скачиваем и запускаем start.sh.

maven мы просто поставим стандартными средствами:
sudo apt-get install maven

Проверим, что он нормально установился:

git мы поставим таким же способом:

После этого обновим зависимости:

И перезагрузим систему. Все, на примере моего рабочего окружения для стенда я показал, как настроить весь необходимый инструмент для java разработки. К сожалению, данное руководство весьма поверхностно и здесь не описано множество необходимых настроек для всего этого инструментария. Но все это нужно делать индивидуально под тот или иной проект. Поэтому тут вы уже сами должны сделать все необходимое. Учтите одно – при разработке на java под любой платформой вам все равно придется часто переключаться между различными jdk. Это абсолютно нормальное явление для этой технологии. Слишком много различного кода написано на старых версиях платформы и его нужно поддерживать и постепенно переписывать.

Еще одно напутствие тем, кто решился изучать этот язык и технологию – непонятно его будущее. Да, вышел jdk 1.9, однако Оракл почему-то не анонсировал выход EE 1.9, а именно интерпрайзовская джава служит локомотивом для солидной разработки. Тем не менее, язык очень простой. Я серьезно. По сравнению с C++ ява детский лепет. Честно говоря, как по мне, он даже проще C#, так как в нем очень простой и очевидный синтаксис. Тем не менее, я скоро начну серию уроков по java, так что наведывайтесь на мой блог 🙂

Источник

Инструменты для запуска и разработки Java приложений, компиляция, выполнение на JVM

Ни для кого не секрет, что на данный момент Java — один из самых популярных языков программирования в мире. Дата официального выпуска Java — 23 мая 1995 года.

Эта статья посвящена основам основ: в ней изложены базовые особенности языка, которые придутся кстати начинающим “джавистам”, а опытные Java-разработчики смогут освежить свои знания.

* Статья подготовлена на основе доклада Евгения Фраймана — Java разработчика компании IntexSoft.
В статье присутствуют ссылки на внешние материалы
.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

1. JDK, JRE, JVM

Java Development Kit — комплект разработчика приложений на языке Java. Он включает в себя Java Development Tools и среду выполнения Java — JRE (Java Runtime Environment).

Java development tools включают в себя около 40 различных тулов: javac (компилятор), java (лаунчер для приложений), javap (java class file disassembler), jdb (java debugger) и др.

Среда выполнения JRE — это пакет всего необходимого для запуска скомпилированной Java-программы. Включает в себя виртуальную машину JVM и библиотеку классов Java — Java Class Library.

JVM — это программа, предназначенная для выполнения байт-кода. Первое преимущество JVM — это принцип “Write once, run anywhere”. Он означает, что приложение, написанное на Java, будет работать одинаково на всех платформах. Это является большим преимуществом JVM и самой Java.

До появления Java, многие компьютерные программы были написаны под определенные компьютерные системы, а предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Со второй половины 1990-х годов, после появления Java, автоматическое управление памятью стало общей практикой.

Существует множество реализаций JVM, как коммерческих, так и с открытым кодом. Одна из целей создания новых JVM — увеличение производительности для конкретной платформы. Каждая JVM пишется под платформу отдельно, при этом есть возможность написать ее так, чтобы она работала быстрее на конкретной платформе. Самая распространённая реализация JVM — это JVM Hotspot от OpenJDK. Также есть реализации IBM J9, Excelsior JET.

2. Выполнение кода на JVM

Согласно спецификации Java SE, для того, чтобы получить код, работающий в JVM, необходимо выполнить 3 этапа:

3. Загрузчики классов и их иерархия

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

Представьте ситуацию: мы написали свое приложение, и помимо стандартных классов там есть наши классы, и их очень много. Как с этим будет работать JVM? В Java реализована отложенная загрузка классов, иными словами lazy loading. Это значит, что загрузка классов не будет выполняться до тех пор, пока в приложении не встретится обращение к классу.

Иерархия загрузчиков классов

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Первый загрузчик классов — это Bootstrap classloader. Он написан на C++. Это базовый загрузчик, который загружает все системные классы из архива rt.jar. При этом, есть небольшое отличие между загрузкой классов из rt.jar и наших классов: когда JVM загружает классы из rt.jar, она не выполняет все этапы проверки, которые выполняются при загрузке любого другого класс-файла т.к. JVM изначально известно, что все эти классы уже проверены. Поэтому, включать в этот архив какие-либо свои файлы не стоит.

Следующий загрузчик — это Extension classloader. Он загружает классы расширений из папки jre/lib/ext. Допустим, вы хотите, чтобы какой-то класс загружался каждый раз при старте Java машины. Для этого вы можете скопировать исходный файл класса в эту папку, и он будет автоматически загружаться.

Еще один загрузчик — System classloader. Он загружает классы из classpath’а, который мы указали при запуске приложения.

Процесс загрузки классов происходит по иерархии:

4. Структура Сlass-файлов и процесс загрузки

Перейдем непосредственно к структуре Class-файлов.

Все числа, строки, указатели на классы, поля и методы хранятся в Сonstant pool — области памяти Meta space. Описание класса хранится там же и содержит имя, модификаторы, супер-класс, супер-интерфейсы, поля, методы и атрибуты. Атрибуты, в свою очередь, могут содержать любую дополнительную информацию.

Таким образом, при загрузке классов:

5. Исполнение байт-кода на JVM

В первую очередь, для исполнения байт-кода, JVM может его интерпретировать. Интерпретация — довольно медленный процесс. В процессе интерпретации, интерпретатор “бежит” построчно по класс-файлу и переводит его в команды, которые понятны JVM.

Также JVM может его транслировать, т.е. скомпилировать в машинный код, который будет исполняться непосредственно на CPU.

Команды, которые исполняются часто, не будут интерпретироваться, а сразу будут транслироваться.

6. Компиляция

Компилятор — это программа, которая преобразует исходные части программ, написанные на языке программирования высокого уровня, в программу на машинном языке, “понятную” компьютеру.

Компиляторы делятся на:

Также компиляторы могут классифицироваться по моменту компиляции:

7. Организация памяти в Java

Стек — это область памяти в Java, которая работает по схеме LIFO — “Last in — Fisrt Out” или “Последним вошел, первым вышел”.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

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

Когда вызывается любой метод в Java, создается фрейм или область памяти в стеке, и метод кладется на его вершину. Когда метод завершает выполнение, он удаляется из памяти, тем самым освобождая память для следующих методов. Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError. К примеру, это может произойти, если у нас будет рекурсивная функция, которая будет вызывать сама себя и памяти в стеке не будет хватать.

Ключевые особенности стека:

Куча разбита на несколько более мелких частей, называемых поколениями:

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Почему отказались от Permanent generation? В первую очередь, это из-за ошибки, которая была связана с переполнением области: так как Perm имел константный размер и не мог расширяться динамически, рано или поздно память заканчивалась, кидалась ошибка, и приложение падало.

Meta space же имеет динамический размер, и во время исполнения он может расширяться до размеров памяти JVM.

Ключевые особенности кучи:

Основываясь на информации выше, рассмотрим, как происходит управление памятью на простом примере:

У нас есть класс App, в котором единственный метод main состоит из:

— примитивной переменой id типа int со значением 23
— ссылочной переменной pName типа String со значением Jon
— ссылочной переменной p типа person

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Как уже упоминалось, при вызове метода на вершине стека создаётся область памяти, в которой хранятся данные, необходимые этому методу для выполнения.
В нашем случае, это ссылка на класс person: сам объект хранится в куче, а в стеке хранится ссылка. Также в стек кладется ссылка на строку, а сама строка хранится в куче в String pool. Примитив хранится непосредственно в стеке.

Для вызова конструктора с параметрами Person (String) из метода main() в стеке, поверх предыдущего вызова main() создается в стеке отдельный фрейм, который хранит:

this — ссылка на текущий объект
— примитивное значение id
— ссылочную переменную personName, которая указывает на строку в String Pool.

После того, как мы вызвали конструктор, вызывается setPersonName(), после чего снова создается новый фрейм в стеке, где хранятся те же данные: ссылка на объект, ссылка на строку, значение переменной.

Таким образом, когда выполнится метод setter, фрейм пропадет, стек очистится. Далее выполняется конструктор, очищается фрейм, который был создан под конструктор, после чего метод main() завершает свою работу и тоже удаляется из стека.

Если будут вызваны другие методы, для них будут также созданы новые фреймы с контекстом этих конкретных методов.

8. Garbage collector

В куче работает Garbage collector — программа, работающая на виртуальной машине Java, которая избавляется от объектов, к которым невозможно получить доступ.

Разные JVM могут иметь различные алгоритмы сборки мусора, также существуют разные сборщики мусора.

Мы поговорим о самом простом сборщике Serial GC. Сборку мусора мы запрашиваем при помощи System.gc().

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

Как уже было упомянуто выше, куча разбита на 2 области: New generation и Old generation.

New generation (младшее поколение) включает в себя 3 региона: Eden, Survivor 0 и Survivor 1.

Old generation включает в себя регион Tenured.

Что происходит, когда мы создаем в Java объект?

В первую очередь объект попадает в Eden. Если мы создали уже много объектов и в Eden уже нет места, срабатывает сборщик мусора и освобождает память. Это, так называемая, малая сборка мусора — на первом проходе он очищает область Eden и кладёт “выжившие” объекты в регион Survivor 0. Таким образом регион Eden полностью высвобождается.

Если произошло так, что область Eden снова была заполнена, garbage collector начинает работу с областью Eden и областью Survivor 0, которая занята на данный момент. После очищения выжившие объекты попадут в другой регион — Survivor 1, а два остальных останутся чистыми. При последующей сборке мусора в качестве региона назначения опять будет выбран Survivor 0. Именно поэтому важно, чтобы один из регионов Survivor всегда был пустым.

JVM следит за объектами, которые постоянно копируются и перемещаются из одного региона в другой. И для того, чтобы оптимизировать данный механизм, после определённого порога сборщик мусора перемещает такие объекты в регион Tenured.

Когда в Tenured места для новых объектов не хватает, происходит полная сборка мусора — Mark-Sweep-Compact.

как программировать на java в linux. Смотреть фото как программировать на java в linux. Смотреть картинку как программировать на java в linux. Картинка про как программировать на java в linux. Фото как программировать на java в linux

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *