| Главная » Статьи » 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 | |
| Просмотров: 371 | | |
| Всего комментариев: 0 | |