Главная » Статьи » Java » Java Ranger Basic

День 6/21
JVM, ClassLoaders

Java Virtual Machine
На рынке одновременно присутствуют разные JVM:
Тяжелая виртуальная машина – HotSpot. Это основная виртуальная машина Java для настольных компьютеров и серверов. У тяжелых JVM garbage collector обычно копирующий, это значит, что он может перемещать объекты по памяти при ее фрагментированности. JVM HotSpot написана на C.
Средняя виртуальная машина – Dalvik (та, что у Android). Она немного слабее, но достаточно сильная.
Слабая виртуальная машина – у дешевого телефона Nokia 10-летней давности. Она тоже поддерживает Java-приложения, он там вся JVM помещается в 300 Кб памяти.

JVM Parameters

При запуске java.exe можно указывать дополнительный параметры с помощью флагов. Договорились, что флаг начинается со знака минус «-», далее идет имя флага, знак равно «=» и значение:

java.exe –cp=xyz.jar ClassName.class

Если после флага идет пробел, то считается, что пошел уже следующий параметр.
Если после знака минус идет не буква -x, то считается, что все JVM обязаны поддерживать этот флаг. Таких флагов штук 10.
Если же после знака минус флаг начинается с буквы -x, то это означает, что JVM не обязана поддерживать этот флаг, но вроде как авторы всех JDK сегодня на рынке об этом договорились и они все это поддерживают. Таких флагов уже около 100. Пример:

java.exe –xss=100K ClassName.class

В этом примере мы установили stack size = 100K. Для чего это нужно? Например, мы пишем программу, в которой используется очень глубокая рекурсия, мы погружаемся на 1000 шагов вглубь, запускаем класс, заливаем на Android и падаем по StackOverflowError. Потому что на андроиде памяти мало и виртуальная машина глубину стека делает маленькой. Тогда нужно при запуске программы указать, чтобы размер стека был больше.
Бывают еще флаги с именем, начинающемся с -xx. Это означает, что флаг нестандартный, авторы конкретной JVM сейчас его вкрутили, в соседней JVM (в андроиде, в JVM от IBM, или другой) этого флага может не быть. Более того, этот же флаг может исчезнуть в следующей версии этой же JVM от этой же конторы. Таких флагов около 200-300.
Таким образом, при помощи параметров (флагов) можно очень тонко настроить JVM.

ClassLoaders

Когда мы пишем, к примеру, HelloWorld, у нас получается три Class Loaders, которые образуют иерархию. Собственно, у нас есть наш Class Loader (который грузит класс, в котором метод main), который относится к Extension Class Loader (в JRE грузит папку ext, мы туда можем положить библиотеки, расширив JDK таким образом), который относится к Default Class Loader (который грузит rt.jar – JDK).
Между ними происходит жуткое общение, но в общем Class Loader обязан сначала обратиться к предку и если предок не смог загрузить, то он грузит сам. И JVM за этим жутко следит. Это сделано для того, чтобы мы не могли своим Class Loader загрузить, к примеру, класс java.lang.String. Потому что если мы сможем класс String загрузить, чтобы это был наш класс String, то мы в общем-то сможем поломать JDK – сделать свой класс, который мутирующий и т.д.
Мы можем создавать ClassLoader – загрузчик классов.




В следующей теме мы рассмотрим: Java I/O

Источник: http://becomejavasenior.com/courses/?utm_source=Java+Email+Courses&utm_campaign=aa710df388-JavaRangerBasicIntro&utm_medi
Категория: Java Ranger Basic | (06.10.2015) W
Просмотров: 371 | Теги: Java Ranger Basic | Рейтинг: 0.0/0
Всего комментариев: 0
avatar