Страницы

Поиск по вопросам

Показаны сообщения с ярлыком jdk. Показать все сообщения
Показаны сообщения с ярлыком jdk. Показать все сообщения

пятница, 12 июля 2019 г.

Будут ли работать java приложения, если установить jdk86 вместо jdk64?

У меня Win 10 x64. Вопрос, что будет, если закачать jdk для x86 (32bit) на свою систему ? Какие теоретически сбои/проблемы могут возникнуть ?


Ответ

Проблемы с JNI, если используете. Может вообще не установится Возможна просадка по производительности в многопоточных приложениях (из-за особенности трединга на разно разрядных системах, например volatile long на 64bit не требует синхронизации, а на 32bit требует, так как он превышает размер регистра на 32х битной системе.

среда, 10 июля 2019 г.

Почему установщик JDK предлагает поставить рядом и JRE?

Дилетантский вопрос. Ставлю я, к примеру, jdk-8u102-windows-x64.
В инсталяторе есть опция - Public JRE.
Если её включить, то на выходе получаем папку jdk (внутри которой есть jre) и рядом с jdk - ещё одна папка jre. Папки jdk/jre и вторая jre очень похожи. Причём в jdk/jre даже немного больше файлов.
Для чего это вообще сделано?


Ответ

@zRrr прав. http://docs.oracle.com/javase/7/docs/webnotes/install/windows/jdk-installation-windows.html#private Здесь написано, что jdk/jre используется для инструментов только этого jdk, и никак не регистрируется в системе. Public Jre может использоваться другими java приложениями и добавляется в реестр windows, может быть удалено из панели управления.

воскресенье, 9 июня 2019 г.

Сколько всего способов создать объект в java?

Сколько всего существует способов создать объект в java ? Я знаю два, с new и без него. Есть ли еще способы?
Где java использует реализацию без new, кроме сериализации?


Ответ

Примерно такие:
public static void main(String[] args) { Test test = new Test(); Class testClass = Class.forName("Test"); Test test1 = testClass.newInstance(); EnumTest enumTest = EnumTest.ONE; }
class Test{}
enum EnumTest{ONE;}

четверг, 30 мая 2019 г.

Проблема при установке Oracle JDK на Debian

Возникла ошибка при установке Oracle JDK на Debian 8 Jessie
rostislav@Rostislav-PC:~/Загрузки$ sudo dpkg -i jdk1.8.0-91_1.8.091-1_amd64.deb Выбор ранее не выбранного пакета jdk1.8.0-91. (Чтение базы данных … на данный момент установлено 119167 файлов и каталогов.) Подготовка к распаковке jdk1.8.0-91_1.8.091-1_amd64.deb … Распаковывается jdk1.8.0-91 (1.8.091-1) … Настраивается пакет jdk1.8.0-91 (1.8.091-1) … Unpacking JAR files... tools.jar... plugin.jar... javaws.jar... deploy.jar... rt.jar... jsse.jar... charsets.jar... localedata.jar... jfxrt.jar... /var/lib/dpkg/info/jdk1.8.0-91.postinst: line 641: /usr/sbin/alternatives: Нет такого файла или каталога /var/lib/dpkg/info/jdk1.8.0-91.postinst: line 653: /usr/sbin/alternatives: Нет такого файла или каталога dpkg: ошибка при обработке пакета jdk1.8.0-91 (--install): подпроцесс установлен сценарий post-installation возвратил код ошибки 127 При обработке следующих пакетов произошли ошибки: jdk1.8.0-91
Процесс установки был таким (инструкцию нашел тут):
Скачал официальную версию JDK с сайта Oracle. Установил alien из официального репозитория. Перегнал .rpm в .deb командой sudo alien --scripts jdk-8u91-linux-x64.rpm Установил .deb пакет командой sudo dpkg -i jdk1.8.0-91_1.8.091-1_amd64.deb, во время чего и возникла ошибка
Из-за чего произошла ошибка и как ее исправить?

UPD_0 (kvm): При попытке удалить JDK:
rostislav@Rostislav-PC:~$ dpkg --remove --force-remove-reinstreq jdk1.8.0-91 dpkg: ошибка: запрошенная операция требует привилегий суперпользователя rostislav@Rostislav-PC:~$ sudo dpkg --remove --force-remove-reinstreq jdk1.8.0-91 (Чтение базы данных … на данный момент установлено 116630 файлов и каталогов.) Удаляется jdk1.8.0-91 (1.8.091-1) … /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 586: /usr/sbin/alternatives: Нет такого файла или каталога /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 598: /usr/sbin/alternatives: Нет такого файла или каталога dpkg: ошибка при обработке пакета jdk1.8.0-91 (--remove): подпроцесс установлен сценарий post-removal возвратил код ошибки 127 При обработке следующих пакетов произошли ошибки: jdk1.8.0-91 rostislav@Rostislav-PC:~$ sudo dpkg --purge --force-remove-reinstreq jdk1.8.0-91(Чтение базы данных … на данный момент установлено 116630 файлов и каталогов.) Удаляется jdk1.8.0-91 (1.8.091-1) … /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 586: /usr/sbin/alternatives: Нет такого файла или каталога /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 598: /usr/sbin/alternatives: Нет такого файла или каталога dpkg: ошибка при обработке пакета jdk1.8.0-91 (--purge): подпроцесс установлен сценарий post-removal возвратил код ошибки 127 При обработке следующих пакетов произошли ошибки: jdk1.8.0-91


Ответ

Установить JDK из rpm это целое приключение, лучше воспользоваться java-package
Убедитесь, что подключены contrib архивы в /etc/apt/sources.list
deb jessie main contrib non-free
Установите java-package: apt install java-package Скачайте JDK с сайта Oracle, но не rpm, а tar.gz. Запустите создание deb-пакета JDK:
fakeroot make-jpkg jdk-8u91-linux-x64.tar.gz
Возможно, появятся ошибки о неудовлетворенных зависимостях, установите пакеты, о которых говорится в ошибках, затем заново запустите создание пакета. В моем случае было:
sudo apt install libgl1-mesa-glx libxslt1.1 libxtst6 libxxf86vm1
Удалите старый некорректно установленный пакет JDK. Установите созданный пакет
sudo dpkg -i oracle-java8-jdk_8u91_amd64.deb


UPD1. Если снести кривой пакет JDK через apt remove jdk1.8.0-91 не удается, удаляем его принудительно:
sudo dpkg --remove --force-remove-reinstreq jdk1.8.0-91 sudo dpkg --purge --force-remove-reinstreq jdk1.8.0-91

UPD2. Создайте симлинк
sudo ln -s /usr/sbin/update-alternatives /usr/sbin/alternatives
и еще раз попробуйте снести. Потом удалите симлинк.

четверг, 16 мая 2019 г.

Запуск Java-программы без javac (JDK 11)

Имеется:
JDK 11 и примитивная программа:
public class HelloWorld {
public static void main(String[] args) { System.out.println("Hello, World"); }
}
и применённая к ней команда chmod +x HelloWorld
Необходимо: запустить программу командой ./HelloWorld для печати в терминале:
Hello, World
минуя javac


Ответ

Решение.
Шаг 1: Создаём файл nano HelloWorld
Шаг 2:
#! /usr/local/java/jdk-11-ea18/bin/java --source 11
public class HelloWorld {
public static void main(String[] args) { System.out.println("Hello, World"); }
}
Шаг 3: ctrl+o, ctrl+x
Шаг 4: chmod +x HelloWorld
Шаг 5: ./HelloWorld
Видим, что программа отработала, и напечатала
Hello, World

вторник, 30 апреля 2019 г.

Доступ к приватным полям класса предка

Насколько я понимаю, при создании объекта класса через new выделяется область в Heap для хранения всех полей как самого класса, так и нестатичных публичных (и protected) полей всех его предков. А затем поочерёдно вызываются конструкторы всех предков, начиная со старшего, которые инициализируют, а возможно перезаписывают значения полей данного объекта. И в конце конструктор самого объекта-наследника инициализирует свои новые поля или, возможно, перезаписывает значения полей, которые уже инициализировали конструкторы предков. Вопрос в следующем. Если у предка есть приватные поля и публичные геттеры к ним, а наследник не переопределяет эти поля и геттеры, то из объекта наследника можно, вызвав унаследованный геттер, получить значение поля из приватного поля предка. Как происходит в действительности? При создании объекта создаются объекты всех его предков в отдельных областях памяти, со всеми своими полями? Или же, что мне кажется более вероятным, JVM понимает, что при наличии публичных геттеров у предка наследник может получить доступ к его приватным полям и поэтому создаёт в области памяти объекта-наследника приватные поля его предка?


Ответ

Объектный модуль класса, помимо прочей информации, содержит информацию о иерархии наследования, порядке следования полей и их размерах. То есть после загрузки класса у виртуальной машины в метаспейсе всегда есть "карта" объектов этого класса, по которой можно вычислить по какому смещению от начала блока памяти находится то или иное поле. При создании нового объекта выделяется блок достаточного объёма, чтобы хранить заголовок объекта, его поля, а также поля всех его суперклассов. Причём поля располагаются в порядке от корня наследования - сначала поля суперкласса, потом подкласса. Благодаря такому расположению "карта" суперкласса подходит для ориентирования в объекте подкласса. Для наглядности определим примитивную иерархию классов
class A { int x; int y; }
class B extends A { int z; }
Операция B obj = new B() выделит в куче такой блок
----------- -- | Заголовок | | ----------- |_ Класс A | x | | | y | | ----------- -- | z | |- Класс B ----------- --
Если мы теперь приведём тип объекта к базовому, то виртуальная машина будет выполнять операции доступа к полям объекта так, будто никакого хвостика, содержащего поле z, просто не существует.
Благодаря Алексею Шипилёву мы можем увидеть это вживую с помощью инструмента jol (Java Object Layout).
import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM;
public class ShowLayout { public static void main(String[] args) throws Exception { System.out.println(VM.current().details()); System.out.println(ClassLayout.parseClass(B.class).toPrintable()); } }
Компилируем
javac -cp jol-cli-0.9-full.jar ShowLayout.java
Запускаем
java -javaagent:jol-cli-0.9-full.jar ShowLayout
Получаем
# Running 64-bit HotSpot VM. # Using compressed oop with 3-bit shift. # Using compressed klass with 3-bit shift. # Objects are 8 bytes aligned. # Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] # Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 4 int A.x N/A 16 4 int A.y N/A 20 4 int B.z N/A Instance size: 24 bytes Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
Для методов каждого класса у JVM тоже есть "карта", указывающая по какому смещению в памяти находится начало того или иного метода. Есть два способа использования этой "карты" - раннее и позднее связывание (на самом деле больше, но это несущественно в текущем контексте). Обычный вызов метода
obj.getZ()
будет скомпилирован в байткод
aload_1 // Загрузка в стек ссылки на obj invokevirtual #4 // Method B.getZ:()I
Инструкция invokevirtual использует позднее связывание. То есть при вызове метода JVM анализирует контекст вызова (call site), определяет какой именно метод нужен и передаёт управление по требуемому смещению. Благодаря этому и возможен полиморфизм.
Вызов метода суперкласса (а также вызовы конструкторов и приватных методов)
super.getX();
будет скомпилирован в байткод
aload_0 // Ссылка this на объект класса B invokespecial #2 // Method A.getX:()I
Инструкция invokespecial использует ранее связывание. То есть ещё на этапе загрузки класса понятно какой именно метод какого именно класса надо будет вызвать, и JVM "зашивает" смещение этого метода в байткод.
Получив управлением метод getX (с помощью JVM, конечно) отсчитает нужное смещение от начала блока памяти, на который указывает переданная ссылка, до места где должно располагаться поле x в классе A, прочитает его значение, положит на вершину стека и вернёт управление вызывающему коду. Даже не догадываясь, что ссылка this на самом деле указывает на объект большего размера, и есть ли в подклассе метод с таким же именем, как у него.

пятница, 5 апреля 2019 г.

Что означает auto mode в update-alternatives --config java?

Что означает auto mode в update-alternatives --config java? Вот, что нашел в man, но это ситуацию не особо разъяснило.
automatic mode When a link group is in automatic mode, the alternatives system ensures that the links in the group point to the highest priority alternative appropriate for the group. manual mode When a link group is in manual mode, the alternatives system will not make any changes to the system administrator's settings.


Ответ

https://help.ubuntu.com/community/Java
вкратце, это механизм выбора пакетов по приоретам (для апдейтов, допустим). Ну, например, для java cуществуют по крайней мере 4 возможные для установки по дефолту реализации:
OpenJDK Oracle Java IBM Java GNU Compiler
автоматический режим выберет ту реализацию, которая считается системой "самой правильной"
ручной - оставит ту, которую ты указал изначально.
я бы советовал использовать автоматическую, а ручной режим выбирать только если ты точно знаешь, что твой софт не работает, например, с OpenJDK, а только с Oracle Java

понедельник, 17 декабря 2018 г.

В чём различие между jdk, sdk и j2sdk?

В чём заключается различие между JDK, SDK и J2SDK?


Ответ

SDK (software development kit) — набор инструментов для разработки приложений для определенной аппаратной/программной платформы.
JDK (java development kit) – набор инструментов для разработчика приложений на платформе и языке java (так как для платформы java можно писать приложения и на других языках программирования).
J2SDK (java 2 software development kit) – тоже что и JDK но название использовалось для версий 1.2.Х до 1.4.Х. С выходом java версии 1.2 было принято прибавлять цифру 2 к java для указания того что это следующая ступень развития языка/платформы. Добавление 2 продолжалось вплоть до версии java 1.5.0.12. С выходом java 1.5.0.12 двойку убрали.

В процессе развития платформы и языка java названия набор инструментов для разработки приложений (SDK) менялось:
1.Х использовалось название JDK, 1.2.Х по 1.5.11 – J2SDK в вперемешку с JDK, 1.5.12 по 1.8.X – JDK.
Более детально историю названия версий можно посмотреть здесь