JVM intervju pitanja, 54 pitanja o Java virtuelnoj mašini (23.000 reči, 115 ručno crtanih crteža), obavezno čitanje za preokret intjuvijanja 👍

Uvod
23.000 reči 115 ručno crtanih crteža, detaljno objašnjeno 54 čestih pitanja za intjuviju o Java virtuelnoj mašini (da nema teških znanja za pamćenje), intjuvijanti koji nauče ova JVM znanja, ovaj put će pretući ispitanika, mislim da je sigurno (ručni pas). Organizovao: Chenmo Wang Er, klikni na link preuzimanja, autor: Sanfen, klikni na link originala.
Svetla verzija je pogodnija za štampanje, što je i način koji mnogi studenti vole, stampa za učenje je efikasnija.

- decembra 2024. počeo sam raditi na drugoj verziji.
Za česta pitanja, obeležiću poziciju na kojoj se pojavljuju u "Vodič za Java intjuviju (plaćeno)", koja kompanija, koji je originalni zadatak, i dodaću zvezdicu 🌟, sadržaj je jasan; ako želiš da uštediš vreme, možeš prvo učiti ova pitanja, što pre saznajš protivnika, bez poraza u sto bitaka.
Razlikujemo sažetu verziju odgovora na znanja i objašnjenje principa i donjih slojeva, da biste znali zašto je tako i zašto tako, a tokom intjuvijanja mogli da dajete efikasne odgovore.
Kombinujemo sa projektima (Tehnički stil, pmhub) da organizujemo jezik, da ispitanik može maksimalno da oseti tvoje iskrenost, a ne mehaničko učenje napamet.
Popravljao sam probleme koji su se pojavili u prvoj verziji, uključujući povratne informacije prijatelja iz privatnih poruka, komentare u sekciji za komentare na sajtu, kao i issue iz GitHub repozitorijuma, da bi ovaj vodič za intjuviju bio potpunij.
Dodao sam ponude nekih prijatelja iz Erge programerske planete koji su dobili neke ponude, zahvalnost na preokretu intjuvijanja, i priznanje za izmenu biografija, da bih motivisao sve i dao više samopouzdanja.
Unapredio sam formatiranje, dodao ručno crtane crteže, reorganizovao odgovore, da bi bili više konverzalni, time bliži očekivanjima ispitanika.

Uključio sam Ergeov put naprednog Java, put naprednog JVM, put naprednog konkurentnog programiranja, kao i sve verzije preokreta intjuvijanja, pokriva 16 velikih tema uključujući Java osnove, Java kolekcije, Java konkurentnost, JVM, Spring, MyBatis, računarske mreže, operativne sisteme, MySQL, Redis, RocketMQ, distribuisane sisteme, mikroservise, dizajn pattern, Linux itd., ukupno više od 400.000 reči, više od 2000+ ručno crtanih crteža, može se reći da je iskrenost puna.
Prikažimo tamnu PDF verziju, formatiranje je jasno, fontovi su elegantni, pogodnije za noćno čitanje, noću čitanje je ugodnije.

I. Uvod
1.Šta je JVM?
JVM, tj. Java virtuelna mašina, temelj je Java cross-platform implementacije.
Pre pokretanja programa, prvo je potrebno kompajlerom da kompajliramo Java izvorni kod fajlove u Java bajtkod fajlove;
Tokom izvršavanja programa, JVM će vrsta po vrsta interpretirati bajtkod fajlove, prevoditi ih u mašinski kod i predati odgovarajućem operativnom sistemu za izvršenje.

Na ovaj način je ostvarena Java osobina jednokompajliraj, svuda izvrši.
Ako hoćemo da izvršimo hello world, šta je virtuelna mašina radila? Ko prevodi bajtkod u mašinski kod, kad je trenutak izvršavanja? Da li je Java virtuelna mašina izvršna jedinica?
Kada napišemo HelloWorld program, kompajliramo ga u .class fajl, nakon izvršenja java HelloWorld ove komande, operativni sistem će kreirati JVM proces, JVM proces će se pokrenuti, prvo inicijalizovati izvršno okruženje, uključujući kreiranje klasa učitavača, inicijalizaciju memorijskog prostora, pokretanje niti za sakupljanje smeća itd.
Zatim, JVM klasa učitavač će potražiti HelloWorld.class fajl, pročitati njegov bajtkod sadržaj.
JVM izvršni motor će prevesti ovaj bajtkod u mašinski kod na dva načina:
- Prvi je interpretativno izvršenje. JVM interpreter će vrsta po vrsta čitati bajtkod instrukcije, zatim ih prevoditi u mašinski kod za izvršenje. Ovaj proces je dinamičan, svaki put se mora ponovo prevoditi. Zato je interpretativno izvršenje relativno sporije.
- Drugi je JIT kompajliranje. U JVM postoji JIT kompajler, on otkrije da je određeni deo koda često izvršavan (npr. kod u petlji ili vruće metode), JIT kompajler će taj deo bajtkoda direktno kompajlirati u lokalni mašinski kod i keširati u codeCache, sledeće izvršenje ne mora vrsta po vrsta interpretirati, već direktno izvršava keširani mašinski kod, efikasnost izvršavanja se značajno povećava.
Š se tiče trenutka izvršavanja, interpreterovo izvršenje je trenutno, kada se JVM pokrene, počinje sa interpretivnim izvršenjem bajtkoda. JIT kompajlersko izvršenje je odloženo, prvo mora da nadgleda koji kod je vrući kod (obično treba da se izvrši hiljadama ili desetinama hiljada puta), zatim će pokrenuti kompajliranje.
Na nivou operativnog sistema, JVM proces je izvršna jedinica, koju operativni sistem raspoređuje za izvršenje.
Pričaj o drugim karakteristikama JVM-a?
①, JVM može automatski upravljati memorijom, sakupljačem smeća prikuplja objekte koji se više ne koriste i oslobađa memorijski prostor.
②, JVM sadrži JIT kompajler, može u toku rada keširati vrući kod u codeCache, sledeće izvršenje ne mora vrsta po vrsta interpretirati, već direktno izvršava keširani mašinski kod, efikasnost izvršavanja se značajno povećava.

③, Svaki jezik koji se može kompajlirati u Java, na primer Groovy, Kotlin, Scala itd., može da radi na JVM.

Zašto učiti JVM?
Učenje JVM-a može pomoći programerima da bolje optimišu performanse programa i izbegnu memorijske probleme.
Na primer, poznavanje JVM memorijskog modela i mehanizma sakupljanja smeća može pomoći da se razumno konfiguriše memorija, smanji GC pauze.
Na primer, masteriranje JVM mehanizma učitavanja klasa može pomoći u rešavanju konflikata učitavanja klasa ili izuzetaka.
Još jedan primer, JVM pruža mnoge alatke za otklanjanje grešaka i monitoring, mogu pomoći u analizi korišćenja memorije i niti, čime rešavamo probleme poput prekoračenja memorije, curenja memorije itd.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 10 back-end intjuvijanjem prva runda: da li ste upoznali sa JVM
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje ByteDance kolege 20 intjuvijanjem za testiranje softvera prva runda: da li ste upoznali sa JVM? Pričaj o karakteristikama JVM
memo: 6. novembra 2025. izmenjeno do ovde, danas prijatelj iz planete postavlja pitanje kaže da je dobio ponudu za testiranje softvera JD, 600 hiljada totalno; još jednu ponudu 14a od Huawei, zaista čestitam ga, predobro je.

2.Pričaj o organizacionoj arhitekturi JVM (dopuna)
Dodato 8. marta 2024.
Preporučeno čitanje: Jednostavnim jezikom upoznaj JVM
JVM se približno može podeliti u tri dela: učitavač klasa, područje podataka tokom izvršavanja i izvršni motor.

① Učitavač klasa, zadužen za učitavanje Class fajlova iz fajl sistema, mreže ili drugih izvora, čitanje binarnih podataka iz Class fajlova u memoriju.
② Područje podataka tokom izvršavanja, JVM prilikom izvršavanja Java programa mora dodeliti prostor u memoriji za različite podatke, ove memorijske oblasti se prema specifikaciji Java virtuelne mašine mogu podeliti na metodski region, heap, virtuelni stek, brojač programa i lokalni metodski stek.
③ Izvršni motor, takođe srce JVM, zaduženo za izvršavanje bajtkoda. Uključuje virtuelni procesor, JIT kompajler i sakupljač smeća.
Šta je JVM uopšte?
JVM suštinski jeste proces. Kada izvršimo komandu java -jar application.jar, operativni sistem će kreirati proces pod imenom JVM. Ovaj proces u memoriji pokreće virtuelnu mašinu, ova virtuelna mašina ima sopstveni set instrukcija, memorijski model, izvršni motor itd.
Koji je odnos između Java virtuelne mašine i operativnog sistema, ako sam potpuno neuki tehnologiji, daj mi primer da razumem
Zamisli operativni sistem kao veliko pozorište. Ovo pozorište ima binu, svetla, zvuk, sedišta za gledaoce i razne resurse. Administrator pozorišta je zadužen za dodeljivanje ovih resursa, odlučuje ko u kom vremenu koristi koju binu.
Sada, dramska grupa želi da odigra predstavu u ovom pozorištu. Dramska grupa će reći administratoru pozorišta: "Treba mi da iznajmim tvoju binu, svetla, zvuk, od 14 do 17 časova." Administrator pozorišta će im dodeliti binu i odgovarajuće resurse.

Operativni sistem je donji sloj, direktno kontroliše hardverske resurse, kao što su CPU, memorija, disk, mreža itd. Posao operativnog sistema je dodeljivati ove hardverske resurse različitim aplikacijama.
JVM je aplikacija koja radi na operativnom sistemu. JVM sam je proces, tj. sa perspektive operativnog sistema, JVM je obična aplikacija, ništa posebno. Operativni sistem ne zna niti brige šta se izvršava unutar JVM, samo upravlja JVM procesom prema pravilima upravljanja procesima.
Ako jedan operativni sistem ima dva Java programa, koliko virtuelnih mašina ima? Da li postoji zaseban JVM proces? Pri pokretanju hello world kompajliranja, koliko procesa ima
1, Svaki Java program treba nezavisni JVM proces za rad, dva Java programa trebaju dva JVM. Ova dva JVM procesa su potpuno nezavisni, ne ometaju se.
2, JVM nema neki zajednički proces koji dele svi Java programi. Svaki Java program mora pokrenuti sopstveni JVM proces.
3, Ako se samo kompajlira, ne izvršava, najmanje dva procesa. Jedan je kompajlerski proces javac. Kada se izvrši javac HelloWorld.java, operativni sistem će kreirati javac proces, ovaj proces će čitati .java izvorne fajlove, generisati .class bajtkod fajlove. Nakon završetka javac proces izlazi. Drugi je trenutni shell proces, terminal koji pokreće javac proces, uvek postoji.
Kada se JVM pokreće, npr. pri izvršenju Java komande odgovara jedan proces, da li je ova JVM virtuelna mašina zaista unutar ovog procesa, ili je prvo potrebno pokrenuti proces JVM virtuelne mašine
Kada se izvrši komanda java HelloWorld, operativni sistem će kreirati JVM proces. Nema operacije "prvo pokrenuti JVM" zatim "pokrenuti program". Već u jednom koraku: operativni sistem pokreće JVM proces, JVM proces istovremeno izvršava Java program.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent Java back-end intjuvijanjem prva runda: pričaj o organizacionoj arhitekturi JVM
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Dewu intjuvijanjem kolege 9 intjuvijanjem pitanje: arhitektura JVM, detaljno opiši funkcije svakog dela?
memo: 4. novembra 2025. izmenjeno do ovode, danas prijatelj iz planete privatno kaže da je Meituan objavio rezultate, 24k oko, ove godine Meituan uglavnom daje ovu cenu, 24k oko, prošle godine takođe oko ove cene, srećom Meituan posao je stabilan, ukupna atmosfera može.

II. Upravljanje memorijom
3.🌟Možeš li pričati o memorijskim regionima JVM?
Preporučeno čitanje: Duboko razumevanje područja podataka tokom izvršavanja JVM
Prema specifikaciji Java virtuelne mašine, memorijski regioni JVM se mogu detaljno podeliti na brojač programa, virtuelni stek, lokalni metodski stek, heap i metodski region.

Gde metodski region i heap su deljeni između niti, virtuelni stek, lokalni metodski stek i brojač programa su privatni za nit.
Predstavi brojač programa?
Brojač programa se takođe zove PC registar, mali memorijski prostor. Može se posmatrati kao indikator rednog broja bajtkoda koji trenutna nit izvršava.
Predstavi Java virtuelni stek?
Životni ciklus Java virtuelnog steka je isti kao životni ciklus niti.
Kada nit izvršava metod, kreira se odgovarajući okvir steka, za smeštaj tabele lokalnih promenljivih, steka operanada, dinamičkog povezivanja, izlaza iz metoda itd., zatim se okvir steka gura u virtuelni stek. Kada metod završi sa izvršavanjem, okvir steka se uklanja iz virtuelnog steka.

Ako metod potpuno prazan, nema parametre, da li u tabeli lokalnih promenljivih ima promenljivih?
Za statički metod, budući da ne treba pristupiti instanci objekta this, stoga u tabeli lokalnih promenljivih neće biti nijedne promenljive.
Za nestatički metod, čak i ako je metod potpuno prazan, u tabeli lokalnih promenljivih će biti jedna promenljiva za smeštaj this reference. Ova referenca pokazuje na trenutnu instancu objekta, pri pozivu metoda se implicitno prosleđuje.
Detaljno objašnjenje:
Na primer, ovaj kod:
public class VarDemo1 {
public void emptyMethod() {
// Ništa
}
public static void staticEmptyMethod() {
// Ništa
}
}Komandom javap -v VarDemo1 pogledajmo kompajlirani bajtkod, u emptyMethod možemo videti sledeći sadržaj:

Ovde locals=1 znači da tabela lokalnih promenljivih ima jednu promenljivu, tj. this, na poziciji Slot 0 smeštena je this referenca.
U statičkom metodu staticEmptyMethod, videćeš sledeći sadržaj:

Ovde locals=0 znači da je tabela lokalnih promenljivih prazna, jer statički metod pripada nivou klase, ne treba this referenca, stoga nema lokalnih promenljivih.
Predstavi lokalni metodski stek?
Lokalni metodski stek je sličan virtuelnom steku, razlika je u tome što je virtuelni stek za izvršavanje metoda napisanih u Java koje JVM izvršava, dok je lokalni metodski stek za Java poziv lokalnih nativnih metoda, obično napisanih u C/C++.
U lokalnom metodskom steku se uglavnom nalaze lokalne promenljive nativnih metoda, dinamičke veze i izlazi metoda itd. Kada Java program pozove nativni metod, JVM će preći na lokalni metodski stek da izvrši ovaj metod.
Predstavi scenario izvršavanja lokalnog metodskog steka?
Kada Java aplikacija treba da komunicira sa donjim slojevima operativnog sistema ili hardverom, obično koristi lokalni metodski stek.
Na primer, poziv specifičnih funkcija operativnog sistema, kao što su upravljanje memorijom, operacije fajlova, sistemsko vreme, sistemski pozivi itd.
Detaljno objašnjenje:
Na primer, metod System.currentTimeMillis() za dobijanje sistemskog vrema poziva nativni metod da bi dobio trenutno vreme operativnog sistema.

Još jedan primer, neki donji slojevi funkcionalnosti samog JVM-a trebaju da se realizuju kroz nativne metode. Kao što su hashCode() metod, clone() metod itd. u Object klasi.

Objasni nativni metod?
Preporučeno čitanje: Korak po korak uči te kako da realizuješ Java nativne lokalne metode u C jeziku
Nativni metod je u Java deklarisan natvnom ključnom rečju, za poziv koda napisanog u ne-Java jezicima, kao što je C/C++. Java može kroz JNI, tj. Java Native Interface da komunicira sa donjim slojevima sistema, hardverskim uređajima ili lokalnim bibliotekama.
Predstavi Java heap?
Heap je najveći memorijski region u JVM, deljen između svih niti, kreira se pri pokretanju JVM, uglavnom koristi za smeštaj new napravljenih objekata.

U Java "gotovo" svi objekti će biti dodeljeni na heap-u, heap je takođe ciljni region sakupljača smeća.
Sa perspektive sakupljanja memorije, budući da je većina sakupljača smeća dizajnirana na osnovu teorije generacijskog sakupljanja, heap je dalje podeljen na novu generaciju, staru generaciju, Eden prostor, From Survivor prostor, To Survivor prostor itd.

Sa razvojem JIT kompajlera i postepenim sazrevanjem tehnologije analize beka, "svi objekti se dodeljuju na heap" više nije tako apsolutno.
Od JDK 7, JVM podrazumevano uključuje analizu beka, što znači da ako referenca na objekat u određenom metodu nije vraćena ili se ne koristi izvan metoda, tj. nije pobegla, tada objekat može direktno biti dodeljen na steku.
Koja je razlika između heap-a i steka?
Heap pripada memorijskom regionu deljenom između niti, gotovo svi new napravljeni objekti se dodeljuju na heap, životni ciklus ne zavisi od pojedinačnog poziva metoda, može nastaviti da postoji nakon završetka poziva metoda, dok se kreira ne bude više referencirano od bilo koje promenljive, konačno će ga sakupiti sakupljač smeća.
Stek pripada memorijskom regionu privatnom za nit, uglavnom smešta lokalne promenljive, parametre metoda, reference na objekte itd., obično se automatski oslobađa sa završetkom poziva metoda, ne zahteva održavanje sakupljača smeća.
Predstavi metodski region?
Metodski region realno ne postoji, pripada logičkom konceptu u specifikaciji Java virtuelne mašine, za smeštaj informacija o klasama koje su JVM učitao, konstanti, statičkih promenljivih, keša kompajliranog koda JIT kompajlera itd.
U HotSpot virtuelnoj mašini, implementacija metodskog regiona se zove Permenent Generacija PermGen, ali u verziji Java 8 i kasnijim, zamenjena je Metaspace-om.
Gde se nalaze promenljive na heap steku?
Za lokalne promenljive, smeštene su u tabeli lokalnih promenljivih u okviru steka trenutnog metoda. Kada metod završi sa izvršavanjem, okvir steka se sakuplja, lokalne promenljive se takođe oslobađaju.
public void method() {
int localVar = 100; // Lokalna promenljiva, smeštena u tabeli lokalnih promenljivih okvira steka
}Za statičke promenljive, smeštene su u metodskom regionu specifikacije Java virtuelne mašine, u Java 7 je to Permenent Generacija, u Java8 i kasnijim je Metaspace.
public class StaticVarDemo {
public static int staticVar = 100; // Statička promenljiva, smeštena u metodskom regionu
}
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 10 back-end intjuvijanjem prva runda: koja je razlika između heap-a i steka
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje BYD intjuvijanjem kolege 3 Java tehnološka prva runda intjuvijanjem: predstavi JVM podatkovni region tokom izvršavanja
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje ByteDance intjuvijanjem kolege 1 Java back-end tehnološka prva runda intjuvijanjem: pričaj o JVM memorijskoj strukturi?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 1 Java tehnološka prva runda intjuvijanjem: pričaj o podatkovnom regionu tokom izvršavanja JVM
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 2 Java back-end tehnološka prva runda intjuvijanjem: da li ste upoznali sa JVM memorijskom strukturom?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou intjuvijanjem kolege 1 odeljenje glavne stanice tehnološkog odseka intjuvijanjem: molim te pričaj o memorijskom regionu Java, brojač programa itd.?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje ByteDance intjuvijanjem kolege 8 Java back-end intjuvijanjem prva runda: jvm memorijska distribucija, gde ima sakupljanje smeća
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Dewu intjuvijanjem kolege 8 prva runda intjuvijanjem: pričaj o jvm memorijskom regionu
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 3 Java back-end tehnološka prva runda intjuvijanjem: jmm memorijski model stek metodski region šta se smešta
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Shouqianba intjuvijanjem kolege 1 Java back-end prva runda intjuvijanjem: pominjao si okvir steka, pored okvira steka šta ima još u tabeli lokalnih promenljivih? Ako metod potpuno prazan, bez parametara, da li u tabeli lokalnih promenljivih ima promenljivih?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Zhaoyin Network Technology intjuvijanjem kolege 9 Java back-end tehnološka prva runda intjuvijanjem: razlika između Java heap memorije i stek memorije
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje OPPO intjuvijanjem kolege 1 intjuvijanjem: pričaj o JVM memorijskom modelu
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Sangxinserver intjuvijanjem kolege 3 Java back-end intervju uživo prva runda intjuvijanjem: JVM promenljive postoje na kojem poziciji heap steka?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje TP-Lianzhou kolege 5 Java back-end prva runda intjuvijanjem: JVM memorijski region, scenario izvršavanja lokalnog metodskog steka, objasni nativni metod
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje ByteDance kolege 17 back-end tehnološko intjuvijanje: jvm struktura područje podataka tokom izvršavanja koja struktura šta heap smešta
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 29 Java back-end prva runda intjuvijanjem: gde se smešta new objekat? (područje podataka tokom izvršavanja), gde postoje lokalne promenljive u JVM
4.Pričaj o promenama memorijskog regiona u JDK 1.6, 1.7, 1.8?
JDK 1.6 koristi Permenent Generaciju za realizaciju metodskog regiona:

U JDK 1.7 i dalje Permenent Generacija, ali desile su se neke sitne promene, na potez je premeštenje konstantnog string pool-a, statičkih promenljivih na heap.

U JDK 1.8, direktno je u memoriji odvojeno jedan region, nazvan Metaspace, da zameni Permenent Generaciju koja se ranije nalazila u JVM memoriji, i pomerio je runtime konstantni pool, konstantni pool klasa u Metaspace.

5.Zašto koristiti Metaspace umesto Permenent Generacije?
Objektivno, Permenent Generacija može lako dovesti do prekoračenja memorije Java aplikacija, jer podvrgava ograničenju veličine JVM memorije.
Veličinu Permenent Generacije HotSpot virtuelne mašine može se podesiti parametrom -XX:MaxPermSize, podrazumevana veličina na 32-bitnim mašinama je 64M, na 64-bitnim mašinama 85M.
Dok J9 i JRockit virtuelne mašine nemaju ovo ograničenje, sve dok ne dodirnu gornju granicu dostupne memorije procesa, npr. 4GB ograničenje u 32-bitnom sistemu, neće biti problema.
Subjektivno, kada je Oracle preuzeo BEA i dobio vlasništvo nad JRockit, pripremao se da prenese odlične funkcionalnosti JRockit u HotSpot.
Kao što je Java Mission Control alatka za upravljanje.
Ali zbog razlika u implementaciji metodskog regiona između dve virtuelne mašine, ovaj rad je naišao na mnogo otpora.
Razmatrajući budućnost HotSpot virtuelne mašine, u JDK 6, razvojni tim je planirao da napusti Permenent Generaciju.
U JDK 7, napravio je mali korak napred, pomerio string konstantni pool, statičke promenljive itd. koji su ranije bili u Permenent Generaciji na heap.
U JDK 8 konačno je završio ovaj posao premštanja, korist je što veličina Metaspace-a više nije ograničena JVM memorijom, već može kao J9 i JRockit, sve dok ima sistemske memorije, može se neprestano koristiti.
6.🌟Da li ste upoznali sa procesom kreiranja objekta?
Kada koristimo new ključnu reč za kreiranje objekta, JVM će prvo proveriti da li parametar new instrukcije može da locira simboličku referencu klase u konstantnom pool-u, zatim proveriti da li je klasa koju predstavlja ova simbolička referenca već učitana, rešena i inicijalizovana. Ako nije, prvo izvrši učitavanje klase.

Ako je već učitana, JVM će dodeliti memoriju objektu i završiti inicijalizaciju, npr. početne vrednosti članova numeričkog tipa su 0, boolean tipa false, tipa objekta null.
Zatim će postaviti zaglavlje objekta, koje uključuje informacije o kojoj klasi je instanca objekta, haš kod objekta, GC generacijsku starost objekta itd.
Konačno, JVM će izvršiti konstruktor <init> da završi operaciju dodele vrednosti, dodeli članovima očekivane vrednosti, npr. int age = 18, tako je jedan objekat i kreiran.
Da li ste upoznali sa procesom uništavanja objekta?
Kada objekat više nije referenciran od bilo koje reference, postaje smeće. Sakupljač smeća će kroz algoritam analize dostupnosti proceniti da li je objekat živ, ako je objekat nedostupan, biće sakupljen.
Sakupljač smeća sakuplja memoriju kroz algoritme obeležavanja i čišćenja, obeležavanja i kopiranja, obeležavanja i sređivanja itd., oslobađa memorijski prostor koji objekat zauzima.
Može se kroz java -XX:+PrintCommandLineFlags -version i java -XX:+PrintGCDetails -version komande videti koji sakupljač smeća JVM koristi.

Može se videti, na mojoj mašini instaliran JDK 8 podrazumevano koristi Parallel Scavenge + Parallel Old.
Različiti parametri predstavljaju odgovarajuću tabelu sakupljača smeća:
| Nova generacija | Stara generacija | JVM parametri |
|---|---|---|
| Serial | Serial | -XX:+UseSerialGC |
| Parallel Scavenge | Serial | -XX:+UseParallelGC -XX:-UseParallelOldGC |
| Parallel Scavenge | Parallel Old | -XX:+UseParallelGC -XX:+UseParallelOldGC |
| Parallel New | CMS | -XX:+UseParNewGC -XX:+UseConcMarkSweepGC |
| G1 | -XX:+UseG1GC |
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje BYD intjuvijanjem kolege 3 Java tehnološka prva runda intjuvijanjem: proces kreiranja do uništavanja objekta
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 2 Java back-end tehnološka prva runda intjuvijanjem: pričaj o procesu kreiranja objekta?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Ctrip intjuvijanjem kolege 1 Java back-end tehnološka prva runda intjuvijanjem: kreiranje do uništavanje objekta, kako se dodeljuje memorija, (proces učitavanja klase i kreiranja objekta, CMS, G1 čišćenje i dodela memorije)
memo: 13. avgusta 2025. izmenjeno do ovode, kao što je prijatelj rekao, pomažu svima da dobiju letnju praksu, takođe će pomoći svima da dobiju jesenji regrut.

7.Kako se dodeljuje heap memorija?
Prilikom dodele memorije objektu na heap-u, uglavnom se koriste dve strategije: sudaranje pokazivača i lista slobodnih.

Sudaranje pokazivača je pogodno za upravljanje jednostavnim, manje fragmentiranim memorijskim regionima, kao što je mlada generacija; dok je lista slobodnih pogodna za scenarije gde je fragmentacija memorije ozbiljnija ili je razlika u veličini objekata veća, kao stara generacija.
Šta je sudaranje pokazivača?
Pretpostavimo da je heap memorija kontinualni prostor, podeljen na dva dela, jedan deo je već iskorišćen, drugi deo je neiskorišćen.
Prilikom dodele memorije, Java virtuelna mašina održava pokazivač, pokazuje na sledeću dostupnu memorijsku adresu, svaki put pri dodeli memorije samo treba pomeriti pokazivač unazad za određenu udaljenost, ako nije došlo do sudara, dodeli ovaj memorijski prostor instanci objekta.
Šta je lista slobodnih?
JVM održava listu, beleži sve zauzete memorijske blokove na heap-u, svaki memorijski blok beleži veličinu i adresu.
Kada novi objekat zatraži memoriju, JVM će proći kroz listu slobodnih, tražiti dovoljno veliki prostor za smeštaj novog objekta.
Nakon dodele, ako izabrani memorijski blok nije potpuno iskorišćen, preostali deo će se dodati u listu slobodnih kao novi memorijski blok.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Ctrip intjuvijanjem kolege 1 Java back-end tehnološka prva runda intjuvijanjem: kreiranje do uništavanja objekta, kako se dodeljuje memorija, (proces učitavanja klase i kreiranja objekta, CMS, G1 čišćenje i dodela memorije)
memo: 10. januara 2025. izmenjeno do ovode
8.Da li dolazi do preuzimanja heap-a pri new objektu?
Da.

Prilikom new objekta, pokazivač će se pomeriti udesno za udaljenost veličine objekta, ako nit A trenutno dodeljuje memoriju string objektu s, druga nit B istovremeno dodeljuje memoriju ArrayList objektu l, dve niti su došlo do preuzimanja.
Kako JVM rešava problem konkurencije dodele heap memorije?
Da bi rešio problem konkurencije dodele heap memorije, JVM za svaku nit rezerviše mali memorijski prostor, nazvan TLAB, tj. lokalni bafer za dodelu memorije niti, za smeštaj objekata koje ova nit dodeljuje.

Kada nit treba da dodeli objekat, direktno dodeljuje iz TLAB-a. Samo kada se TLAB iskoristi ili je objekat prevelik i treba direktno dodeliti na heap-u,će koristiti globalni pokazivač dodele.
Ovde jednostavno testiramo TLAB.
Može se kroz java -XX:+PrintFlagsFinal -version | grep TLAB komandu videti da li je JVM uključio TLAB.

Ako je TLAB uključen, videće se sličan izlaz, gde je vrednost bool UseTLAB true.
Napišimo jednostavnu test klasu, kreiramo veliki broj objekata i prisilno pokrenemo sakupljanje smeća, pogledamo korišćenje TLAB-a.
class TLABDemo {
public static void main(String[] args) {
for (int i = 0; i < 10_000_000; i++) {
allocate(); // Kreiranje velikog broja objekata
}
System.gc(); // Prisilno pokretanje sakupljanja smeća
}
private static void allocate() {
// Dodela malog objekta, obično će koristiti TLAB
byte[] bytes = new byte[64];
}
}U VM parametre dodajemo -XX:+UseTLAB -XX:+PrintTLAB -XX:+PrintGCDetails -XX:+PrintGCDateStamps, nakon izvršavanja možemo videti sledeći sadržaj:

- waste: nekorišćeni TLAB prostor.
- alloc: prostor dodeljen u TLAB.
- refills: koliko puta TLAB je ponovo popunjen.
Može se videti, ciljana veličina TLAB-a trenutne niti je 10.496 KB (desired_size: 10496KB); nije došlo do spore dodele (slow allocs: 0); efikasnost dodele je puna (alloc: 1.00000 52494KB).
Kada se koristi -XX:-UseTLAB -XX:+PrintGCDetails za isključivanje TLAB-a, videće se sličan izlaz:

Direktno su se desila dva GC, bez TLAB-a, Eden region se brže popuni, dovodeći do GC mlade generacije. GC mlade generacije se često pokreće, deo objekata dugog životnog veka se unapređuje u staru generaciju, indirektno dovodi do pokretanja GC stare generacije.
9.🌟Možeš li pričati o memorijskom rasporedu objekata?
Može.
Memorijski raspored objekata definiše specifikacija Java virtuelne mašine, ali detalji implementacije su različiti, npr. HotSpot i OpenJ9 nisu isti.
Uzimajući HotSpot koji najčešće koristimo. Objekti u memoriji uključuju tri dela: zaglavlje objekta, instancni podaci i popuna poravnanja.

Pričaj o ulozi zaglavlja objekta?
Zaglavlje objekta su metapodaci o smeštaju objekta u memoriji, uključujući Mark Word, tip pokazivač itd.
Mark Word čuva podatke o statusu objekta tokom izvršavanja, uključuje zaključavanje, haš vrednost, GC oznake itd. Na 64-bitnom operativnom sistemu zauzima 8 bajtova, na 32-bitnom operativnom sistemu zauzima 4 bajta.
Tip pokazivač pokazuje na metapodatke klase kojoj objekat pripada, tj. Class objekat, koristi se za podršku polimorfizmu, poziva metoda itd.
Pored toga, ako je objekat niz tipa, postoji dodatno polje dužine niza. Zauzima 4 bajta.
Da li se tip pokazivač kompresuje?
Tip pokazivač može biti kompresovan da bi se uštedeo memorijski prostor. Na primer, ako je uključena kompresija pokazivača zauzima 4 bajta, inače 8 bajtova. U JDK 8, kompresija pokazivača je podrazumevano uključena.
Može se kroz java -XX:+PrintFlagsFinal -version | grep UseCompressedOops komandu videti da li je JVM uključio kompresiju pokazivača.

Ako je kompresija pokazivača uključena, u rezultatima izlaza bool UseCompressedOops ima vrednost true.
Da li ste upoznali sa instancnim podacima?
Malim.
Instancni podaci su stvarne vrednosti polja objekta, tj. vrednosti članova, smeštene redosledom deklaracije polja u klasi.
class ObjectDemo {
int age;
String name;
}JVM će izvršiti poravnanje/preuređivanje ovih podataka da bi poboljšao brzinu pristupa memoriji.
Da li ste upoznali sa popunom poravnanja?
Budući da JVM memorijski model zahteva da početna adresa objekta bude poravnata na 8 bajtova (u 64-bitnom JVM), ukupna veličina objekta mora biti višekratnik od 8 bajtova.
Ako ukupna dužina zaglavlja objekta i instancnih podataka nije višekratnik od 8, JVM će dodati dodatne bajtove za poravnanje.
Na primer, ako je zaglavlje objekta + instancni podaci = 14 bajtova, treba dopuniti 2 bajta, da bi ukupna dužina postala 16 bajtova.
Zašto mora biti 8-bajtovo poravnanje?
Zato što CPU prilikom pristupa memoriji, veličina pokazivača jednom adresiranju je 8 bajtova, tačno veličina redu keša L1. Ako se ne izvrši poravnanje memorije, može doći do pristupa preko redova keša, što dovodi do dodatnog učitavanja reda keša, efikasnost pristupa CPU-a će se smanjiti.

Na primer, na gornjoj slici obj1 zauzima 6 bajtova, zbog nedostatka poravnanja, ovaj red keša ima dodatnih 2 bajta podataka obj2, kada CPU pristupa obj2, dolazi do osvežavanja reda keša.
To jest, 8-bajtovo poravnanje je za povećanje efikasnosti, rešenje koje menja prostor za vreme.

Kolika je memorijska veličina new Object() objekta?
Preporučeno čitanje: Obavezno za napredne intjuvije: koliko memorije zauzima jedan Java objekat
Uopšte, trenutni operativni sistemi su 64-bitni, i u JDK 8 kompresija pokazivača je podrazumevano uključena, stoga na 64-bitnom JVM, veličina new Object() je 16 bajtova (12 bajtova zaglavlja objekta + 4 bajta popune poravnanja).

Veličina zaglavlja objekta je fiksirana, na 32-bitnom JVM je 8 bajtova, na 64-bitnom JVM je 16 bajtova; ako je uključena kompresija pokazivača, onda je 12 bajtova.
Veličina instancnih podataka zavisi od članskih promenljivih objekta i njihovih tipova. Za new Object(), budući da podrazumevano nema članskih promenljivih, možemo smatrati da je u ovom trenutku veličina instancnih podataka 0.
Ako MyObject objekat ima tri članske promenljive, redom int, long i bajt tip, tada zauzimaju 4 bajta, 8 bajtova i 1 bajt.
class MyObject {
int a; // 4 bajta
long b; // 8 bajtova
byte c; // 1 bajt
}Uzimajući u obzir poravnanje, ukupna veličina MyObject objekta je 12 (zaglavlje) + 4 (a) + 8 (b) + 1 (c) + 7 (popuna) = 32 bajta.
Da li ste koristili JOL za pregled memorijskog rasporeda objekata?
Koristio.
JOL je alatka za analizu memorijskog rasporeda JVM objekata.
Prvi korak, uvedi JOL zavisnost u pom.xml:
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>Drugi korak, koristi JOL za pisanje primera koda:
public class JOLSample {
public static void main(String[] args) {
// Štampaj detaljne informacije o JVM (opciono)
System.out.println(VM.current().details());
// Kreiraj instancu Object
Object obj = new Object();
// Štampaj memorijski raspored instance Object
String layout = ClassLayout.parseInstance(obj).toPrintable();
System.out.println(layout);
}
}Treći korak, pokreni kod, pogledaj rezultate:

Može se videti OFFSET, SIZE, TYPE DESCRIPTION, VALUE ove informacije.
- OFFSET: adresa pomaka, jedinica bajt;
- SIZE: zauzeta veličina memorije, jedinica bajt;
- TYPE DESCRIPTION: opis tipa, gde je object header zaglavlje objekta;
- VALUE: odgovarajuća vrednost u memoriji, binarni 32 bita;
Iz gornjih rezultata može se videti, zaglavlje objekta je 12 bajtova, još 4 bajta popune, new Object() ukupno 16 bajtova.
Da li ste upoznali sa veličinom reference na objekat?
Preporučeno čitanje: Object o = new Object() koliko bajtova zauzima?
Na 64-bitnom JVM, ako kompresija pokazivača nije uključena, referenca na objekat zauzima 8 bajtova; ako je uključena kompresija pokazivača, referenca na objekat se kompresuje na 4 bajta. HotSpot virtuelna mašina podrazumevano uključuje kompresiju pokazivača.

Potvrdimo:
class ReferenceSizeExample {
private static class ReferenceHolder {
Object reference;
}
public static void main(String[] args) {
System.out.println(VM.current().details());
System.out.println(ClassLayout.parseClass(ReferenceHolder.class).toPrintable());
}
}Pokreni kod, pogledaj rezultate:

ReferenceHolder.reference je veličine 4 bajta.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje FanRuan kolege 3 Java back-end prva runda intjuvijanjem: kolika je veličina Object a = new object(), koliko veličina zauzima referenca na objekat?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Qunar intjuvijanjem kolege 1 tehnološka druga runda intjuvijanjem: donja struktura Object (zapao)
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 19 JDS prva runda intjuvijanjem: koja je struktura objekta, šta sadrži
memo: 14. avgusta 2025. izmenjeno do ovode. Danas prijatelj je vratio povratne informacije, letnju praksu je odbio Tencent klijent, letnju praksu je već dobio namjeru Meituan, čeka platu. 😄

10.Kako JVM pristupa objektima?
Glavni način su dva: ručka i direktni pokazivač.
Razlika između dva načina je u tome što ručka kroz tabelu ručke u sredini locira objekat, dok direktni pokazivač direktno kroz referencu pokazuje na memorijsku adresu objekta.
Prednost je u tome što se pri pomeranju objekta samo menja pokazivač u tabeli ručki, a ne potrebna menja sama referenca na objekat.

Kod pristupa direktnim pokazivačem, referenca direktno čuva memorijsku adresu objekta; instancni podaci objekta i informacije o tipu smešteni su u fiksnom memorijskom regionu heap-a.
Prednost je brža brzina pristupa, jer nema dodatnog traženja ručke. Mana je ako se objekat pomera u memoriji, potrebno ažurirati referencu na novu adresu.

HotSpot virtuelna mašina uglavnom koristi direktni pokazivač za pristup objektima.
11.Pričaj o vrstama referenci na objekte?
Četiri vrste, redom jaka referenca, meka referenca, slaba referenca i virtuelna referenca.

Jaka referenca je najčešći tip reference u Java. Referenca dodeljena kroz new ključnu reč je jaka referenca, dokle god jaka referenca povezuje objekat, sakupljač smeća neće sakupiti ovaj deo objekata, čak i ako nedostaje memorija.
// str je jaka referenca
String str = new String("Chenmo Wang Er");Meka referenca se koristi za opisivanje neobaveznih objekata, realizuje kroz klasu SoftReference. Meki referencirani objekti će biti sakupljeni kada nedostaje memorija.
// softRef je meka referenca
SoftReference<String> softRef = new SoftReference<>(new String("Chenmo Wang Er"));Slaba referenca se koristi za opisivanje neobaveznih objekata kratkog životnog veka, kao Entry u ThreadLocal, realizuje se kroz klasu WeakReference. Slabi referencirani objekti će biti sakupljeni pri sledećem sakupljanju smeća, bez obzira na to da li je memorija dovoljna.
static class Entry extends WeakReference<ThreadLocal<?>> {
/** Vrednost povezana sa ovim ThreadLocal. */
Object value;
//Klasa čvora
Entry(ThreadLocal<?> k, Object v) {
//dodela vrednosti ključu
super(k);
//dodela vrednosti
value = v;
}
}Virtuelna referenca se uglavnom koristi za praćenje procesa sakupljanja smeća objekta, realizuje se kroz klasu PhantomReference. Virtuelno referencirani objekti mogu biti sakupljeni u bilo kom trenutku.
// phantomRef je virtuelna referenca
PhantomReference<String> phantomRef = new PhantomReference<>(new String("Chenmo Wang Er"), new ReferenceQueue<>());
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 4 intjuvijanje oblaka prva runda intjuvijanjem: četiri reference (jaka meka slaba virtuelna)
12.Jeste li upoznati sa memorijskim podelom Java heap-a?
Upoznam. Java heap je podeljen na dva regiona: nova generacija i stara generacija.

Nova generacija je dalje podeljena na Eden prostor i dva Survivor prostora (From i To).
Novokreirani objekti se dodeljuju u Eden prostor. Kada se Eden prostor popuni, pokreće se Minor GC, čisti se više ne korišćeni objekti. Preživeli objekti se premestaju iz Eden u Survivor region.
Objekti koji prežive više GC u novoj generaciji, ako i dalje prežive, premestiće se u staru generaciju. Kada memorija stare generacije nedostaje, pokreće se Major GC, radi se sakupljanje smeća na celom heap-u.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Dewu intjuvijanjem kolege 8 prva runda intjuvijanjem: kako se organizuje heap memorija u Java
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 27 oblak back-end tehnološka prva runda intjuvijanjem: kako razlikovati kojoj generaciji objekat pripada?
13.Pričaj o podeli regiona nove generacije?
Sakupljanje smeća nove generacije uglavnom koristi algoritam obeležavanja-kopiranja, jer u novoj generaciji ima malo preživelih objekata, svaki put kopiranje malog broja preživelih objekata je efikasnije.
Na osnovu ovog algoritma, virtuelna mašina deli memoriju na jedan veći Eden prostor i dva manja Survivor prostora, svaki put pri dodeli memorije koristi samo Eden i jedan Survivor. Pri sakupljanju smeća, sve preživele objekte iz Eden i Survivor jednom kopira u drugi Survivor prostor, zatim direktno čisti Eden i iskorišćeni Survivor prostor. Podrazumevani odnos veličine Eden i Survivor je 8∶1.

14.🌟Kada objekti ulaze u staru generaciju?
Objekti se obično dodeljuju u mladoj generaciji, s vremenom i tokom sakupljanja smeća, određeni objekti koji zadovoljavaju uslove ulaze u staru generaciju, kao objekti dugog životnog veka.

Kako se procenjuju objekti dugog životnog veka?
JVM održava "brojač starosti" za objekat, beleži koliko puta je objekat preživeo Minor GC u novoj generaciji. Svaki put kada GC ne sakupi objekat, njegova starost se povećava za 1.
Kada premaši određeni prag, podrazumevana vrednost je 15, smatraće se starim objektom, treba mu posvetiti posebnu pažnju. Ovaj prag starosti može se podesiti JVM parametrom -XX:MaxTenuringThreshold.
Može se kroz jinfo -flag MaxTenuringThreshold $(jps | grep -i nacos | awk '{print $1}') videti prag starosti trenutnog JVM.

- Ako se objekti u aplikaciju kratko žive, može se odgovarajuće povećati ova vrednost, da objekti duže ostanu u novoj generaciji
- Ako se objekti dugo žive, može se odgovarajuće smanjiti ova vrednost, da se objekti brže prebace u staru generaciju, smanjuje se broj kopiranja u novoj generaciji
Kako se procenjuju veliki objekti?
Veliki objekti su objekti koji zauzimaju mnogo memorije, kao veliki nizovi, dugački stringovi itd.
int[] array = new int[1000000];
String str = new String(new char[1000000]);
``
Njihova veličina se kontroliše JVM parametrom `-XX:PretenureSizeThreshold`, ali u JDK 8, podrazumevana vrednost je 0, tj. podrazumevano se samo na osnovu broja GC preživljavanja procenjuje da li objekat ulazi u staru generaciju.

U G1 sakupljaču smeća, veliki objekti se direktno dodeljuju u HUMONGOUS region. Kada veličina objekta premašuje 50% kapaciteta Region, smatraće se velikim objektom.

Veličina Region se može podesiti JVM parametrom `-XX:G1HeapRegionSize`, podrazumevano se kreće od 1MB do 32MB, dinamiki se prilagođava prema veličini heap memorije.
Može se kroz `java -XX:+UseG1GC -XX:+PrintGCDetails -version` videti informacije o G1 sakupljaču smeća.

Iz rezultata se vidi, na mojoj mašini G1 heap veličina je 2GB, veličina Region je 4MB.
#### Da li ste upoznali sa dinamičkim procenjivanjem starosti?
Ako ukupna veličina svih objekata u Survivor regionu premaši određeni procenat, obično polovinu Survivor regiona, tada objekti manje starosti takođe mogu biti unapređeni u staru generaciju.
To je zato što ako objekti manje starosti zauzimaju veći prostor u Survivor regionu, dovodi do povećanja broja kopiranja objekata u Survivor regionu, utiče na efikasnost sakupljanja smeća.
> 1. Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Alibaba intjuvijanjem kolege 5 Alibaba mama Java back-end tehnološka prva runda intjuvijanjem: u kojim slučajevima objekti ulaze u staru generaciju?
> 2. Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 7 Java back-end tehnološka prva runda intjuvijanjem: uslovi prebacivanja objekata iz mlade generacije u staru
> 3. Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Pinduoduo intjuvijanjem kolege 4 tehnološka prva runda intjuvijanjem: kada objekti ulaze u staru generaciju
memo: 13. januara 2025. izmenjeno do ovode
### 15.Jeste li upoznali sa STW?
Upoznam.
U procesu sakupljanja smeća JVM, uključuje se pomeranje objekata, da bi se osiguralo da se reference na objekte ne modifikuju tokom pomeranja, potrebno je pauzirati sve korisničke niti, takve pauze nazivamo `Stop The World`. Skraćeno STW.
#### Kako se pauziraju niti?
JVM će koristiti mehanizam po imenu "Sigurna tačka" (Safe Point) da bi osigurao da niti mogu biti bezbedno pauzirane, proces uključuje četiri koraka:
- JVM šalje signal pauze;
- Nit se izvršava do sigurne tačke, obustavlja se i čeka da se sakupljanje smeća završi;
- Sakupljač smeća završava GC operaciju;
- Nit nastavlja sa izvršavanjem.
#### Šta je sigurna tačka?
Sigurna tačka je mehanizam JVM, često se koristi za STW operacije pri sakupljanju smeća, omogućava niti da se bezbedno pauzira kada se izvršava na određenim pozicijama.
Obično se nalazi na pozivu metoda, skokove petlji, rukovanje izuzecima itd., kako bi se osigurala konzistentnost podataka prilikom pauze niti.
Upotrebimo jednostavnu poređenju, starac Wang vuze kola, stvari na kolima su vrlo teške, starac se znoji kišom, ali starac ne može da se odmara na usponu ili silasku, može samo da se zaustavi na ravnom da obriše znoj, popije vode.

Preporučujem svima da pogledaju [HotSpot JVM Deep Dive - Safepoint](https://www.youtube.com/watch?v=JkbWPPNc4SI), postoji dublje objašnjenje sigurne tačke.

### 16.Da li se objekti nužno dodeljuju na heap?
Nužno ne.
Podrazumevano, Java objekti se dodeljuju na heap, ali JVM će izvršiti analizu beka, da proceni da li je životni vek objekta samo unutar metoda, ako jeste, ovaj objekat može biti dodeljen na stek.
Na primer, u sledećem kodu, životni vek objekta `new Person()` je samo unutar metoda `testStackAllocation`, stoga će JVM ovaj objekat dodeliti na stek.
```java
public void testStackAllocation() {
Person p = new Person(); // Objekat može biti dodeljen na stek
p.name = "Chenmo Wang Er je pas";
p.age = 18;
System.out.println(p.name);
}Šta je analiza beka?
Analiza beka je tehnika optimizacije JVM, koristi se za analizu opsega i životnog veka objekata, procenjuje da li se objekat bekne iz metoda ili niti.
Može se kroz analizu toka referenci na objekat proceniti da li se objekat vraća iz metoda, dodeljuje se globalnim promenljivim, prosleđuje drugim nitima itd., da se odredi da li se objekat bekao.
Ako objekat nije bekao, može se izvršiti dodela na stek, eliminacija sinhronizacije, zamena skalara itd. optimizacije, kako bi se poboljšale performanse programa.
Može se kroz java -XX:+PrintFlagsFinal -version | grep DoEscapeAnalysis potvrditi da li je JVM uključio analizu beka.

Šta tačno znači bek?
Prema opsegu bekanja objekta, može se podeliti na bek metoda i bek niti.
Kada objekat referencira kod izvan metoda, životni vek prelazi opseg metoda, tada objekat mora biti dodeljen na heap, upravlja sakupljač smeća.
public Person createPerson() {
return new Person(); // Objekat bekne iz metoda
}Na primer, ako se objekat new Person() kreira i vrati, tada je ovaj objekat bekao iz trenutnog metoda.

Još jedan primer, ako objekat referencira druga nit, životni vek prelazi trenutnu nit, tada objekat mora biti dodeljen na heap, i između niti je potrebna sinhronizacija.
public void threadEscapeExample() {
Person p = new Person(); // Objekat bekne u drugu nit
new Thread(() -> {
System.out.println(p);
}).start();
}Objekat new Person() referencirala je druga nit, došlo je do beka niti.
Kake benefite donosi analiza beka?
Glavno tri.
Prvi, ako se utvrdi da objekat neće bekati, može se razmatrati dodela na stek, memorija koju objekat zauzima se oslobađa sa izlaskom okvira steka, time se smanjuje pritisak sakupljanja smeća.
Drugi, sinhronizacija niti zahteva zaključavanje, zaključavanje zauzima resurse sistema, ako analiza beka može utvrditi da objekat neće bekni iz nit, tada ovaj objekat ne treba zaključavati, time se smanjuju troškovi sinhronizacije niti.
Treći, ako se polja objekta koriste nezavisno u metodu, JVM može razbiti objekat na skalarnne promenljive, izbeći dodelu objekta.
public void scalarReplacementExample() {
Point p = new Point(1, 2);
System.out.println(p.getX() + p.getY());
}Ako Point objekat nije bekao, JVM može optimizovati u:
int x = 1;
int y = 2;
System.out.println(x + y);
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Shouqianba intjuvijanjem kolege 1 Java back-end prva runda intjuvijanjem: da li su svi objekti na heap?
17.Jeste li upoznali sa prekoračenjem memorije i curenjem memorije?
Prekoračenje memorije, popularno OOM, odnosi se na situaciju kada program zatraži dodelu memorije, jer nema dovoljno memorijskog prostora, baca se OutOfMemoryError.
List<String> list = new ArrayList<>();
while (true) {
list.add("OutOfMemory".repeat(1000)); // Beskonačno povećavanje memorije
}Može biti uzrokovano nedostatkom heap, metaspace, steka ili direktne memorije. Može se rešiti optimizacijom memorijske konfiguracije, smanjenjem dodele objekata itd.
Curenje memorije znači da program nakon korišćenja memorije ne oslobađa na vreme, zauzeti memorijski prostor se više ne može koristiti. Vremenom, curenje memorije dovodi do smanjenja dostupne memorije, konačno do prekoračenja memorije.
Curenje memorije obično nastaje zato što dugoročno živeći objekti drže reference na kratkoživeće objekte, a ne oslobađaju se na vreme, time ometaju sakupljanje kratkoživećih objekata.
class MemoryLeakExample {
private static List<Object> staticList = new ArrayList<>();
public void addObject() {
staticList.add(new Object()); // Objekat neće biti sakupljen
}
}Upotrebimo jedno mirisuljeno poređenje, prekoračenje memorije je red za čekanje u toaletu, uvidimo da nema mesta; curenje memorije je neko zauzima toalet a ne koristi ga, dovodi do toga nema dovoljno mesta.

- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 1 Java tehnološka prva runda intjuvijanjem: pričaj o uzrocima OOM
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou intjuvijanjem kolege 1 odeljenje glavne stanice tehnološkog odseka intjuvijanjem: da li ste upoznali sa OOM?
18.Možeš li ručno napisati primer prekoračenja memorije?
Može.
Uzeću najčešći primer prekoračenja heap memorije, heap prekoračenje obično nastaje zato što se kreira veliki broj objekata, i dugo ne može biti sakupljen od strane sakupljača smeća.
class HeapSpaceErrorGenerator {
public static void main(String[] args) {
// Prvi korak, kreiraj veliki kontejner
List<byte[]> bigObjects = new ArrayList<>();
try {
// Drugi korak, petlja upisuje podatke
while (true) {
// Treći korak, kreiraj veliki objekat, niz od oko 10M
byte[] bigObject = new byte[10 * 1024 * 1024];
// Četvrti korak, dodaj veliki objekat u kontejner
bigObjects.add(bigObject);
}
} catch (OutOfMemoryError e) {
System.out.println("OutOfMemoryError se desila posle " + bigObjects.size() + " objekata");
throw e;
}
}
}Vrlo brzo će doći do prekoračenja memorije.
Ovo je kao u kući stalno gomilanje stvari koje se ne mogu sakupiti, kuća će brzo biti puna.
Takođe može se kroz VM parametar postaviti veličinu heap memorije na -Xmx128M, zatim pokrenuti program, prekoračenje memorije će se desiti brže.

Može se videti, heap prekoračenje se desilo posle 11 objekata.

- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 1 Java tehnološka prva runda intjuvijanjem: pričaj o uzrocima OOM
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou intjuvijanjem kolege 1 odeljenje glavne stanice tehnološkog odseka intjuvijanjem: koji memorijski regioni Java-a mogu imati OOM? Zašto?
memo: 14. januara 2025. izmenjeno do ovode
19.Šta može uzrokovati curenje memorije?
Na primer:
①, U statičkim kolekcijama se stalno dodaju objekti, ali se ne čiste na vreme; životni vek statičkih promenljivih je isti kao životni vek aplikacije, ako statičke promenljive drže reference na objekte, ovi objekti neće biti sakupljeni GC-om.
class OOM {
static List list = new ArrayList();
public void oomTests(){
Object obj = new Object();
list.add(obj);
}
}②, Reference na spoljašnje objekte koje drže objekti u singlton režimu se ne oslobađaju na vreme; singlton objekti žive kroz čitav životni vek aplikacije, ako singlton objekti drže reference na druge objekte, ovi objekti neće biti sakupljeni.
class Singleton {
private static final Singleton INSTANCE = new Singleton();
private List<Object> objects = new ArrayList<>();
public static Singleton getInstance() {
return INSTANCE;
}
}③, Resursi kao što su baza podataka, IO, Socket se ne zatvaraju na vreme;
try {
Connection conn = null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("url", "", "");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("....");
} catch (Exception e) {
}finally {
//Ne zatvara se konekcija
}④, Reference u ThreadLocal se ne čiste, nakon izlaska niti i dalje drže reference na objekte; nakon završetka izvršavanja niti, potrebno je pozvati remove metod ThreadLocal-a za čišćenje.
ThreadLocal<Object> threadLocal = new ThreadLocal<>();
threadLocal.set(new Object()); // Nije očišćeno20.Jeste li rešavali probleme curenja memorije?
Preporučeno čitanje:
- Jedna realna optimizacija prekoračenja memorije
- Vizuelne alatke za monitoring JVM performansi: deo komandne linije
- Vizuelne alatke za monitoring JVM performansi
Jeste.
U to vreme radeći na Tehnički stil projektu, zbog neprimiranja ThreadLocal na vreme došlo je do curenja memorije.
Koristio sam vizuelnu alatku za monitoring VisualVM, u kombinaciji sa ugrađenim alatkama JDK kao što je jstack za otklanjanje grešaka.
Približan proces sam se setio, uglavnom 7 koraka:
Prvi korak, koristi jps -l da vidiš ID pokrenutog Java procesa.

Drugi korak, koristi top -p [pid] da vidiš korišćenje CPU i memorije procesa.

Treći korak, koristi top -Hp [pid] da vidiš korišćenje CPU i memorije svih niti u procesu.

Četvrti korak, snimi stek niti: jstack -F 29452 > 29452.txt, možeš snimiti više puta za poređenje.
29452 je pid, ujedno kao naziv fajla.

Vidi da li ima mrtvih zaključavanja niti, beskonačnih petlji ili dugo čekanja itd. problema.

Peti korak, možeš koristiti jstat -gcutil [pid] 5000 10 svakih 5 sekundi ispisuje GC informacije, ispisuje 10 puta, gledaš broj YGC i Full GC.

Obično se dešava da YGC ne raste ili raste sporo, dok Full GC raste brzo.
Ili koristi jstat -gccause [pid] 5000 da ispišeš sažetak GC informacija.

Ili koristi jmap -heap [pid] da vidiš sažetak heap, obrati pažnju na to da li korišćenje memorije stare generacije doseže prag, ako doseže prag, izvršiće se Full GC.

Ako otkriješ da je broj Full GC prevelik, vrlo verovatno postoji curenje memorije.
Šesti korak, generiši dump fajl, zatim uz pomoć vizuelne alatke analiziraš koji objekat je previše, basic može locirati koren problema.
Izvršenje komande jmap -dump:format=b,file=heap.hprof 10025 će ispisati snimak heap memorije procesa 10025, sačuvati u fajl heap.hprof.

Sedmi korak, koristi vizuelne alatke za analizu, kao što je VisualVM ugrađen u JDK, iz menija > fajl > učitaj dump fajl.

Zatim u rezultatima posmatraj objekte koji najviše zauzimaju memoriju, pronađi izvor curenja memorije.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 10 back-end intjuvijanjem prva runda intjuvijanjem: šta je curenje memorije
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou intjuvijanjem kolege 1 odeljenje glavne stanice tehnološkog odseka intjuvijanjem: koji memorijski regioni Java-a mogu imati OOM? Zašto?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 4 prva runda intjuvijanjem: kako se otkriva curenje memorije
21.Jeste li rešavali probleme prekoračenja memorije?
Jeste.
U to vreme radeći na Tehnički stil projektu, zbog prevelikog otpremljenog fajla nije pravilno obrađen, odjednom je eksplodirala memorija, program se direktno srušio.
Setih se da sam to otkrio analizom izvoznog fajla heap snimka.
Prvi korak, koristi jmap komandu da ručno generišeš Heap Dump fajl:
jmap -dump:format=b,file=heap.hprof <pid>Zatim koristi MAT, JProfiler itd. alatke za analizu, pregledaj zauzeće objekata u memoriji.
Uopšte:
Ako u produkcionoj okolini ima mnogo slobodne memorije, može se odgovarajuće povećati heap memorija za rešavanje, npr. -Xmx4g parametar.
Ili proveri da li u kodu postoji curenje memorije, kao nezatvoreni resursi, objekti dugog životnog veka itd.
Nakon toga, lokalno vrši pritisak test, simulira performanse memorije pod visokim opterećenjem, osigurava da su izmene efikasne i da nisu uvedeni novi problemi.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Huawei intjuvijanjem kolege 9 Java opšte razvoj softvera prva runda intjuvijanjem: kako se otkriva OOM?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Honor intjuvijanjem kolege 4 intjuvijanjem: da li ste naišli na curenje memorije, prekoračenje, kako se dešavalo i rešavalo?
22.U kojim slučajevima dolazi do prekoračenja steka? (dopuna)
Dodato 16. oktobra 2024.
Prekoračenje steka se dešava kada dubina pozivnog steka programa premaši maksimalnu dubinu koju JVM dozvoli.
Suština prekoračenja steka je što niti nedostaje memorijski prostor steka, ne može dodeliti novi okvir steka.
Kada se metod poziva, JVM će dodeliti okvir steka na steku, za smeštaj informacija o izvršavanju metoda. Ako se poziv metoda previše ugnežđuje, okviri steka se stalno guraju na stek, konačno će iskoristiti memorijski prostor steka, baciti StackOverflowError.
Najčešći scenario prekoračenja steka je rekurzivni poziv, naročito bez ispravnog uslova zaustavljanja, dovodi do beskonačne rekurzije.
class StackOverflowExample {
public static void recursiveMethod() {
// Rekurzivni poziv bez uslova zaustavljanja
recursiveMethod();
}
public static void main(String[] args) {
recursiveMethod(); // Dovodi do prekoračenja steka
}
}Pored toga, ako se u metodu definišu posebno velike lokalne promenljive, okvir steka postaje veliki, memorijski prostor steka se brže iskoristi.
public class LargeLocalVariables {
public static void method() {
int[] largeArray = new int[1000000]; // Veliki broj lokalnih promenljivih
method(); // Rekurzivni poziv
}
public static void main(String[] args) {
method(); // Dovodi do prekoračenja steka
}
}
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje OPPO intjuvijanjem kolege 1 intjuvijanjem: u kojim slučajevima dolazi do prekoračenja steka?
III. Sakupljanje smeća
23.🌟Pričaj o mehanizmu sakupljanja smeća JVM (dopuna)
Ovo pitanje je dodatak, do 9. marta 2024.; referenca: Duboko razumevanje mehanizma sakupljanja smeća JVM
Sakupljanje smeća je čišćenje ili sakupljanje već mrtvih ili dugo ne korišćenih objekata u heap memoriji.
Pre GC-a, JVM će prvo utvrditi šta je smeće, a šta nije, obično kroz algoritam analize dostupnosti procenjuje da li je objekat živ.

Nakon što se odredi koje smeće može biti sakupljeno, sakupljač smeća (kao CMS, G1, ZGC) treba da obavi sakupljanje smeća, može koristiti algoritam obeležavanja i čišćenja, algoritam kopiranja, algoritam obeležavanja i sređivanja, algoritam generacijskog sakupljanja itd.
Tehnički stil projekat koristi JDK 8, koristi CMS sakupljač smeća.
java -XX:+UseConcMarkSweepGC \
-XX:+UseParNewGC \
-XX:CMSInitiatingOccupancyFraction=75 \
-XX:+UseCMSInitiatingOccupancyOnly \
-jar your-application.jarKoji je proces sakupljanja smeća?
Proces sakupljanja smeća Java uglavnom se deli na tri faze: obeležavanje živih objekata, čišćenje beskorisnih objekata i kompresija/sređivanje memorije. Različiti sakupljači smeća koristi različite strategije i algoritme prilikom izvršavanja ovih koraka.

U kojim fazama dolazi do STW?
STW je mehanizam JVM da pauzira sve korisničke niti radi sakupljanja smeća.

Sažeto: u fazi obeležavanja, STW je neophodan. Bez obzira koji algoritam sakupljanja smeća, faza obeležavanja mora tačno pronaći sve žive objekte. Ako se tokom obeležavanja poslovne niti i dalje izvršavaju, obeležavanje će biti netačno. Jer poslovne niti mogu u procesu GC obeležavanja nekog objekta kao smeće istovremeno pristupiti tom objektu. Da bi se izbegao ovakav sukob, faza obeležavanja mora pauzirati sve poslovne niti.
U fazi čišćenja, da li je potreban STW zavisi od implementacije algoritma.
Ako se koristi algoritam kopiranja ili obeležavanja-sređivanja (treba pomeriti objekte), onda mora biti STW. Jer nakon pomeranja objekata, sve reference koje pokazuju na taj objekat treba ažurirati, u ovom procesu poslovne niti ne smeju pristupati ovim objektima.
Ako se koristi algoritam obeležavanja-čišćenja (ne pomera objekte), teoretski ne mora biti STW, poslovne niti i GC niti mogu istovremeno raditi.
Za sakupljače smeća Serial i ParNew nove generacije, ceo proces sakupljanja smeća će pokrenuti STW, ali zato što je mlada generacija mala, obično brzo (nekoliko milisekundi do desetine milisekundi).
1. Početno obeležavanje (STW)
- Pauziraj sve korisničke niti
- Obeleži objekte koje GC Roots direktno referenciraju
2. Kopiranje živih objekata (STW)
- Kopiraj žive objekte iz Eden i Survivor0 u Survivor1
- Očisti Eden i Survivor0
3. Ažuriranje referenci (STW)
- Ažuriraj sve reference koje pokazuju na pomerene objekteCMS je nad ovim poboljšao, kroz istovremeno izvršavanje smanjuje vreme STW, pokreće STW u fazama početnog obeležavanja i ponovljenog obeležavanja.
1. Početno obeležavanje Initial Mark (STW)✅
- Vreme je kratko
- Obeleži samo objekte koje GC Roots direktno referenciraju
- Obeleži sve objekte stare generacije koje referenciraju objekte mlade generacije
2. Istovremeno obeležavanje Concurrent Mark (istovremeno izvršavanje)
- Korisničke niti nastavljaju da rade
- GC nit prolazi kroz ceo graf objekata
- Obeleži sve žive objekte
3. Ponovljeno obeležavanje Remark (STW)✅
- Ispravi promene nastale tokom istovremenog obeležavanja
- Koristi algoritam inkrementalnog ažuriranja
- Ova faza traje duže od početnog obeležavanja
4. Istovremeno čišćenje Concurrent Sweep (istovremeno izvršavanje)
- Korisničke niti nastavljaju da rade
- Čisti neobeležene objekte
- Ne vrši kompresiju, stvara fragmentacijuG1 koristi ideju inkrementalnog sakupljanja, ne čisti ceo heap odjednom, već deli heap na mnogo malih regiona, svaki put čisti samo deo regiona. Time može rasporediti vreme STW, jednovremeno vreme STW je kraće.
ZGC koristi tehniku istovremenog sređivanja, može istovremeno sa izvršavanjem aplikacijskih niti vršiti sređivanje i pomeranje objekata, gotovo eliminiše vreme STW. Vreme STW ZGC-a obično je u okviru 10 milisekundi.
Kada se aktivira mehanizam sakupljanja smeća? Može li se ručno pokrenuti sakupljanje smeća? Da li sakupljanje smeća oduzima CPU poslovnog koda?
1, JVM će nadgledati korišćenje heap memorije, kada memorija skorO neće biti dovoljno, automatski će pokrenuti sakupljanje smeća.
2, Teoretski može ručno pokrenuti sakupljanje smeća, JVM pruža System.gc() metod, može se ručno pozivati za pokretanje sakupljanja smeća, ali generalno ne preporučuje.
3, Sakupljanje smeća će oduzeti CPU, pri sakupljanju smeća dolazi do STW, pauziraju se sve poslovne niti. Vreme STW pri Minor GC je kraće, vreme STW pri Major GC je duže.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Huawei OD tehnološka prva runda intjuvijanjem.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 2 Java back-end tehnološka prva runda intjuvijanjem: da li ste upoznali sa GC? Da li znate kako se procenjuje nedostupnost?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 26 letnja praksa WeChat Pay intjuvijanjem: JVM brisanje smeća
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Dewu intjuvijanjem kolege 8 prva runda intjuvijanjem: princip sakupljanja smeća u Java
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou kolege 2 prva runda intjuvijanjem: da li ste upoznali sa JVM? Pričaj o mehanizmu oslobađanja memorije?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje OPPO intjuvijanjem kolege 1 intjuvijanjem: koji je proces sakupljanja smeća?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje vivo intjuvijanjem kolege 10 tehnološka prva runda intjuvijanjem: pričaj o GC, koje metode postoje
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Honor intjuvijanjem kolege 4 intjuvijanjem: razumevanje sakupljanja smeća?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje ByteDance kolege 17 back-end tehnološko intjuvijanje: mehanizam sakupljanja smeća zašto učiti jvm scenario curenja memorije
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 27 oblak back-end tehnološka prva runda intjuvijanjem: GC? Kako prepoznati smeće?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Li Xiang car intjuvijanjem kolege 2 prva runda intjuvijanjem: pričaj o tvojem razumevanju GC?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 29 Java back-end prva runda intjuvijanjem: mehanizam sakupljanja smeća JVM?
memo: 19. avgusta 2025. izmenjeno do ovode, danas prijatelj poslao poruku kaže pridružio se planeti, uglavnom zato što Preokret intjuvijanja daje vrlo dobro iskustvo, zaista hvala na reputaciji i podršci.

24.🌟Kako se procenjuje da li su objekti još živi?
Java koristi algoritam analize dostupnosti da proceni da li je objekat još živ.
Kroz grupu "GC Roots" korenih objekata, rekurzivno skenira, objekti koji ne mogu biti dostignuti iz korenih objekata su "smeće", mogu biti sakupljeni.

Ovo je takođe glavni algoritam koji koriste mainstream sakupljači smeća kao G1, CMS.
Šta je metod brojanja referenci?
Svaki objekat ima brojač referenci, beleži broj referenci na njega. Kada brojač dosegne nulu, objekat može biti sakupljen.

Metod brojanja referenci ne može rešiti problem cikličkih referenci. Na primer, dva objekta međusobno referenciraju, ali se više ne referenciraju od drugih objekata, njihovi brojači referenci nisu nula, stoga neće biti sakupljeni.
Koje preduslovne operacije treba uraditi prilikom analize dostupnosti?
Pre sakupljanja smeća, JVM će pauzirati sve izvršavajuće poslovne niti.
To je zato što proces analize dostupnosti mora osigurati da se prilikom analize odnosi između objekata u memoriji neće modifikovati poslovne niti. Ako se ne pauziraju poslovne niti, može doći do promena referenci na objekte, što dovodi do neusklađenosti u proceni da li su objekti dostupni tokom sakupljanja smeća, čime se izazivaju ozbiljne memorijske greške ili gubitak podataka.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 7 JD domaćina intjuvijanjem: kako proceniti da li se objekat može sakupiti
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou kolege 2 prva runda intjuvijanjem: koje preduslovne operacije treba uraditi prilikom analize dostupnosti?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 9 intjuvijanjem: kakvi objekti se smatraju smeće objektima
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje kolege D Xiaomi prva runda intjuvijanjem: koje metode postoje u GC za procenjivanje da li se objekat može sakupiti
25.Koje vrste referenci mogu biti GC Roots u Java?
- Preporučeno čitanje: Duboko razumevanje mehanizma sakupljanja smeća
- Preporučeno čitanje: R veliki takozvani "GC roots"
Tako zvani GC Roots su grupa referenci koje moraju biti aktivne, one su početna tačka izvršavanja programa, izvor svih lanaca referenci. U Java, GC Roots uključuju sledeće:
- Reference u virtuelnom steku (parametri metoda, lokalne promenljive itd.)
- Reference JNI u lokalnom metodskom steku
- Statičke promenljive klase
- Konstante u runtime konstantnom pool-u (String ili Class tip)

Pričaj o referencama u virtuelnom steku?
Pogledajmo sledeći kod:
public class StackReference {
public void greet() {
Object localVar = new Object(); // Ovde localVar je lokalna promenljiva, postoji u virtuelnom steku
System.out.println(localVar.toString());
}
public static void main(String[] args) {
new StackReference().greet();
}
}U greet metodu, localVar je lokalna promenljiva, postoji u virtuelnom steku, može se smatrati GC Roots.
Tokom izvršavanja greet metoda, objekat koji localVar referencira je aktivan, jer je dostupan iz GC Roots.
Kada greet metod završi sa izvršavanjem, domen važenja localVar se završava, Object objekat koji localVar referencira više nije referenciran od bilo kojeg GC Roots (pod pretpostavkom da nema drugih referenci na ovaj objekat), stoga će imati kvalitet da bude smeće 😁.
Pričaj o referencama JNI u lokalnom metodskom steku?
Java kroz JNI pruža mehanizam koji dozvoljava Java kodu da poziva lokalni kod (obično kod napisan u C ili C++).
Kada se poziva Java metod, virtuelna mašina će kreirati okvir steka i gurnuti ga u virtuelni stek, a kada poziva lokalni metod, virtuelna mašina će kroz dinamičko povezivanje direktno pozvati određeni lokalni metod.

JNI reference su reference kreirane u kodu Java Native Interface, mogu pokazivati na objekte u Java heap-u.
// Pretpostavljeni JNI metod
public native void nativeMethod();
// Pretpostavljeni lokalni metod implementiran u C/C++
/*
* Class: NativeExample
* Method: nativeMethod
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NativeExample_nativeMethod(JNIEnv *env, jobject thisObj) {
jobject localRef = (*env)->NewObject(env, ...); // Kreiranje JNI reference u lokalnom metodskom steku
// Java objekat koji localRef referencira je aktivan tokom izvršavanja lokalnog metoda
}U lokalnom kodu, localRef je JNI referenca na Java objekat, tokom izvršavanja lokalnog metoda održava Java objekat aktivnim, može se smatrati GC Roots.
Jednom kada se JNI metod završi, osim ako je ova referenca globalna, inače će objekat na koji pokazuje biti smeće (pod pretpostavkom da nigde drugde nije referenciran ovaj objekat).
Pričaj o statičkim promenljivama klase?
Pogledajmo sledeći kod:
public class StaticFieldReference {
private static Object staticVar = new Object(); // Statička promenljiva klase
public static void main(String[] args) {
System.out.println(staticVar.toString());
}
}U StaticFieldReference klasi, staticVar referencira Object objekat, ova referenca smeštena je u metaspace, može se smatrati GC Roots.
Dok se StaticFieldReference klasa ne uklanja, objekti koje staticVar referencira neće biti sakupljeni sakupljačem smeća. Ako se StaticFieldReference klasa ukloni (ovo se obično dešava kada se učitavač klasa ove klase sakupi smećem), tada će takođe objekti koje staticVar referencira moći da budu smeće (ako nema drugih referenci na ovaj objekat).
Pričaj o konstantama u runtime konstantnom pool-u?
Pogledaj ovaj kod:
class ConstantPoolReference {
public static final String CONSTANT_STRING = "Hello, World"; // Konstanta, postoji u runtime konstantnom pool-u
public static final Class<?> CONSTANT_CLASS = Object.class; // Konstanta tipa klase
public static void main(String[] args) {
System.out.println(CONSTANT_STRING);
System.out.println(CONSTANT_CLASS.getName());
}
}U ConstantPoolReference, CONSTANT_STRING i CONSTANT_CLASS kao konstante smeštene su u runtime konstantni pool. Mogu se koristiti kao GC Roots.
Objekti (string "Hello, World" i Object.class klasni objekat) na koje ove konstante referišu su u konstantnom pool-u, dok se ConstantPoolReference klasa koja sadrži ove konstante ne uklanja, ovi objekti neće biti sakupljeni smećem.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje FanRuan kolege 3 Java back-end prva runda intjuvijanjem: koji objekti mogu biti GC Roots
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 27 oblak back-end tehnološka prva runda intjuvijanjem: GC Root?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje kolege D Xiaomi prva runda intjuvijanjem: koji objekti mogu biti gc root
26.Jeste li upoznali sa finalize() metodom?
Sakupljanje smeća je kao drevna kazna posle žetve, finalize() je kao "oprostiti na samrti", pre izvršenja osude, treba još jednom pregledati, da li ima nepravde, da li treba oprostiti.

Ako se prilikom analize dostupnosti utvrdi da nema lanac referenci koji povezuje objekat sa GC Roots, biće prvi put obeležen, zatim sledi filtriranje.
Uslov filtriranja je da li objekat mora izvršiti finalize() metod.
Ako objekat uspešno "spasi sebe" u finalize() - dovoljno je ponovo uspostaviti vezu sa bilo kojim objektom u lancu referenci.
Na primer, dodeliti sebi (this ključna reč) nekoj klasnoj promenljivoj ili članskoj promenljivoj objekta, tada pri drugom obeležavanju "beži" jednom; ali ako ne iskoristi ovu priliku, tada je objekat zaista spreman za sakupljanje.
27.🌟Jeste li upoznali sa algoritmima sakupljanja smeća?
Glavni algoritmi sakupljanja smeća su tri, redom algoritam obeležavanja-čišćenja, algoritam obeležavanja-kopiranja i algoritam obeležavanja-sređivanja.
Pričaj o algoritmu obeležavanja-čišćenja?
Obeležavanje-čišćenje algoritam se deli u dve faze:
- Obeležavanje: obeleži sve objekte koji treba sakupiti
- Čišćenje: sakupi sve obeležene objekte

Prednost je jednostavna implementacija, mana je što prilikom čišćenja nastaje fragmentacija memorije.
Pričaj o algoritmu obeležavanja-kopiranja?
Obeležavanje-kopiranje algoritam može rešiti problem fragmentacije memorije algoritma obeležavanja-čišćenja, jer deli memorijski prostor na dva bloka, svaki put koristi samo jedan blok. Kada se ovaj blok memorije iskoristi, još uvek žive objekte kopira u drugi blok, zatim čisti ovaj blok.

Mana je što se gubi polovina memorijskog prostora.
Pričaj o algoritmu obeležavanja-sređivanja?
Obeležavanje-sređivanje algoritam je nadogradnja algoritma obeležavanja-čišćenja kopiranja, više ne deli memorijski prostor, već pomeraja žive objekte na jednu stranu memorije, zatim čisti memoriju izvan granice.

Mana je visoka cena pomeranja objekata.
Pričaj o algoritmu generacijskog sakupljanja?
Generacijsko sakupljanje algoritam je trenutni mainstream algoritam sakupljanja smeća, deli memoriju na nekoliko blokova prema različitim životnim vekovima objekata, obično se deli na novu generaciju i staru generaciju.

Nova generacija koristi algoritam kopiranja, jer većina objekata ima kratak životni vek. Stara generacija koristi algoritam obeležavanja-sređivanja, jer je stopa preživljavanja objekata viša.
Zašto koristiti generacijsko sakupljanje?
Glavna ideja generacijskog algoritma sakupljanja je optimizacija sakupljanja smeća na osnovu životnog veka objekata.
Objekti nove generacije imaju kratak životni vek, korišćenje algoritma kopiranja može brzo sakupiti. Objekti stare generacije imaju dugačak životni vek, korišćenje algoritma obeležavanja-sređivanja može smanjiti troškove pomeranja objekata.
Da li obeležavanje i kopiranje kod algoritma obeležavanja-kopiranja će se pauzirati?
Kod algoritma obeležavanja-kopiranja, faza obeležavanja i faza kopiranja će pokrenuti STW.
- Pauza faze obeležavanja je da bi se osiguralo da se odnosi između objekata ne modifikuju.
- Pauza faze kopiranja je da se spreči modifikacija objekta tokom kopiranja.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje ByteDance intjuvijanjem kolege 1 Java back-end tehnološka prva runda intjuvijanjem: koliko algoritama sakupljanja smeća znate?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Xiaomi intjuvijanjem kolege F intjuvijanjem: algoritmi sakupljanja smeća i detaljno objašnjenje
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 27 oblak back-end tehnološka prva runda intjuvijanjem: koji metodi sakupljanja? Kako se konkretno sakuplja u algoritmu generacijskog sakupljanja? Zašto koristiti generacijsko sakupljanje?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Baidu kolege 4 intjuvijanjem: koje GC algoritme postoje?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 9 intjuvijanjem: pitao je za algoritme sakupljanja smeća, za svaki algoritam pitao prednosti i mane
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje kolege D Xiaomi prva runda intjuvijanjem: koje gc algoritme sakupljanja smeća postoje
memo: 3. novembra 2025., danas prijatelj mi je poslao privatnu poruku pita kako izabrati ponudu, ima jednu ponudu sp iz Chengduna od JD, još jednu od e-commerce Douyin, obe su vrlo top ponude, zaista čestitam ga.

28.Šta znače Minor GC, Major GC, Mixed GC, Full GC?
Minor GC se takođe zove Young GC, odnosi se na sakupljanje smeća u mladoj generaciji. Mlada generacija uključuje Eden region i dva Survivor regiona.

Major GC se takođe zove Old GC, uglavnom se odnosi na sakupljanje smeća u staroj generaciji. Specifično ponašanje CMS-a.
Mixed GC je specifičan tip GC-a sakupljača G1, u jednom GC-u istovremeno čisti mladu generaciju i deo stare generacije.
Full GC je najtemeljnije sakupljanje smeća, uključuje ceo Java heap i metodski region. Najduže GC, obično se dešava kada je JVM pod velikim pritiskom.
Kako Full GC čisti?
Full GC će krenuti od GC Root, obeležiti sve dostupne objekte. Mlada generacija koristi algoritam kopiranja, čisti Eden region. Stara generacija koristi algoritam obeležavanja-sređivanja, sakuplja objekte i eliminiše fragmentaciju.
Vreme pauze je duže, utiče na performanse sistema odgovora.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Alibaba intjuvijanjem kolege 5 Alibaba mama Java back-end tehnološka prva runda intjuvijanjem: razlika između full gc i young gc
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent intjuvijanjem kolege 27 oblak back-end tehnološka prva runda intjuvijanjem: kako full gc čisti?
29.Kada se pokreće Young GC?
Ako u Eden regionu nema dovoljno prostora, pokreće se Young GC da se očisti mlada generacija.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Baidu kolege 4 intjuvijanjem: kada se pokreće GC?
30.Kada se pokreće Full GC?
Tokom Young GC, ako se ustanovi da dostupan kontinualni memorijski prostor stare generacije < prosečna veličina objekata koji se u staru generaciju premeštaju posle svakog Young GC, to znači da ovaj put nakon Young GC veličina objekata koji se premestaju u staru generaciju može premašiti trenutno dostupnu memoriju stare generacije, pokreće se Full GC.
Nakon izvršavanja Young GC u staroj generaciji nema dovoljno memorije za smeštaj prebačenih objekata, odmah će se pokrenuti jedan Full GC.
System.gc(), jmap -dump itd. komande će pokrenuti full gc.
Šta je garancija dodele prostora?
Garancija dodele prostora odnosi se na to da pre Minor GC, JVM osigurava da stara generacija ima dovoljno prostora za smeštaj objekata koji se unapređuju iz mlade generacije. Ako memorija stare generacije nije dovoljna, može se pokrenuti Full GC.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou kolege 4 prva runda intjuvijanjem: kako proceniti mrtve objekte? Koji su GC Roots? Šta je garancija dodele prostora?
31.🌟Koji sakupljače smeća znate?
Preporučeno čitanje: Duboko razumevanje sakupljača smeća JVM: CMS, G1, ZGC
Sakupljači smeća JVM uglavnom se dele u dve velike kategorije: generacijski sakupljači i regionalni sakupljači, predstavnik generacijskih je CMS, predstavnici regionalnih su G1 i ZGC.

CMS je prvi sakupljač smeća koji se fokusirao na vreme pauze GC, uveden u JDK 1.5, označen kao zastareo u JDK9, uklonjen u JDK14.
G1 je uveden u JDK 1.7, u JDK 9 je zamenio CMS i postao podrazumevani sakupljač smeća.
ZGC je sakupljač smeća niskog kašnjenja predstavljen u JDK11, pogodan za upravljanje memorijom i sakupljanje servisa velike memorije i niskog kašnjenja, pod heap-om od 128G, maksimalno vreme pauze je tek 1.68 ms, performanse daleko nadmašuju G1 i CMS.
Pričaj o Serial sakupljaču?
Serial sakupljač je najosnovniji, najstariji sakupljač.
Kao što ime kaže (serijski), to je sakupljač koji radi u jednoj niti, koristi jedan procesor ili jednu nit sakupljanja smeća za završetak posla sakupljanja smeća. I pri sakupljanju smeća mora pauzirati sve druge radne niti, dok se sakupljanje smeća ne završi - to je tzv. "Stop The World".
Proces izvršavanja sakupljača Serial/Serial Old:

Pričaj o ParNew sakupljaču?
ParNew sakupljač je u suštini višnitna verzija Serial sakupljača, koristi više niti za sakupljanje smeća.
Shema izvršavanja sakupljača ParNew/Serial Old:

Pričaj o Parallel Scavenge sakupljaču?
Parallel Scavenge sakupljač je sakupljač mlade generacije, implementiran na osnovu algoritma obeležavanja-kopiranja, takođe može sakupljati paralelno. Sličan je ParNew, ali Parallel Scavenge se uglavnom fokusira na propusnost sakupljanja smeća - tzv. propusnost, odnos CPU vremena za izvršavanje korisničkog koda i ukupnog vremena potrošenog, što je veći odnos, to je manji udeo sakupljanja smeća.

Prema različitim životnim vekovima objekata memoriju deli na nekoliko blokova, obično Java heap deli na mladu generaciju i staru generaciju, time može za svaku generaciju koristiti najodgovarajući algoritam sakupljanja.
Pričaj o Serial Old sakupljaču?
Serial Old je starija verzija Serial sakupljača, takođe jednostruki sakupljač, koristi algoritam obeležavanja-sređivanja.
Pričaj o Parallel Old sakupljaču?
Parallel Old je starija verzija Parallel Scavenge sakupljača, implementiran na osnovu algoritma obeležavanja-sređivanja, koristi više GC niti da istovremeno vrši sakupljanje smeća tokom STW.

Pričaj o CMS sakupljaču?
CMS je uveden u JDK 1.5, označen kao zastareo u JDK 9, uklonjen u JDK 14.
CMS je sakupljač smeća niskog kašnjenja, koristi algoritam obeležavanja-čišćenja, podeljen u četiri faze: početno obeležavanje, istovremeno obeležavanje, ponovljeno obeležavanje i istovremeno čišćenje, prednost je što se nit sakupljanja smeća i nit aplikacije istovremeno izvršavaju, vreme pauze je kratko, pogodno za aplikacije osetljive na kašnjenje, ali lako stvara fragmentaciju memorije, može pokrenuti Full GC.

Pričaj o G1 sakupljaču?
G1 je uveden u JDK 1.7, u JDK 9 je zamenio CMS i postao podrazumevani sakupljač smeća.
G1 je sakupljač smeća orijentisan na veliku memoriju i visoku propusnost, deli heap na više malih Region-a, kroz algoritam obeležavanja-sređivanja izbegava problem fragmentacije memorije. Prednost je što se vreme pauze može kontrolisati, pogodno za scenario velikog heap-a, ali podešavanje je kompleksnije.

Pričaj o ZGC sakupljaču?
ZGC je sakupljač smeća niskog kašnjenja uveden u JDK 11, najveća karakteristika je što drži vreme pauze sakupljanja smeća u okviru 10ms, čak i pod heap-om memorije na TB nivou takođe održava nisko vreme pauze.
Kroz istovremeno obeležavanje i releokaciju izbjegava većinu Stop-The-World pauza, uglavnom se oslanja na bojenje pokazivača za upravljanje stanjem objekata.

- Označavanje dostupnosti objekta: Kroz dodavanje oznaka bitova na pokazivaču, bez potrebe za dodatnim bitovima oznake može se proceniti stanje preživljavanja objekta.
- Stanje releokacije: Kada se objekat pomera, može se kroz bojenje pokazivača ažurirati referenca na objekat, bez čekanja na globalnu sinhronizaciju.
Pogodno za scenarije koji zahtevaju ekstremno nisko kašnjenje, kao finansijski trgovinski sistemi, e-commerce platforme.
Koja je uloga sakupljača smeća?
Glavna uloga sakupljača smeća je automatsko upravljanje memorijom Java aplikacija tokom izvršavanja. Odgovoran je za prepoznavanje koje memorije se više ne koriste od strane aplikacija i oslobađanje ovih memorija za ponovnu upotrebu.
Ovaj proces smanjuje teret programera za ručno upravljanje memorijom, smanjuje rizik od curenja memorije i grešaka prekoračenja.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Didi kolege 2 tehnološka druga runda intjuvijanjem: koje sakupljače smeća znate, može sakupljati samo jednu generaciju (mlada, stara), korišćena verzija jdk
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 10 back-end intjuvijanjem prva runda intjuvijanjem: koja je uloga sakupljača smeća
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Ctrip intjuvijanjem kolege 10 Java letnja praksa prva runda intjuvijanjem: koji sakupljači smeća postoje, opiši jedan proces sakupljanja smeća
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 4 intjuvijanje oblaka prva runda intjuvijanjem: čestih 7 GC sakupljača
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 15 Dianping back-end tehnološko intjuvijanje: pričaj o sakupljačima smeća koje znaš, da li znaš ZGC sakupljač (ne zna)
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Alibaba Cloud intjuvijanjem kolege 22 intjuvijanjem: razlika između cms i g1
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 9 intjuvijanjem: kako razumeti konkurentnost i paralelnost, koja je razlika između Parallel Old i CMS?
32.🌟Možeš li detaljno pričati o procesu sakupljanja smeća CMS?

CMS koristi obeležavanje-čišćenje algoritam za sakupljanje smeća, podeljeno u 4 velika koraka:
- Početno obeležavanje: obeleži sve objekte direktno dostupne iz GC Roots, ova faza zahteva STW, ali je vrlo brza.
- Istovremeno obeležavanje: od objekata obeleženih u početnom obeležavanju, prolazi kroz sve objekte, obeležuje sve dostupne objekte. Ova faza se izvršava istovremeno.
- Ponovljeno obeležavanje: završava preostali posao obeležavanja, uključuje obratu malih promena ostalih tokom istovremene faze, ova faza obično zahteva kratku STW pauzu.
- Istovremeno čišćenje: čisti neobeležene objekte, oslobađa memorijski prostor koji zauzimaju.
Pominjao si remark, kako se konkretno izvršava remark? Metod trobojnog obeležavanja?
Da, faza remark obično koristi metod trobojnog obeležavanja za izvršavanje, osigurava da se svi živi objekti pravilno obeleže tokom istovremenog obeležavanja. Cilj je ispraviti promene referenci koje su mogle biti propuštene tokom istovremenog obeležavanja.
U fazi remark, sakupljač smeća će zaustaviti niti aplikacije, kako bi osigurao da u ovoj fazi neće doći do daljih promena u odnosima između referenci. Ova pauza je obično vrlo kratka. Faza remark uglavnom uključuje sledeće operacije:
- Obrada promena referenci zabeleženih barijerom pisanja: Tokom istovremenog obeležavanja, aplikacija može ažurirati reference na objekte (npr. crni objekat dodaje referencu na beli objekat), ove promene se beleže kroz barijer pisanja. U fazi remark, GC će obraditi ove zapise, osiguravajući da se svi dostupni objekti pravilno obeležavaju kao sivi ili crni.
- Skeniranje sivih objekata: ponovo prolazi kroz sive objekte, obrađuje sve njihove reference, osigurava da se referencirani objekti pravilno obeležavaju kao sivi ili crni.
- Čišćenje: osigurava da se nakon pravilne obrave svih odnosa referenci, sivi objekti obeležavaju kao crni, beli objekti ostaju nepromenjeni. Nakon završetka ovog koraka, svi živi objekti bi trebalo da budu crni.
Šta je metod trobojnog obeležavanja?

Metod trobojnog obeležavanja koristi se za obeležavanje stanja preživljavanja objekata, deli objekte na tri kategorije:
- Beli (White): objekti koji još nisu posećeni. Nakon završetka sakupljanja smeća, objekti koji su i dalje beli smatraju se nedostupnim objektima, mogu se sakupiti.
- Sivi (Gray): objekti koji su već posećeni ali čije reference nisu potpuno obeležene. Sivi objekti treba dalje obraditi.
- Crni (Black): objekti koji su već posećeni i svi referencirani objekti su već obeleženi. Crni objekti su potpuno obrađeni, ne treba ih dalje obrađivati.
Proces rada metoda trobojnog obeležavanja:
①, Početno obeležavanje (Initial Marking): kreće od GC Roots, obeležuje sve direktno dostupne objekte kao sive.
②, Istovremeno obeležavanje (Concurrent Marking): u ovoj fazi, obeležuje sve objekte na koje sivi objekti referenciraju kao sive, zatim samo sive objekte obeležava kao crne. Ovaj proces je istovremen, istovremeno se izvršava sa nitima aplikacije.
Jedan problem u ovoj fazi je što niti aplikacije mogu tokom istovremenog obeležavanja modifikovati odnose referenci između objekata, dovodeći do toga da stanja obeležavanja nekih objekata budu netačna.
③, Ponovljeno obeležavanje (Remarking): cilj faze ponovljenog obeležavanja je obrata promena referenci propuštenih tokom istovremenog obeležavanja. Da bi se osiguralo da su svi živi objekti pravilno obeleženi, remark se mora izvršiti tokom STW pauze.
④, Korišćenje barijera pisanja (Write Barrier) za hvatanje ažuriranja referenci na objekte od strane niti aplikacije tokom istovremenog obeležavanja. Kroz prolazak ovih ažuriranih referenci za ispravu stanja obeležavanja, osigurava se da propušteni objekti ne budu pogrešno sakupljeni.
Preporučeno čitanje: trobojno obeležavanje xiaodaoge
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Ctrip intjuvijanjem kolege 10 Java letnja praksa prva runda intjuvijanjem: koji sakupljači smeća postoje, opiši jedan proces sakupljanja smeća
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Ctrip intjuvijanjem kolege 1 Java back-end tehnološka prva runda intjuvijanjem: kreiranje do uništavanje objekta, kako se dodeljuje memorija, (proces učitavanja klase i kreiranja objekta, CMS, G1 čišćenje i dodela memorije)
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Shouqianba intjuvijanjem kolege 1 Java back-end prva runda intjuvijanjem: koji algoritam sakupljanja smeća koristi CMS? Pominjao si remark, kako se konkretno izvršava remark? Metod trobojnog obeležavanja?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 9 intjuvijanjem: pitao je za CMS sakupljač smeća
33.🌟Jeste li upoznali sa G1 sakupljačem smeća?
G1 je uveden u JDK 1.7, u JDK 9 je zamenio CMS i postao podrazumevani sakupljač smeća.

G1 deli Java heap na više istih veličina nezavisnih regiona Region, svaki region može igrati ulogu mlade generacije ili stare generacije.
Istovremeno, G1 ima i jedan region specijalno dizajniran za velike objekte, nazvan Humongous region.
Velikok objekat se procenjuje tako što ako jedan veliki objekat premašuje 50% veličine Region, npr. svaki Region je 2M, sve dok jedan objekat premašuje 1M, će biti smešten u Humongous.
Ovakvo regionalno upravljanje omogućava G1 fleksibilnije sakupljanje smeća, samo sakuplja deo regiona umesto cele mlade generacije ili stare generacije.
Proces izvršavanja G1 sakupljača može se podeliti u nekoliko koraka:
①, Istovremeno obeležavanje, G1 kroz istovremeno obeležavanje pronalazi smećene objekte na heap-u. Faza istovremenog obeležavanja se istovremeno izvršava sa nitima aplikacije, ne dovodi do pauze niti aplikacije.
②, Mešovito sakupljanje, nakon završetka istovremenog obeležavanja, G1 će izračunati koji regioni imaju najveću vrednost sakupljanja (tj. sadrže najviše smeća), zatim prioritetno sakuplja ove regione. Ovaj način sakupljanja uključuje deo regiona mlade generacije i regiona stare generacije.
Biranjem regiona niskih troškova sakupljanja a visih dobiti za sakupljanje može povećati efikasnost sakupljanja i smanjiti vreme pauze.
③, Predvidljiva pauza, G1 tokom sakupljanja smeća i dalje treba «Stop the World». Ipak, G1 dodaje mehanizam predviđanja na vreme pauze, korisnik može pri pokretanju JVM navesti očekivano vreme pauze, G1 će nastojati da u ovom vremenu završi sakupljanje smeća.

Kako se paralelno izvršava prilikom izračunavanja Regiona sa poslovnim kodom
U G1, heap je podeljen na mnogo regiona istih veličina, svaki region se zove Region. Način rada G1 je da se svaki put ne sakuplja ceo heap, već izračunava u kojim regionima ima najviše smeća, sakupljanje je najefikasnije, zatim sakuplja samo ove regione.
┌─────────────────────────────────────────────────┐
│ Region1 │ Region2 │ Region3 │ Region4 │ Region5 │
│ Mlada │ Mlada │ Stara │ Stara │ Slobodan │
│ Smeh: 10%│ Smeh: 5% │ Smeh: 70%│ Smeh: 15%│ │
└─────────────────────────────────────────────────┘Prvi korak, G1 će pokrenuti nekoliko GC niti za obeležavanje, ove niti rade istovremeno sa poslovnim nitima. Poslovne niti izvršavaju kod, nit za obeležavanje istovremeno prolazi kroz objekte na heap-u, pronalazi koji su živi, koji su smeće.
Ovde treba koristiti tehnologiju barijere pisanja (Write Barrier), kad god poslovna nit promeni referencu na objekat, barijera pisanja će to zabeležiti: "jedna referenca je promenjena". GC nit će na osnovu ovih zapisa prilagoditi rezultate obeležavanja.
// Pojednostavljeni koncept barijere pisanja
class Object {
Object ref;
// Poslovna nit izvršava: obj.ref = newRef;
// Stvarni proces izvršavanja:
public void setRef(Object newRef) {
// Originalna operacija
this.ref = newRef;
// Operacija barijere pisanja (automatski je ubacuje JVM)
writeBarrier(newRef); // Obaveštava GC: "referenca ovog objekta je promenjena"
}
}Drugi korak, istovremeno izračunava procenat smeća svakog Regiona.
Treći korak, G1 na osnovu rezultata izračunavanja bira regione sa najviše smeća za sakupljanje. Tek tada će pokrenuti STW, pauzirati poslovne niti, vršiti čišćenje smeća u ovim regionima.
Budući da se čisti samo mali broj regiona, a ne ceo heap. Stoga je vreme STW vrlo kratko.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 1 Java tehnološka prva runda intjuvijanjem: pričaj o principu G1 sakupljača smeća
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Ctrip intjuvijanjem kolege 1 Java back-end tehnološka prva runda intjuvijanjem: kreiranje do uništavanje objekta, kako se dodeljuje memorija, (proces učitavanja klase i kreiranja objekta, CMS, G1 čišćenje i dodela memorije)
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Baidu kolege 4 intjuvijanjem: da li ste upoznali sa G1 sakupljačem smeća?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Li Xiang car intjuvijanjem kolege 2 prva runda intjuvijanjem: da li ste upoznali sa G1 sakupljačem smeća?
memo: 17. septembra 2025. izmenjeno do ovode. Danas prijatelj je posebno došao da zahvali planeti, projekat i znanja su vrlo pomogli, kaže da mu je malo novca stalo da me trudi, haha. Želim da budem takva osoba, da svima omogućim da dobijaju ogroman rast uz minimalnu investiciju, time ću imati reputaciju.

34.Zašto uvesti G1 kada postoji CMS?
| Karakteristika | CMS | G1 |
|---|---|---|
| Cilj dizajna | Nisko vreme pauze | Predvidljivo vreme pauze |
| Istovremenost | Da | Da |
| Fragmentacija memorije | Da, lako stvara fragmentaciju | Ne, kroz regionalnu podelu i kompresiju smanjuje fragmentaciju |
| Generacijsko sakupljanje | Mlada generacija i stara generacija | Ceo heap, ali razlikuje mladu i staru generaciju |
| Istovremena faza | Istovremeno obeležavanje, istovremeno čišćenje | Istovremeno obeležavanje, istovremeno čišćenje, istovremeno sakupljanje |
| Predviđanje vremena pauze | Teško predviditi | Može se podesiti ciljano vreme pauze |
| Česti problemi | Fragmentacija memorije, Concurrent Mode Failure | Ređe dolazi do dužih vremena pauze |
CMS je pogodan za scenario aplikacija osetljivih na kašnjenje, glavni cilj je smanjiti vreme pauze, ali lako stvara fragmentaciju memorije.
G1 pruža bolje predviđanje vremena pauze i sposobnost kompresije memorije, pogodno za okruženje velike memorije i višejezgarnih procesora.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou intjuvijanjem kolege 5 intjuvijanjem: koja je razlika između CMS sakupljača smeća i G1 sakupljača smeća
35.Koji sakupljač smeća koristite u produkcionoj sredini?
U našoj produkcionoj sredini koristimo G1 sakupljač smeća koji je dizajniran dobro, jer ne samo da zadovoljava zahteve niskog kašnjenja, već rešava problem plutajućeg smeća CMS-a, problem fragmentacije memorije.
G1 je vrlo pogodan za okruženje velike memorije i višejezgarnih procesora.
Gornji odgovor je uglavnom u skladu sa očekivanjima ispitanika, ali u stvari, u većini slučajeva i dalje možda koristimo podrazumevani sakupljač smeća JDK 8.
Može se kroz sledeću komandu videti koji sakupljač smeća trenutni JVM koristi:
java -XX:+PrintCommandLineFlags -version
UseParallelGC = Parallel Scavenge + Parallel Old, znači da mlada generacija koristi Parallel Scavenge sakupljač, stara generacija koristi Parallel Old sakupljač.
Stoga takođe možeš odgovoriti:
Poslovanje našeg sistema je relativno komplikovano, ali konkurentnost nije posebno visoka, stoga smo izabrali Parallel GC koji je pogodan za višejezgarni procesor, može paralelno obavljati poslove sakupljanja smeća i pruža visoku propusnost.
Ali ovaj odgovor nije omiljeni, možeš odgovoriti:
Naš sistem koristi CMS sakupljač, može maksimalno smanjiti vreme pauze aplikacije.
Koji algoritam sakupljanja smeća koristi projekat na radu?
U našoj produkcionoj sredini koristimo G1 sakupljač smeća koji je dizajniran dobro, G1 koristi algoritam regionalnog obeležavanja-sređivanja, deli heap na više regiona, sakuplja po potrebi, pogodno za okruženje velike memorije i višejezgarno, može istovremeno razmatrati propusnost i vreme pauze.
Ili:
Naš sistem koristi CMS sakupljač, CMS koristi algoritam obeležavanja-čišćenja, može istovremeno obeležavati i čistiti smeće, smanjuje vreme pauze, pogodno za aplikacije osetljive na kašnjenje.
Ili:
Naš sistem koristi Parallel sakupljač, Parallel koristi algoritam kopiranja u mladoj generaciji, algoritam obeležavanja-sređivanja u staroj generaciji, pogodno za aplikacije sa visokim zahtevima propusnosti.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Huawei OD intjuvijanjem kolege 3 tehnološka druga runda intjuvijanjem: koji algoritam sakupljanja smeća koristi projekat na radu
36.Kako treba birati sakupljač smeća?
Ako aplikaciji treba samo mali memorijski prostor (oko 100 MB), ili nema posebnih zahteva za vreme pauze, može se izabrati Serial sakupljač.
Ako se prvenstveno razmatra maksimalna performansa aplikacije, i nema vremenskih zahteva, ili može se prihvatiti pauza od 1 sekunde ili duže, može se izabrati Parallel sakupljač.
Ako je prioritet vreme odgovora iznad propusnosti, ili pauza sakupljanja smeća mora ostati u okviru oko 1 sekunde, može se izabrati CMS/ G1 sakupljač.
Ako je prioritet visok vreme odgovora, ili je memorijski prostor veliki, može se izabrati ZGC sakupljač.
memo: 16. januara 2025. izmenjeno do ovode.
IV. Podešavanje JVM
37.Koje alatke komandne linije za monitoring performansi ste koristili?
Na nivou operativnog sistema, koristio sam komande kao što su top, vmstat, iostat, netstat itd., mogu nadgledati korišćenje resursa celog sistema, npr. korišćenje memorije, CPU, IO, mrežno korišćenje.
Na nivou ugrađenih alatki komandne linije JDK, koristio sam jps, jstat, jinfo, jmap, jhat, jstack, jcmd itd., mogu videti informacije o izvršavanju JVM, korišćenje memorije, informacije o steku itd.
Kako generalno koristiš jmap?
①, Generalno koristim jmap -heap <pid> da vidim sažetak heap memorije, uključujući mladu generaciju, staru generaciju, metaspace itd.

②, ili koristim jmap -histo <pid> da vidim distribuciju objekata.

③, i generisanje fajla heap snimka: jmap -dump:format=b,file=<path> <pid>.

- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Bilibili kolege 1 druga runda intjuvijanjem: kako koristiš jmap, koje komande si koristio?
38.Koje vizuelne alatke za monitoring performansi poznaješ?
Vizuelne alatke koje sam koristio uglavnom uključuju:
①, JConsole: ugrađena alatka za monitoring JDK, može se koristiti za nadgledanje stanja izvršavanja Java aplikacija, uključujući korišćenje memorije, stanje niti, učitavanje klasa, GC itd.

②, VisualVM: vizuelna alatka bazirana na NetBeans, dugi niz godina VisualVM je bila glavna alatka za otklanjanje grešaka koju je Oracle zvanično promovisao. Integrisala je funkcionalnosti više alatki komandne linije JDK, vrlo prijateljska.

③, Java Mission Control: JMC je originalno dijagnostička alatka u JRockit VM, ali nakon Oracle JDK7 Update 40, vezana je za HotSpot VM. Međutim, kasnije je Oracle otvorio kod kao zaseban proizvod.

Koje third-party alatke ste koristili?
①, MAT: Java alatka za analizu heap memorije, uglavnom koristićena za analizu i pronalaženje curenja memorije i problema potrošnje memorije na Java heap-u; može analizirati korišćenje memorije iz fajla heap snimka Java heap, i pružiti bogate izveštaje, kao sumnjiva mesta curenja memorije, najveći objekti i informacije GC root; podržava upit objekata kroz grafički interfejs, i proveru odnosa između objekata.
②, GChisto: alatka za analizu GC logova, može pomoći da optimišemo ponašanje sakupljanja smeća i podesimo GC performanse.
③, JProfiler: komercijalna alatka za potpunu Java profilaciju performansi, pruža analizu CPU, memorije i niti u realnom vremenu.
④, arthas: Alibaba open source Java dijagnostička alatka, uglavnom koristićena za dijagnostiku aplikacija na liniji; podržava dijagnostiku bez zaustavljanja servisa; može pružiti funkcije uključujući pregled JVM informacija, monitoring, Trace komande dekompajliranja itd.
⑤, async-profiler: alatka za profilaciju niskih troškova, podržava generisanje flame grafikona, pogodna za analizu složenih problema performansi.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Huawei intjuvijanjem kolege 9 Java opšte razvoj softvera prva runda intjuvijanjem: kako viditi koji objekti se trenutno koriste u Java programu, koji su objekti oslobođeni
39.Koje parametre konfiguracije JVM znate?
Odgovor: Parametre za podešavanje JVM koje sam koristio uglavnom uključuju -Xms za postavljanje početne veličine heap, -Xmx za postavljanje maksimalne veličine heap, -XX:+UseG1GC za korišćenje G1 sakupljača smeća, -XX:MaxGCPauseMillis=n za postavljanje maksimalnog vremena pauze sakupljanja smeća, -XX:+PrintGCDetails za ispis detaljnog GC loga itd.
Koji parametri za konfigurisanje veličine heap memorije?
-Xms: početna veličina heap-Xmx: maksimalna veličina heap-XX:NewSize=n: postavlja veličinu mlade generacije-XX:NewRatio=n: postavlja odnos mlade i stare generacije. Npr.: n je 3 znači da je odnos mlade i stare generacije 1:3, mlada generacija zauzima 1/4 ukupnog-XX:SurvivorRatio=n: odnos Eden regiona i dva Survivor regiona u mladoj generaciji. Npr. n=3 znači da Eden zauzima 3 Survivor zauzima 2, jedan Survivor region zauzima 1/5 cele mlade generacije
Koji parametri za konfigurisanje GC sakupljača?
-XX:+UseSerialGC: postavlja serijski sakupljač-XX:+UseParallelGC: postavlja paralelni sakupljač-XX:+UseParalledlOldGC: postavlja paralelni sakupljač stare generacije-XX:+UseConcMarkSweepGC: postavlja istovremeni sakupljač
Koji parametri za konfigurisanje paralelnog sakupljanja?
-XX:MaxGCPauseMillis=n: postavlja maksimalno vreme pauze sakupljanja smeća-XX:GCTimeRatio=n: postavlja odnos vremena sakupljanja smeća i vremena izvršavanja programa-XX:+CMSIncrementalMode: postavlja inkrementalni mod, pogodno za okruženje jednog CPU-XX:ParallelGCThreads=n: postavlja broj niti paralelnog sakupljača
Koji parametri za ispisivanje logova procesa GC sakupljanja?
-XX:+PrintGC: ispisuje GC log-XX:+PrintGCDetails: ispisuje detaljni GC log-XX:+PrintGCTimeStamps: ispisuje vremenske oznake GC (u formi baznog vremena)-Xloggc:filename: put izlaza log fajla
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje NetEase intjuvijanjem kolege 4 Cloud Music back-end tehnološko intjuvijanje: koji parametri za podešavanje jvm
memo: 23. septembra 2025. izmenjeno do ovode. Danas dok sam pomagao prijatelju da menja biografiju, naišao sam na ovu povratnu informaciju: nije slušao Ergeov savet da menja biografiju, još uvek koristi staru, rezultat je vrlo loš, sada je dodao Pai Smart RAG projekat u iskustvo letnje prakse po Ergeovom savetu, nada se da Erge može još jednom pogledati.

40.Jeste li radili podešavanje JVM?
Radio.
Podešavanje JVM je složen proces, objekti podešavanja uključuju heap memoriju, sakupljače smeća i parametre izvršavanja JVM itd.

Ako se heap memorija postavi premalo, može dovesti do čestog sakupljanja smeća. Zato u Tehnički stil stvarni projekat, pri pokretanju JVM konfigurišem -Xms i -Xmx parametre, da maksimalna dostupna heap memorija bude 2G (koristio sam jeftiniji server).
Tokom rada projekta, koristiću JVisualVM redovno da pratim i analizujem GC logove, ako otkrijem čest Full GC, posebno ću obratiti pažnju na korišćenje stare generacije.
Zatim, kroz analizu heap dump-a tražim izvor curenja memorije, vidim da li ima nezatvorenih resursa, velikih objekata dugog životnog veka itd.
Nakon toga, vršim optimizaciju koda, na primer smanjenje kreiranja velikih objekata, optimizacija načina korišćenja data struktura, smanjenje nepotrebnog držanja objekata itd.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Huawei intjuvijanjem kolege 6 Java opšte razvoj softvera prva runda intjuvijanjem: pričaj o tvojem razumevanju podešavanja JVM
41.Kako otkriti visoko zauzeće CPU?
Odgovor: prvo, koristi top komandu da vidiš korišćenje CPU, pronađite ID procesa sa višim zauzećem CPU. Zatim, koristi jstack komandu da vidiš informacije o steku niti odgovarajućeg procesa. Zatim ponovo koristi top komandu da vidiš korišćenje niti u procesu, pronađi ID niti sa višim zauzećem CPU.
Zatim u izlazu jstack pretraži ovaj heksadecimalni ID niti, pronađi odgovarajuće informacije o steku. Konačno, na osnovu informacija steka lociraj specifičnu poslovnu metodu, vidi da li postoji beskonačna petlja, često sakupljanje smeća, resursna konkurencija koza dovodi do čestog menjanja konteksta itd. problemi.

Prvo, koristi top komandu da vidiš korišćenje CPU, pronađi ID procesa sa višim zauzećem CPU.
top
Zatim, koristi jstack komandu da vidiš informacije o steku niti odgovarajućeg procesa.
jstack -l <pid> > thread-dump.txtGore 👆🏻 ova komanda će izbaciti informacije o steku svih niti u fajl thread-dump.txt.
Zatim koristi top komandu da vidiš korišćenje niti u procesu, pronađi ID niti sa višim zauzećem CPU.
top -H -p <pid>
Obrati pažnju, ID niti koji top komanda prikazuje je decimalni, dok jstack izlaz prikazuje heksadecimalni, zato je potrebno pretvoriti ID niti u heksadecimalni.
printf "%x\n" PIDZatim u izlazu jstack pretraži ovaj heksadecimalni ID niti, pronađi odgovarajuću informaciju o steku.
"Thread-5" #21 prio=5 os_prio=0 tid=0x00007f812c018800 nid=0x1a85 runnable [0x00007f811c000000]
java.lang.Thread.State: RUNNABLE
at com.example.MyClass.myMethod(MyClass.java:123)
at ...Konačno, na osnovu informacija steka lociraj specifičnu poslovnu metodu, vidi da li postoji beskonačna petlja, često sakupljanje smeća, resursna konkurencija koza dovodi do čestog menjanja konteksta itd. problemi.
Da li ste istraživali problem isteka vremena interfejsa?
Istraživanje isteka vremena interfejsa treba analizirati s više nivoa. Prvo pogledajte monitoring na nivou aplikacije, npr. distribucija vremena odgovora interfejsa, stopa grešaka, QPS itd. indikatori.
Ako postoji alatka kao Skywalking, može se videti detaljna distribucija vremena čekanja lanca poziva, locirati koji je segment spor.

Na nivou baze podataka treba proveriti log sporih upita, da li neki SQL predugo izvršava. Može biti da nedostaju indeksi, uslovi upita nisu odgovarajući, ili čekanje na zaključavanje. Koristiću EXPLAIN da analiziram izvršni plan SQL, da vidim da li treba optimizovati.
Na nivou mreže treba razmatrati, npr. spori odgovor donjeg servisa, mrežna fluktuacija itd. Može se kroz alatke kao ping, telnet itd. testirati mrežnu povezivost i vreme odgovora.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Alibaba intjuvijanjem kolege 1 Xianyu back-end prva runda intjuvijanjem: kako otkloniti problem na liniji poslovanja, npr. visoko zauzeće CPU neke niti, kako videti informacije o steku
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou kolege 4 prva runda intjuvijanjem: zauzeće CPU servera konstantno raste, koje metode postoje za rešavanje problema? Nakon otkrivanja da je projekat doživeo curenje memorije, kako se utvrđuje gde je problem?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD kolege 19 JDS intjuvijanjem: ako memorijski, CPU visoko zauzeće linije servisa, ili istek vremena interfejsa, pričaj o opštem načinu rešavanja? Koje alatke se konkretno mogu koristiti?
memo: 14. avgusta 2025. izmenjeno do ovode. Danas dok sam pomagao prijatelju da menja biografiju, dobio sam ovu povratnu informaciju: struka je hardverski smer, takođe svaki dan čita Ergeove članke, 😄

42.Kako otkriti problem visokog zauzeća memorije?
Visoko zauzeće memorije obično nastaje zato što se kreira veliki broj Java objekata, ako se kontinuirano povećava, to znači da sakupljanje smeća ne može pratiti brzinu kreiranja objekata, ili curenje memorije dovodi do toga da se objekti ne mogu sakupiti.
Načini rešavanja uglavnom obuhvataju sledeće korake:
Prvi, prvo posmatraj situaciju sakupljanja smeća, možeš kroz jstat -gc PID 1000 videti broj i vreme GC. Ili kroz jmap -histo PID | head -20 pogledaš prvih 20 tipova objekata koji zauzimaju najviše heap memorije.
Drugi korak, kroz jmap komandu izbaci informacije o heap memoriji.

Treći korak, koristi vizuelne alatke za analizu dump fajla, na primer VisualVM, pronađi objekte koji zauzimaju mnogo memorije, zatim pronađi poziciju poslovnog koda koji je kreirao ovaj objekat, iz koda i poslovnog scenarija lociraj konkretan problem.

- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Lenovo intjuvijanjem kolege 7 intjuvijanjem: kako locirati memorijske probleme na liniji.
43.Šta raditi ako se često dešava minor gc?
Česti Minor GC obično znači da se objekti u mladoj generaciji često sakupljaju smećem, može biti zato što je prostor mlade generacije premalo postavljen, ili zato što u programu postoji mnogo objekata kratkog životnog veka (kao privremene promenljive).
Može se analizirati kroz GC logove, videti frekvenciju i vreme GC, pronaći uzrok čestog GC.
-XX:+PrintGCDetails -Xloggc:gc.logIli koristiti alatke za monitoring da vidiš korišćenje heap memorije, posebno korišćenje mlade generacije (Eden i Survivor regiona).
Ako je zbog nedostatka prostora mlade generacije, može se kroz -Xmn povećati veličina mlade generacije, usporiti popunjavanje mlade generacije.
java -Xmn256m your-app.jarAko objekti treba da dugo žive, ali se često unapređuju iz Survivor regiona u staru generaciju, može se kroz -XX:SurvivorRatio parametar podesiti odnos Edena i Survivor. Podrazumevani odnos je 8:1, znači da 8 prostora zauzima Eden, 1 prostor zauzima Survivor region.
-XX:SurvivorRatio=6Ako se podesi na 6, smanjiće se veličina Eden regiona, povećaće se veličina Survivor regiona, kako bi se osiguralo da objekti u Survivor regionu dovoljno dugo žive, izbegava prerano unapređenje u staru generaciju.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje JD intjuvijanjem kolege 8 intjuvijanjem: young GC često kako se rešava? koje parametre menjaš?
44.Šta raditi ako se često dešava Full GC?
Česti Full GC obično znači da se objekti u staroj generaciji često sakupljaju smećem, može biti zato što je prostor stare generacije premalo postavljen, ili zato što u programu postoji mnogo objekata dugog životnog veka.
Kako otkriti problem čestog Full GC?
U našoj kompaniji koristićemo specijalni sistem za monitoring performansi, gledamo frekvenciju GC i korišćenje heap memorije, zatim na osnovu monitoring podataka analiziramo uzrok GC.
Ako je mala kompanija, možeš ovako odgovoriti.
Generalno koristim ugrađene alatke JDK, uključujući jmap, jstat itd.
# Pregledaj korišćenje svih regiona heap memorije i GC situaciju
jstat -gcutil -h20 pid 1000
# Pregledaj žive objekte u heap memoriji, sortira se po prostoru
jmap -histo pid | head -n20
# dump heap memorija fajl
jmap -dump:format=b,file=heap pidIli koristiti neke vizuelne alatke, kao VisualVM, JConsole itd., gledati korišćenje heap memorije.
Ako je zbog velikih objekata koji se direktno dodeljuju u staru generaciju dovodi do čestog Full GC, može se kroz -XX:PretenureSizeThreshold parametar postaviti prag za velike objekte koji direktno ulaze u staru generaciju.
Ili podeliti velike objekte na male, smanjiti kreiranje velikih objekata. Na primer straniciranje.
Ako je zbog curenja memorije dovodi do čestog Full GC, može se kroz analizu heap dump fajla pronaći objekti curenja memorije, zatim pronaći kod poziciju curenja memorije.
Ako je zbog ulaska objekata dugog životnog veka u staru generaciju, treba na vreme osloboditi resurse, na primer ThreadLocal, baza podataka konekcija, IO resursi itd.
Ako je zbog neracionalne GC parametre konfiguracije dovodi do čestog Full GC, može se optimizovati ponašanje GC kroz prilagođavanje GC parametara. Ili direktno zameniti pogodnijim GC sakupljačem, kao G1, ZGC itd.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Dewu intjuvijanjem kolege 8 prva runda intjuvijanjem: koje uzroke može imati čest full gc u Java
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje NetEase intjuvijanjem kolege 4 Cloud Music intjuvijanjem: ako se često dešava full gc, šta može prilagoditi, koji parametre je najbolje podesiti
memo: 17. septembra 2025. izmenjeno do ovode. Danas prijatelj je u VIP grupi rekao, na intjuviju je susreo 90% pitanja u planeti, ispitanik Baidu čak je direktno otvorio Ergeov put naprednog Java da intjuvira (on je na praksi u Baidu, već prešao na stalni (intjuvijanje za praksu ovde postavio)).

V. Mehanizam učitavanja klasa
45.🌟Jeste li upoznali sa mehanizmom učitavanja klasa? (dopuna)
Dodato 29. marta 2024
Upoznam.
Objekat operacije JVM je Class fajl, JVM učitava podatke o strukturi klase opisane u Class fajlu u memoriju, vrši verifikaciju, analizu i inicijalizaciju podataka, konačno pretvara u tipove koje JVM može direktno koristiti, ovaj proces se zove mehanizam učitavanja klasa.

Najvažnija tri koncepta su: učitavač klasa, proces učitavanja klasa i model dvostrukog roditeljskog delegiranja.
- Učitavač klasa: zadužen za učitavanje fajlova klasa, učitava fajlove klasa u memoriju, generiše Class objekte.
- Proces učitavanja klasa: uključuje učitavanje, verifikaciju, pripremu, analizu i inicijalizaciju itd. korake.
- Model dvostrukog roditeljskog delegiranja: kada učitavač klasa primi zahtev za učitavanje klase, delegira zahtev roditeljskom učitavaču da završi, rekurzivno sve do najvišeg učitavača, ako roditeljski učitavač ne može završiti zahtev za učitavanje, podređeni učitavač će pokušati sam da učita.
Pričaj o procesu učitavanja klasa?
Klasa od učitavanja u JVM do uklanjanja iz memorije, ceo životni vek se deli na sedam faza: učitavanje, verifikacija, priprema, analiza, inicijalizacija, korišćenje i uklanjanje. Verifikacija, priprema i analiza ove tri faze se zajedno zovu povezivanje.

Osim korišćenja i uklanjanja, to je proces učitavanja Java klasa. Ovih 5 faza obično teču redom, ali u slučaju dinamičkog povezivanja, faza analize se dešava nakon faze inicijalizacije.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Xiaomi letnja praksa kolege E prva runda intjuvijanjem: da li ste upoznali sa mehanizmom učitavanja klasa?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 3 Java back-end tehnološka prva runda intjuvijanjem: mehanizam učitavanja Java klasa, model dvostrukog roditeljskog delegiranja zašto se ovakav dizajnirao
memo: 24. septembra 2025. izmenjeno do ovode. Danas prijatelj je na planeti objavio post kaže da je dobio ponudu JD, posebno se zahvalio Pai SmartRAG ovom projektu, zaista čestitam!

46.Koje učitavače klasa ima?
Uglavnom četiri vrste:
①, Pokretački učitavač klasa (Bootstrap ClassLoader), zadužen za učitavanje core biblioteka JVM, kao rt.jar i druge core biblioteke smeštene u JAVA_HOME/jre/lib direktorijumu.
②, Učitavač ekstenzija klasa (Extension ClassLoader), zadužen za učitavanje biblioteka smeštenih u JAVA_HOME/jre/lib/ext direktorijumu, ili na lokacijama specificiranim sistemskim svojstvom java.ext.dirs, implementira ga sun.misc.Launcher$ExtClassLoader.
③, Aplikativni učitavač klasa (Application ClassLoader), zadužen za učitavanje biblioteka classpath, implementira ga sun.misc.Launcher$AppClassLoader.
Sve klase koje napišemo učitava aplikativni učitavač klasa, osim ako eksplicitno koristimo prilagođeni učitavač klasa.
④, Korisnički prilagođeni učitavač klasa, obično se koristi za učitavanje klasa sa mreže, izvršavanje hot deploy (dinamičko učitavanje i zamenjivanje komponenata aplikacije), ili iz bezbednosnih razloga, učitavanje klasa iz različitih izvora.
Implementira se nasleđivanjem java.lang.ClassLoader klase.
Ko izvršava učitavanje klasa?
Učitavanje klasa izvršavaju učitavači klasa, JVM ima tri važna učitavača klasa: pokretački učitavač klasa, učitavač ekstenzije klasa, aplikativni učitavač klasa. Oni slede mehanizam dvostrukog roditeljskog delegiranja.

Šta je učitavač klasa?
Učitavač klasa je komponenta unutar JVM. Kada se JVM pokrene, u memoriji će kreirati nekoliko instanci učitavača klasa, uloga ovih učitavača je da na osnovu imena klase pronađe odgovarajući .class fajl, pročita sadržaj bajtkoda, zatim prosledi JVM za analizu i inicijalizaciju.

47.Možeš li pričati o životnom veku klase?
Jedna klasa od učitavanja u memoriju virtuelne mašine do uklanjanja iz memorije, ceo životni vek prolazi kroz sedam faza: učitavanje, verifikacija, priprema, analiza, inicijalizacija, korišćenje i uklanjanje.

48.🌟Jeste li upoznali sa procesom učitavanja klasa?
Preporučeno čitanje: Jednim člankom konačno razumej mehanizam učitavanja Java klasa
Znam.
Proces učitavanja klasa uključuje tri faze: učitavanje, povezivanje i inicijalizacija.
①, Učitavanje: učitava binarni bajtkod klase u memoriju.
②, Povezivanje se može detaljno podeliti na tri manje faze:
- Verifikacija: proverava da li format fajla klase odgovara specifikaciji JVM
- Priprema: dodeljuje memoriju statičkim promenljivim klase i postavlja podrazumevane vrednosti.
- Analiza: zamenjuje simboličke reference direktnim referencama.
③, Inicijalizacija: izvršava statički blok koda i inicijalizaciju statičkih promenljivih.
U fazi pripreme, statičke promenljive su već dodeljene podrazumevane početne vrednosti, u fazi inicijalizacije, statičke promenljive će biti dodeljene vrednosti koje kod očekuje. Na primer static int a = 1;, u fazi pripreme, vrednost a je 0, u fazi inicijalizacije, vrednost a je 1.
Drugi rečima, faza inicijalizacije izvršava konstruktor klase, tj. <clinit>() koji se vidi u javap.
Šta JVM radi tokom procesa učitavanja?

- Dobavljanje binarnog toka podataka ovakve klase kroz pun kvalifikovano ime klase.
- Pretvaranje statičke strukture ovog toka podataka u strukturu podataka za izvršavanje u metodskom regionu.
- Generisanje
java.lang.Classobjekta koji predstavlja ovu klasu u memoriji, kao ulazni tačku za pristup ovoj klasi.
- Generisanje
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Xiaomi letnja praksa kolege E prva runda intjuvijanjem: da li ste upoznali sa mehanizmom učitavanja klasa?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 16 letnja praksa prva runda intjuvijanjem: pričaj o procesu učitavanja klasa, model dvostrukog roditeljskog delegiranja, benefite dvostrukog roditeljskog delegiranja
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 18 Chengdu domaćina intjuvijanjem: proces učitavanja klasa
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Kuaishou kolege 4 prva runda intjuvijanjem: proces izvršavanja učitavanja klasa? Šta je model dvostrukog roditeljskog delegiranja? Zašto koristiti ovaj model?
memo: 17. januara 2025. izmenjeno do ovode.
49.🌟Šta je model dvostrukog roditeljskog delegiranja?
Model dvostrukog roditeljskog delegiranja zahteva da učitavač klasa prvo delegira roditeljski učitavač da pokuša učitati, tek kada roditeljski učitavač ne može učitati, podređeni učitavač će učitati.

Ovaj proces se kontinuirano rekurzivno navise, tj. od podređenog učitavača do roditeljskog učitavača, zatim do višeg učitavača, sve do najvišeg pokretačkog učitavača klasa.
Pokretački učitavač klasa će pokušati učitati ovu klasu. Ako je u mogućnosti da učita ovu klasu, direktno će vratiti; ako ne može učitati ovu klasu, vratiće zadatak učitavanja podređenom učitavaču koji ga je delegirao.
Podređeni učitavač pokušava učitati ovu klasu. Ako podređeni učitavač takođe ne može učitati ovu klasu, nastaviće da prenosi ovaj zadatak učitavanja niže, i tako redom.
Sve dok jedan učitavač može učitati ovu klasu, ili svi učitavači ne mogu učitati ovu klasu, konačno se baca ClassNotFoundException.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Xiaomi letnja praksa kolege E prva runda intjuvijanjem: da li ste upoznali sa mehanizmom učitavanja klasa?
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Alibaba Cloud intjuvijanjem kolege 22 intjuvijanjem: mehanizam dvostrukog roditeljskog delegiranja
49.Zašto koristiti model dvostrukog roditeljskog delegiranja?
①, Izbegava duplo učitavanje klasa: klase koje je roditeljski učitavač učitao, podređeni učitavač ne treba ponovo učitavati.
②, Garantuje bezbednost core biblioteka: kao java.lang.* može učitati samo Bootstrap ClassLoader, sprečava falsifikovanje.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Meituan intjuvijanjem kolege 16 letnja praksa prva runda intjuvijanjem: pričaj o procesu učitavanja klasa, model dvostrukog roditeljskog delegiranja, benefite dvostrukog roditeljskog delegiranja
50.Kako razbiti mehanizam dvostrukog roditeljskog delegiranja?
Preklopiti loadClass() metod ClassLoader.
Ako ne želite da razbijete model dvostrukog roditeljskog delegiranja, preklopite findClass() metod u ClassLoader klasi, klase koje roditeljski učitavač ne može učitati će se konačno učitati kroz ovaj metod.
memo: 18. januara 2025. izmenjeno do ovode.
51.Koji su tipični primeri razbijanja dvostrukog roditeljskog delegiranja?
Znam dva:
- Prvi: mehanizam SPI učitava JDBC drajver.
- Drugi: framework hot deploy.

Pričaj o SPI mehanizmu?
SPI je mehanizam ekspanzije Java, koristi se za učitavanje i registraciju biblioteka trećih strana, čest u JDBC, JNDI itd. framework.
Model dvostrukog roditeljskog delegiranja daje prednost roditeljskom učitavaču za učitavanje klasa, dok SPI zahteva dinamičko učitavanje implementacija u podređenom učitavaču.
Prema modelu dvostrukog roditeljskog delegiranja, java.sql.Driver klasu treba učitati roditeljski učitavač, ali roditeljski učitavač ne može učitati klase implementacije definisane u podređenom učitavaču, kao com.mysql.cj.jdbc.Driver od MySQL.
Stoga može samo koristiti SPI mehanizam kroz META-INF/services fajl da specificira implementaciju servisnog providera.
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Enumeration<Driver> drivers = ServiceLoader.load(Driver.class, cl).iterator();DriverManager koristi kontekstni učitavač klase niti da učita implementaciju SPI, time omogućava podređenom učitavaču da učita konkretne JDBC drajvere.
Pričaj o hot deploy?
Hot deploy znači ažuriranje koda aplikacije bez restartovanja servera, treba zameniti staru verziju klase, ali stara verzija klase može biti učitana od roditeljskog učitavača.
Kao što je Spring Boot DevTools obično koristi prilagođene učitavače klasa, prioritentno učitava nove verzije klasa.
memo: 16. avgusta 2025. izmenjeno do ovode. Danas dok sam pomagao prijatelju da menja biografiju, dobio sam ovu povratnu informaciju: koristio Tehnički stil na letnjoj praksi, takođe me je molio da mu promenim biografiju, konačno je uspešno dobio praksu u Hello, vrlo hvala.

52.Jeste li upoznali sa mehanizmom učitavanja klasa Tomcat?
Upoznam.
Tomcat na osnovu modela dvostrukog roditeljskog delegiranja proširuje, glavni učitavači klasa su:
- Bootstrap ClassLoader: učitava core biblioteke Java;
- Catalina ClassLoader: učitava core biblioteke Tomcat;
- Shared ClassLoader: učitava deljene biblioteke, dozvoljava više Web aplikacija da dele određene biblioteke;
- WebApp ClassLoader: učitava biblioteke Web aplikacija, podržava izolaciju više aplikacija i prioritentno učitava biblioteke definisane od aplikacije (razbijanje modela dvostrukog roditeljskog delegiranja).

53.Kako misliš da treba realizovati funkciju hot deploy?
Hot deploy znači dinamičko učitavanje, ažuriranje ili uklanjanje komponenata aplikacije bez restartovanja servera, kao klase, fajlove konfiguracije itd.
Treba realizovati ponovno učitavanje klasa na osnovu učitavača klasa.
Moja ideja je:
Prvi korak, koristi mehanizam monitoringa fajlova, kao Java NIO WatchService za monitoring promena fajlova klasa ili konfiguracijskih fajlova. Kada se otkrije promena fajla, pokreće proces hot deploy.
class FileWatcher {
public static void watchDirectoryPath(Path path) {
// Proveri da li je putanja važeći direktorijum
if (!isDirectory(path)) {
System.err.println("Provided path is not a directory: " + path);
return;
}
System.out.println("Starting to watch path: " + path);
// Dobija WatchService fajl sistema
try (WatchService watchService = path.getFileSystem().newWatchService()) {
// Registruj direktorijum servis monitoringa, monitoring kreiranja, izmene i brisanja događaja
path.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
while (true) {
WatchKey key;
try {
// Blokira dok se ne desi događaj
key = watchService.take();
} catch (InterruptedException e) {
System.out.println("WatchService interrupted, stopping directory watch.");
Thread.currentThread().interrupt();
break;
}
// Obrada događaja
for (WatchEvent<?> event : key.pollEvents()) {
processEvent(event);
}
// Resetuje key, ako ne uspe, izlazi
if (!key.reset()) {
System.out.println("WatchKey no longer valid. Exiting watch loop.");
break;
}
}
} catch (IOException e) {
System.err.println("An error occurred while setting up the WatchService: " + e.getMessage());
e.printStackTrace();
}
}
private static boolean isDirectory(Path path) {
return Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS);
}
private static void processEvent(WatchEvent<?> event) {
WatchEvent.Kind<?> kind = event.kind();
// Obrada tipa događaja
if (kind == OVERFLOW) {
System.out.println("Event overflow occurred. Some events might have been lost.");
return;
}
@SuppressWarnings("unchecked")
Path fileName = ((WatchEvent<Path>) event).context();
System.out.println("Event: " + kind.name() + ", File affected: " + fileName);
}
public static void main(String[] args) {
// Postavi monitoring putanju na trenutni direktorijum
Path pathToWatch = Paths.get(".");
watchDirectoryPath(pathToWatch);
}
}Drugi korak, kreira prilagođeni učitavač klasa, nasleđuje java.lang.ClassLoader, i preklopi findClass() metod, za učitavanje novih fajlova klasa.
class HotSwapClassLoader extends ClassLoader {
public HotSwapClassLoader() {
super(ClassLoader.getSystemClassLoader());
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// Učitaj bajtkod fajla klase sa specifikirane putanje
byte[] classBytes = loadClassData(name);
if (classBytes == null) {
throw new ClassNotFoundException(name);
}
// Pozovi defineClass da pretvori bajtkod u Class objekat
return defineClass(name, classBytes, 0, classBytes.length);
}
private byte[] loadClassData(String name) {
// Implementiraj učitavanje bajtkoda fajla klase iz fajl sistema ili drugog izvora
// ...
return null;
}
}Prijateljska podsetka: Intellij IDEA pruža funkcionalnost hot deploy, kada izmenimo kod, IDEA će automatski sačuvati i kompajlirati, ako je Web projekat, možeš u Chrome pregledniku instalirati LiveCounter plugin, nakon kompilacije stranica će automatski osvežiti da vidiš najnovije efekte. Za testiranje ili otklanjanje grešaka, vrlo je pogodno.
- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Xiaomi letnja praksa kolege E prva runda intjuvijanjem: da li znaš za ažuriranje klase?
54.Pričaj o razlici između interpretativnog i kompajliranog izvršavanja (dopuna)
Dodato 8. marta 2024
Prvo pričajmo o razlici između interpretacije i kompajliranja:
- Interpretacija: prevodi izvorni kod vrstu po vrstu u mašinski kod.
- Kompajliranje: prevodi izvorni kod jednom u mašinski kod.
Jedna je vrsta po vrsti, jednom je jednom, još pričajmo o razlici između interpretativnog i kompajliranog izvršavanja:
- Interpretativno izvršavanje: tokom izvršavanja programa, prevodi izvorni kod vrstu po vrstu u mašinski kod, zatim izvršava.
- Kompajlirano izvršavanje: pre pokretanja programa, prevodi izvorni kod jednom u mašinski kod, zatim izvršava.
Java se obično naziva "interpretativni jezik", jer Java kod pre izvršavanja treba prvo kompajlirati u bajtkod, zatim tokom izvršavanja, interpreter JVM "vrstu po vrstu" prevodi bajtkod u mašinski kod, zatim izvršava.
To je takođe glavni razlog zbog kojeg se Java smatra "sporom".
Ali pojava JIT-a razbiova ovu stereotipnu ideju, JVM će kompajlirati vrući kod (kod visoke frekvencije izvršavanja) i staviti u CodeCache, sledeći put kada susretne ovaj kod, može direktno čitati mašinski kod iz CodeCache, zatim izvršavati.
Time se efikasnost izvršavanja Java značajno poboljšala.

- Vodič za Java intjuviju (plaćeno) uključuje originalno pitanje Tencent Java back-end intjuvijanjem prva runda intjuvijanjem: pričaj o procesu interpretativnog izvršavanja Java.
memo: 21. januara 2025. izmenjeno do ovode.
Preokret intjuvijanja JVM deo druga verzija je konačno organizovan, reći ću malo iz srca.

Zapravo, na internetu postoji mnogo znanja za pamćenje, time možete svim pružiti više izbora, ali kvalitet Preokreta intjuvijanja ko je "poznatima poznat" svi znaju.

Druga verzija Preokreta intjuvijanja je na osnovu početne verzije gosta Sanfena iz planete, dodala sam Ergeova razmišljanja, uključila više od 1000 stvarnih iskustava intjuvijanja, i od 24. do 25. generacije, pomogla mnogim prijateljima. 26. i 27. generacija će takođe imati koristi, time će dobiti željenu ponudu.
Mogu vam pomoći, vrlo sam zadovoljan, i u procesu rekonstrukcije Preokreta intjuvijanja, sam mnogo naučio, mnoge slabije osnove su ojačane.



Često mislim, ja sam mirna osoba, ne volim da se nadmeću s drugim, i ne volim namerno da promovišem svoja dela.
Volim da čekam da cvetanje događa.
Ako smatraš da Preokret intjuvijanja nije loš, možeš reći mlađim kolegama i drugaricama da postoji ovaj besplatan materijal za učenje, pomozi mi da stvorim reputaciju.
Još uvek ću nastaviti da optimišem, nisam siguran kada će doći treća verzija, ali ću učiniti sve što mogu.
Želim svima svetlu budućnost.
Ovaj put i dalje tri verzije, svetla, tamna i epub verzija. Pokazaćemo jednu epub verziju, nekim prijateljima je vrlo potrebna ova verzija, takođe sam ih zadovoljio.

Uključio sam Ergeov put naprednog Java, put naprednog JVM, put naprednog konkurentnog programiranja, kao i sve verzije Preokreta intjuvijanja, pokriva 16 velikih tema uključujući Java osnove, Java kolekcije, Java konkurentnost, JVM, Spring, MyBatis, računarske mreže, operativne sisteme, MySQL, Redis, RocketMQ, distribuisane sisteme, mikroservise, dizajn pattern, Linux itd., ukupno više od 400.000 reči, više od 2000+ ručno crtanih crteža, može se reći da je iskrenost puna.
Detaljnih 54 pitanja Java virtuelne mašine za intjuviju visokog frekvencija, ovaj intjuvij, sigurno ćeš pretući ispitanika, organizovao: Chenmo Wang Er, klikni na link preuzimanja, autor: Sanfen, klikni na link originala.
Ništa me ne može zaustaviti – osim cilja, čak i ako na obali postoje ruže, hladna zacija, mirna luka, ja sam brod bez veze.
Serija sadržaja:
- Preokret intjuvijanja Java SE deo 👍
- Preokret intjuvijanja Java kolekcija deo 👍
- Preokret intjuvijanja Java konkurentno programiranje deo 👍
- Preokret intjuvijanja JVM deo 👍
- Preokret intjuvijanja Spring deo 👍
- Preokret intjuvijanja Redis deo 👍
- Preokret intjuvijanja MyBatis deo 👍
- Preokret intjuvijanja MySQL deo 👍
- Preokret intjuvijanja Operativni sistem deo 👍
- Preokret intjuvijanja Računarska mreža deo 👍
- Preokret intjuvijanja RocketMQ deo 👍
- Preokret intjuvijanja Distribuisani sistem deo 👍
- Preokret intjuvijanja Mikroservisi deo 👍
- Preokret intjuvijanja Dizajn pattern deo 👍
- Preokret intjuvijanja Linux deo 👍
- Preokret intjuvijanja OpenClaw deo 👍
- Preokret intjuvijanja Skills deo 👍
