JavaRush /Java блогы /Random-KK /Жабдық астында Java қосымшаларын құрастыру және орындау
Павел Голов
Деңгей
Москва

Жабдық астында Java қосымшаларын құрастыру және орындау

Топта жарияланған

Мазмұны:

  1. Кіріспе
  2. Байт-codeқа құрастыру
  3. Бағдарламаны құрастыру және орындау мысалы
  4. Виртуалды машинада бағдарламаны орындау
  5. Just-in-time (JIT) компиляциясы
  6. Қорытынды
Жабдық астында Java қосымшаларын құрастыру және орындау - 1

1. Кіріспе

Бәріңе сәлем! Бүгін мен Java жазбаша қолданбасын іске қосқаннан кейін JVM (Java виртуалды машинасы) қақпағы астында не болатыны туралы біліммен бөліскім келеді. Қазіргі уақытта JVM ішкі бөліктері туралы ойлаудан, Java codeын құрастырудан және орындаудан аулақ болуға көмектесетін заманауи әзірлеу орталары бар, бұл жаңа әзірлеушілердің осы маңызды аспектілерді жіберіп алуына әкелуі мүмкін. Сонымен қатар, сұхбат кезінде осы тақырыпқа қатысты сұрақтар жиі қойылады, сондықтан мен мақала жазуды шештім.

2. Байтcodeқа компиляция

Жабдық астында Java қосымшаларын құрастыру және орындау - 2
Теориядан бастайық. Кез келген қосымшаны жазғанда кеңейтімі бар файл жасаймыз .javaжәне оған Java бағдарламалау тілінде code қоямыз. Адам оқи алатын codeы бар мұндай файл бастапқы code файлы деп аталады . Бастапқы code файлы дайын болғаннан кейін оны орындау керек! Бірақ кезеңде ол адамдарға ғана түсінікті ақпаратты қамтиды. Java – көп платформалы бағдарламалау тілі. Бұл Java тілінде жазылған бағдарламаларды арнайы Java жұмыс уақыты жүйесі орнатылған кез келген платформада орындауға болатынын білдіреді. Бұл жүйе Java виртуалды машинасы (JVM) деп аталады. Бағдарламаны бастапқы codeтан JVM түсінетін codeқа аудару үшін оны құрастыру керек. JVM түсінетін code byte code деп аталады және виртуалды машина кейіннен орындайтын нұсқаулар жинағынан тұрады. javacБастапқы codeты byte codeқа құрастыру үшін JDK (Java Development Kit) құрамына кіретін компилятор бар . Енгізу ретінде компилятор .javaбағдарламаның бастапқы codeын қамтитын кеңейтімі бар файлды қабылдайды және шығыс ретінде .classвиртуалды машинамен орындалатын бағдарлама үшін қажетті byte codeын қамтитын кеңейтімі бар файлды шығарады. Бағдарлама byte-codeқа құрастырылғаннан кейін оны виртуалды машина арқылы орындауға болады.

3. Бағдарламаны құрастыру және орындау мысалы

Calculator.javaБізде пәрмен жолының 2 сандық аргументін алатын және оларды қосу нәтижесін басып шығаратын файлда бар қарапайым бағдарлама бар делік :
class Calculator {
    public static void main(String[] args){
        int a = Integer.valueOf(args[0]);
        int b = Integer.valueOf(args[1]);

        System.out.println(a + b);
    }
}
javacБұл бағдарламаны byte codeқа компиляциялау үшін пәрмен жолында компиляторды қолданамыз :
javac Calculator.java
Компиляциядан кейін біз шығыс ретінде byte codeы бар файлды аламыз Calculator.class, оны пәрмен жолындағы java пәрмені арқылы компьютерде орнатылған java машинасы арқылы орындауға болады:
java Calculator 1 2
Файл атауынан кейін командалық жолдың 2 аргументі көрсетілгенін ескеріңіз - 1 және 2 сандар. Бағдарламаны орындағаннан кейін пәрмен жолында 3 саны көрсетіледі. Жоғарыдағы мысалда бізде өздігінен өмір сүретін қарапайым класс болды. . Бірақ егер сынып кейбір пакетте болса ше? Келесі жағдайды имитациялайық: каталогтарды жасаңыз src/ru/javarushжәне біздің сыныпты сонда орналастырыңыз. Енді ол келесідей көрінеді (файлдың басына бума атауын қостық):
package ru.javarush;

class Calculator {
    public static void main(String[] args){
        int a = Integer.valueOf(args[0]);
        int b = Integer.valueOf(args[1]);

        System.out.println(a + b);
    }
}
Мұндай классты келесі пәрменмен құрастырайық:
javac -d bin src/ru/javarush/Calculator.java
Бұл мысалда біз құрастырылған файлдарды каталогқа ұқсас құрылымы бар -d binкаталогқа орналастыратын қосымша компилятор опциясын қолдандық , бірақ каталогты алдын ала жасау керек. Бұл әдіс бастапқы code файлдарын byte-code файлдарымен шатастырмау үшін қолданылады. Құрастырылған бағдарламаны іске қоспас бұрын, тұжырымдаманы түсіндіріп алған жөн . виртуалды машина пакеттер мен құрастырылған сыныптарды іздейтін жол. Яғни, осылайша виртуалды машинаға файлдық жүйедегі қандай каталогтар Java пакетінің иерархиясының түбірі екенін айтамыз. жалаушаны пайдаланып бағдарламаны іске қосу кезінде көрсетуге болады . Біз бағдарламаны пәрмен арқылы іске қосамыз: binsrcbinclasspathClasspathClasspath-classpath
java -classpath ./bin ru.javarush.Calculator 1 2
Бұл мысалда біз сыныптың толық атауын, оның ішінде ол орналасқан пакеттің атауын талап еттік. Соңғы файл ағашы келесідей көрінеді:
├── src
│     └── ru
│          └── javarush
│                  └── Calculator.java
└── bin
      └── ru
           └── javarush
                   └── Calculator.class

4. Бағдарламаны виртуалды машинамен орындау

Сонымен, біз жазбаша бағдарламаны іске қостық. Бірақ құрастырылған бағдарлама виртуалды машина арқылы іске қосылғанда не болады? Алдымен компиляция және codeты түсіндіру ұғымдарының нені білдіретінін анықтап алайық. Компиляция – жоғары деңгейлі бастапқы тілде жазылған бағдарламаны машиналық codeқа ұқсас төменгі деңгейлі тілдегі баламалы бағдарламаға аудару. Интерпретация – оператор бойынша (команда бойынша, жол бойынша) талдау, өңдеу және бастапқы бағдарламаны немесе сұранысты дереу орындау (компиляцияға қарағанда, бағдарлама оны орындамай аударылады). Java тілінде компилятор ( javac) да, интерпретатор да бар, ол byte codeты жол бойынша машина codeына түрлендіретін және оны бірден орындайтын виртуалды машина. Осылайша, компиляцияланған бағдарламаны іске қосқан кезде виртуалды машина оны интерпретациялай бастайды, яғни byte codeты машиналық codeқа жол бойынша түрлендіру, сонымен қатар оның орындалуы. Өкінішке орай, таза byte codeты интерпретациялау өте ұзақ процесс және бәсекелестермен салыстырғанда java-ны баяу етеді. Бұған жол бермеу үшін виртуалды машина арқылы byte codeты түсіндіруді жеделдету механизмі енгізілді. Бұл механизм Just-in-time Compilation (JITC) деп аталады.

5. Just-in-time (JIT) компиляциясы

Қарапайым тілмен айтқанда, Just-In-Time компиляциясының механизмі мынада: егер бағдарламада бірнеше рет орындалатын code бөліктері болса, болашақта олардың орындалуын жылдамdate үшін оларды машиналық codeқа бір рет компиляциялауға болады. Бағдарламаның мұндай бөлігін машиналық codeқа құрастырғаннан кейін, бағдарламаның осы бөлігіне әрбір келесі шақырумен виртуалды машина оны интерпретациялаудың орнына құрастырылған машиналық codeты дереу орындайды, бұл табиғи түрде бағдарламаның орындалуын тездетеді. Бағдарламаны жеделдету жадты тұтынуды ұлғайту арқылы (компиляцияланған машина codeын бір жерде сақтауымыз керек!) және бағдарламаны орындау кезінде компиляцияға кететін уақытты ұлғайту арқылы жүзеге асырылады. JIT компиляциясы өте күрделі механизм, сондықтан жоғарыдан өтейік. JIT компиляциясының 4 деңгейі бар byte codeты машиналық codeқа айналдыру. Компиляция деңгейі неғұрлым жоғары болса, соғұрлым ол күрделірек болады, бірақ сонымен бірге мұндай бөлімнің орындалуы төменгі деңгейлі бөлімге қарағанда жылдамырақ болады. JIT - Компилятор бағдарламаның әрбір фрагменті үшін қандай компиляция деңгейін орнату керектігін сол фрагменттің қаншалықты жиі орындалатынына байланысты шешеді. Сорғыштың астында JVM 2 JIT компиляторын пайдаланады - C1 және C2. C1 компиляторы клиенттік компилятор деп те аталады және codeты тек 3-ші деңгейге дейін құрастыра алады. C2 компиляторы 4-ші, ең күрделі және ең жылдам компиляция деңгейіне жауап береді.
Жабдық астында Java қосымшаларын құрастыру және орындау – 3
Жоғарыда айтылғандардан қарапайым клиенттік қосымшалар үшін C1 компиляторын пайдалану тиімдірек деген қорытынды жасауға болады, өйткені бұл жағдайда қосымшаның қаншалықты жылдам басталатыны біз үшін маңызды. Сервер жағындағы, ұзақ өмір сүретін қолданбаларды іске қосу ұзағырақ уақыт алуы мүмкін, бірақ болашақта олар жұмыс істеп, өз функцияларын жылдам орындауы керек - мұнда бізге C2 компиляторы қолайлы. -clientJVM жүйесінің x32 нұсқасында Java бағдарламасын іске қосқан кезде және жалаушалары арқылы қай режимді қолданғымыз келетінін қолмен белгілей аламыз -server. Бұл жалауша көрсетілген кезде, -clientJVM күрделі byte codeты оңтайландыруды орындамайды, бұл қолданбаны іске қосу уақытын жылдамдатады және тұтынылатын жад көлемін азайтады. Жалаушаны көрсеткенде, -serverкүрделі byte-codeты оңтайландыруларға байланысты қолданбаның іске қосылуы ұзағырақ болады және машина codeын сақтау үшін көбірек жадты пайдаланады, бірақ бағдарлама болашақта жылдамырақ жұмыс істейді. JVM x64 нұсқасында жалауша -clientеленбейді және қолданба serverінің конфигурациясы әдепкі бойынша пайдаланылады.

6. Қорытынды

Бұл Java қолданбасын құрастыру және орындау қалай жұмыс істейтіні туралы қысқаша шолуды аяқтайды. Негізгі нүктелер:
  1. Javac компиляторы бағдарламаның бастапқы codeын Java виртуалды машинасы орнатылған кез келген платформада орындалатын byte codeқа түрлендіреді;
  2. Компиляциядан кейін JVM алынған byte codeты түсіндіреді;
  3. Java қолданбаларын жылдамdate үшін JVM бағдарламаның ең жиі орындалатын бөлімдерін машиналық codeқа түрлендіретін және оларды жадта сақтайтын Just-In-Time компиляция механизмін пайдаланады.
Бұл мақала біздің сүйікті бағдарламалау тіліміз қалай жұмыс істейтінін тереңірек түсінуге көмектесті деп үміттенемін. Оқығаныңыз үшін рахмет, сын қабыл болсын!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION