JavaRush /Java Blog /Random-TK /JVM-e sapaklaryň nähili ýüklenýändigi
Aleksandr Zimin
Dereje
Санкт-Петербург

JVM-e sapaklaryň nähili ýüklenýändigi

Toparda çap edildi
Programmistiň işiniň iň kyn bölegi gutarandan we “Salam World 2.0” programmasy ýazylansoň, paýlaýyş toplumyny ýygnamak we müşderä ýa-da iň bolmanda synag hyzmatyna geçirmek galýar. Paýlanyşda hemme zat bolmalysy ýaly, programmamyzy işe girizenimizde Java wirtual maşyn sahna çykýar. Wirtual maşynyň synp faýllarynda görkezilen buýruklary bytekod görnüşinde okap, prosessoryň görkezmesi hökmünde terjime edýändigi hiç kim üçin syr däl. Wirtual maşyna girýän bytekodyň shemasy barada azajyk düşünmegi teklip edýärin.

Synp ýükleýjisi

JVM-e düzülen bytekod bilen üpjün etmek üçin ulanylýar, adatça giňeltme bilen faýllarda saklanýar .class, ýöne beýleki çeşmelerden hem alyp bolýar, mysal üçin, tor arkaly göçürip alnan ýa-da programmanyň özi. JVM-de sapaklaryň nähili ýüklenýändigi - 1Java SE spesifikasiýasyna görä, JVM-de kod işlemek üçin üç ädim ýerine ýetirmeli:
  • çeşmelerden kod koduny ýüklemek we synpyň mysalyny döretmekClass

    bu ozal ýüklenenleriň arasynda talap edilýän synpy gözlemegi, ýüklemek we dogrulygyny barlamak üçin kod koduny almak, synpyň mysalyny döretmek Class(iş wagty bilen işlemek üçin) we ene-atalar synplaryny ýüklemek ýaly maglumatlary öz içine alýar. Ene-atalar synplary we interfeýsler ýüklenmedik bolsa, sorag edilýän synp ýüklenmedik hasaplanýar.

  • baglaýjy (ýa-da baglanyşyk)

    Spesifikasiýa laýyklykda bu etap ýene üç basgançaga bölünýär:

    • Barlamak , alnan kod kodunyň dogrulygy barlanýar.
    • Statiki meýdanlar üçin RAM taýýarlamak , deslapky bahalar bilen başlamak (bu ýagdaýda aç-açan başlangyç, eger başlangyç bar bolsa, başlangyç etapda bolup geçýär).
    • Rezolýusiýa , görnüşleriň, meýdanlaryň we usullaryň simwoliki baglanyşyklarynyň çözgüdi.
  • alnan obýekti başlatmak

    bu ýerde, öňki abzaslardan tapawutlylykda, nämeleriň bolmalydygy düşnükli ýaly. Elbetde munuň nähili bolýandygyna düşünmek gyzykly bolar.

Bu ädimleriň hemmesi aşakdaky talaplar bilen yzygiderli ýerine ýetirilýär:
  • Baglanmazdan ozal synp doly ýüklenmeli.
  • Bir synp doly synagdan geçirilmeli we başlamazdan ozal taýýarlanmaly.
  • Baglanyş çözgüdi ýalňyşlyklary, baglanyşyk tapgyrynda ýüze çykarylsa-da, programma ýerine ýetirilende ýüze çykýar.
Bilşiňiz ýaly, Java sapaklary ýalta (ýa-da ýalta) ýüklemegi amala aşyrýar. Bu, ýüklenen synpyň salgy meýdanlarynyň synplarynyň ýüklenmegi, programma aç-açan salgylanma gabat gelýänçä ýerine ýetirilmejekdigini aňladýar. Başga sözler bilen aýdylanda, simwoliki baglanyşyklary çözmek islege bagly we adaty ýagdaýda ýüze çykmaýar. Şeýle-de bolsa, JVM durmuşa geçirilmegi kuwwatly synp ýüklemesini hem ulanyp biler. simwoliki baglanyşyklaryň hemmesi derrew göz öňünde tutulmalydyr. Hut şu maksat bilen iň soňky talap ulanylýar. Simwoliki baglanyşyklaryň çözgüdiniň synp ýüklemegiň haýsydyr bir basgançagy bilen baglanyşykly däldigini hem bellemelidiris. Umuman aýdanyňda, bu etaplaryň her biri gowy öwrenişýär; geliň, birinjisini kesgitlemäge synanyşalyň, ýagny kod koduny ýüklemek.

Java ýükleýjileriň görnüşleri

Java-da üç sany standart ýükleýji bar, olaryň hersi belli bir ýerden synp ýükleýär:
  1. “Bootstrap” esasy ýükleýjidir, oňa “Primordial ClassLoader” hem diýilýär.

    rt.jar arhiwinden standart JDK synplaryny ýükleýär

  2. “Extension ClassLoader” - giňeldiji ýükleýji.

    jre / lib / ext katalogynda ýerleşýän, ýöne java.ext.dirs ulgam eýeçiligi tarapyndan kesgitlenip bilýän giňeltme synplaryny ýükleýär.

  3. System ClassLoader - ulgam ýükleýjisi.

    CLASSPATH gurşaw üýtgeýjisinde kesgitlenen programma sapaklaryny ýükleýär

“Java” synp ýükleýjileriniň iýerarhiýasyny ulanýar, bu ýerde kök, elbetde, esasydyr. Ondan soň giňeltme ýükleýjisi, soňra bolsa ulgam ýükleýjisi gelýär. Elbetde, her bir ýükleýji, özi edip bilmeýän halatynda ýüklemegi tabşyrmak üçin ene-atasyna görkeziji saklaýar.

Abstrakt synp ClassLoader

Her bir ýükleýji, esasydan başga, abstrakt synpyň neslidir java.lang.ClassLoader. Mysal üçin, giňeltme ýükleýjiniň ýerine ýetirilmegi synp sun.misc.Launcher$ExtClassLoader, ulgam ýükleýjisi sun.misc.Launcher$AppClassLoader. Esasy ýükleýji ýerli we ony durmuşa geçirmek JVM-e girýär. Giňeldilen islendik synp, java.lang.ClassLoader“blackjack” we şuňa meňzeşler bilen sapaklary ýüklemegiň öz usulyny üpjün edip biler. Munuň üçin häzirki wagtda diňe ýüzleý seredip biljek degişli usullary täzeden kesgitlemeli, sebäbi Bu meselä jikme-jik düşünmedim. Ine:
package java.lang;
public abstract class ClassLoader {
    public Class<?> loadClass(String name);
    protected Class<?> loadClass(String name, boolean resolve);
    protected final Class<?> findLoadedClass(String name);
    public final ClassLoader getParent();
    protected Class<?> findClass(String name);
    protected final void resolveClass(Class<?> c);
}
loadClass(String name)sapaklary ýüklemek üçin giriş nokady bolan az sanly köpçülikleýin usullardan biri. Ony durmuşa geçirmek, başga bir goralýan usuly çagyrmak üçin gaýnadylýar loadClass(String name, boolean resolve). Bu goralýan usulyň Javadoc-a seretseňiz, aşakdaky ýaly bir zada düşünip bilersiňiz: giriş hökmünde iki parametr üpjün edilýär. Biri ýüklenmeli synpyň ikilik ady (ýa-da doly hünärli synp ady). Synpyň ady ähli paketleriň sanawy bilen görkezilýär. Ikinji parametr, simwoliki baglanyşyk çözgüdiniň zerurdygyny kesgitleýän baýdakdyr. Gaýybana, bu ýalňyş , ýagny ýalta synp ýüklemesi ulanylýar. Mundan başga-da, resminamalara laýyklykda, usulyň deslapky ýerine ýetirilişinde findLoadedClass(String name)synpyň eýýäm ýüklenendigini ýa-da ýokdugyny barlaýan we eger şeýle bolsa, bu synpa salgylanma berýän jaň edilýär. Otherwiseogsam, esasy ýükleýjiniň synp ýükleme usuly diýler. Eger ýükleýänleriň hiç biri ýüklenen synpy tapyp bilmese, olaryň her biri tersine tertipde şol synpy tapmaga we ýüklemäge synanyşar findClass(String name). Bu barada “Klassiki ýükleme shemasy” bölüminde has jikme-jik ara alnyp maslahatlaşylar. Iň soňunda bolsa, iň soňkusy, iň azyndan, synp ýüklenenden soň, çözgüt baýdagyna baglylykda , simwoliki baglanyşyklar arkaly sapaklary ýüklemek ýa-da ýüklemek karary berler. Muňa aýdyň mysal, rezolýusiýa tapgyryny synp ýükleme döwründe çagyryp bolar. Şoňa görä-de, synpy giňeltmek ClassLoaderwe usullaryna aşa baha bermek bilen, ýörite ýükleýji, bytekody wirtual maşyna ýetirmek üçin öz logikasyny durmuşa geçirip biler. Java, şeýle hem "häzirki" synp ýükleýji düşünjesini goldaýar. Häzirki ýükleýji, häzirki ýerine ýetirilýän synpy ýükleýän. Her synp haýsy ýükleýjiniň ýüklenendigini bilýär we bu maglumatlary çagyryp alyp bilersiňiz String.class.getClassLoader(). Applicationhli amaly synplar üçin "häzirki" ýükleýji adatça ulgamdyr.

Synp ýüklemegiň üç ýörelgesi

  • Delegasiýa

    Synpy ýüklemek haýyşy ene-atanyň ýükleýjisine geçirilýär we synpy ýüklemek synanyşygy diňe ene-atanyň synpyny tapyp we ýükläp bilmedik ýagdaýynda edilýär. Bu çemeleşme, sapaklara mümkin boldugyça ýakyn bolan ýükleýji bilen sapaklary ýüklemäge mümkinçilik berýär. Bu synpyň iň ýokary görünmegine ýetýär. Her bir ýükleýji, keşde ýerleşdirilen sapaklaryň ýazgysyny ýöredýär. Bu synplaryň toplumyna masştab diýilýär.

  • Görünmek

    Erükleýji diňe “onuň” synplaryny we “ene-atanyň” synplaryny görýär we “çagasy” tarapyndan ýüklenen sapaklar hakda hiç hili düşünje ýok.

  • Özboluşlylyk

    Bir synpy diňe bir gezek ýükläp bolýar. Delegasiýa mehanizmi, synp ýüklemesini başlaýan ýükleýjiniň ozal JVM-e ýüklenen synpy artykmaç ýüklemeýändigine göz ýetirýär.

Şeýlelik bilen, ýükleýjisini ýazanda, bir dörediji şu üç ýörelgä esaslanmalydyr.

Klassiki ýükleme shemasy

Bir synp ýüklemek üçin çagyryş ýüze çykanda, bu synp häzirki ýükleýjiniň eýýäm ýüklenen synplarynyň keşinde gözlenýär. Öň islenýän synp ýüklenmedik bolsa, delegasiýa ýörelgesi dolandyryşy iýerarhiýada bir derejeden ýokary ýerleşýän esasy ýükleýjä geçirýär. Ene ýükleýji, keşde islenýän synpy tapmaga synanyşýar. Synp eýýäm ýüklenen bolsa we ýükleýji onuň ýerleşýän ýerini bilýän bolsa, Classşol synpyň obýekti yzyna gaýtarylar. Notok bolsa, gözleg esasy ýükleýjä ýetýänçä dowam eder. Esasy ýükleýjiniň zerur synp barada maglumaty ýok bolsa (ýagny entek ýüklenmedi), bu synpyň kod kody berlen ýükleýjiniň bilýän synplarynyň ýerleşýän ýerinde gözlener we synp başaryp bilmese ýüklen, gözegçilik belli bolan çeşmelerden ýüklemäge synanyşjak çaga ýükleýjisine gaýdyp geler. Aboveokarda belläp geçişimiz ýaly, esasy ýükleýji üçin synplaryň ýerleşýän ýeri rt.jar kitaphanasy, giňeldiji ýükleýji üçin - jre / lib / ext giňeltmeleri bolan katalog, bir ulgam üçin - CLASSPATH, ulanyjy üçin başga zat bolup biler. . Şeýlelik bilen, ýüklemek synplarynyň ösüşi ters tarapa - kök ýükleýjiden häzirki tarapa geçýär. Synpyň kod kody tapylanda, synp JVM-e ýüklenýär we görnüşiň mysaly alynýar Class. Ansatlyk bilen görşüňiz ýaly, beýan edilen ýükleme shemasy usulyň ýokardaky ýerine ýetirilişine meňzeýär loadClass(String name). Aşakda diagrammany görüp bilersiňiz.
JVM-de sapaklaryň nähili ýüklenýändigi - 2

Netije hökmünde

Dil öwrenmegiň ilkinji ädimlerinde sapaklaryň Java-da nädip ýüklenýändigine düşünmek zerurlygy ýok, ýöne bu esasy ýörelgeleri bilmek ClassNotFoundExceptionýa-da ýaly ýalňyşlyklar ýüze çykanda umytsyzlygyň öňüni almaga kömek eder NoClassDefFoundError. Bolýar, ýa-da iň bolmanda meseläniň köküniň nämedigine düşüniň. ClassNotFoundExceptionŞeýlelik bilen, programma ýerine ýetirilende synp dinamiki ýüklenende, ýükleýjiler keşde ýa-da synp ýolunda zerur synpy tapyp bilmeýänlerinde kadadan çykma ýüze çykýar. Theöne ýalňyşlyk NoClassDefFoundErrorhas möhümdir we düzüliş wagtynda zerur synp elýeterli bolanda ýüze çykýar, ýöne programma ýerine ýetirilende görünmeýärdi. Programma ulanýan kitaphanasyny goşmagy ýatdan çykaran halatynda bolup biler. Işiňizde ulanýan guralyň gurluşynyň ýörelgelerine düşünmek hakykaty (onuň çuňlugyna aýdyň we jikme-jik çümdürilmegi hökman däl) bu mehanizmiň içinde bolup geçýän proseslere düşünmek üçin belli bir aýdyňlyk goşýar. öwrüp, bu guralyň ynamly ulanylmagyna getirýär.

Çeşmeler

“ClassLoader” -iň Java-da nähili işleýändigi Umuman maglumatyň elýeterli bolmagy bilen örän peýdaly çeşme. Classesüklemek sapaklary, “ClassLoader” gaty uzyn makala, ýöne şol ýükleýjiler bilen öz ýükleýjiňizi durmuşa geçirmegiň usullaryna ünsi çekýär. “ClassLoader”: synplaryň dinamiki ýüklenmegi Gynansagam, bu çeşme häzir elýeterli däl, ýöne şol ýerde synp ýükleme shemasy bilen iň düşnükli diagramma tapdym, şonuň üçin goşup bilemok. Java SE spesifikasiýasy: 5-nji bap. Adingüklemek, baglanyşdyrmak we başlamak
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION