Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 12807|Válasz: 0

[JavaSE] Szerezzen mélyreható ismereteket a Java szemétgyűjtő mechanizmusáról

[Linket másol]
Közzétéve 2017. 12. 04. 20:26:51 | | |
1. A hulladékújrahasznosítási mechanizmus jelentősége  
A Java nyelv egyik figyelemre méltó jellemzője a szemétgyűjtő mechanizmus bevezetése, amely megoldja a C++ programozók legproblémásabb memóriakezelési problémáját, így a Java programozóknak már nem kell a memóriakezelést figyelembe venniük programíráskor. A szemétgyűjtő mechanizmus miatt a Java objektumaiban már nem szerepel a "scope" fogalmával, csak az objektum referencia rendelkezik "scope"-tal.A szemétgyűjtés hatékonyan megakadályozza a memória szivárgását, és hatékonyan használja az üres memóriát.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmusok a szemétgyűjtő mechanizmusokban  
A Java nyelvi specifikáció nem határozza meg kifejezetten, hogy melyik szemétgyűjtő algoritmust használja a JVM-ben, de bármely szemétgyűjtő algoritmusnak általában két alapvető dolgot kell elvégeznie: (1) haszontalan információs objektumok megtalálása; (2) Visszaszerezze a haszontalan objektumok által elfoglalt memóriateret, hogy a program újra felhasználhassa.
1. Referencia Számoló Gyűjtő
1.1 Algoritmuselemzés

A referenciaszámítás korai stratégia a szemétgyűjtőknél. Ebben a megközelítésben minden objektumpéldány esetén a halomban van egy hivatkozási szám. Amikor egy objektumot létrehoznak, és az objektumpéldányt egy változóhoz rendelik, a változószám 1-re van állítva. Ha bármely más változót hozzárendelünk hivatkozásként ehhez az objektumhoz, a számot 1-gyel adják össze (a = b, akkor a b által hivatkozott objektum számlálója +1), de ha egy objektumpéldány hivatkozása túllépte az élettartamát vagy új értékre állítják be, az objektum referenciaszámlálóját 1-gyel vonják le. Bármely objektum, amelynek a referenciaszámlálója 0, szemétként gyűjthető össze. Ha egy objektumpéldányt szemétgyűjtenek, bármely objektum példányának referenciaszámlálója mínusz 1.
1.2 Előnyök és hátrányok
Érdem:

A referencia számgyűjtő nagyon gyorsan végrehajtható, beépítve a program futásába. Előnyös valós idejű környezetekben, ahol a programokat nem kell hosszú időre megszakítani.
Hiány:

Körkörös hivatkozások nem észlelhetők. *Ha a szülő objektum hivatkozik egy gyermekobjektumra, akkor a gyermekobjektum is hivatkozik a szülőobjektumra. Így a hivatkozások száma soha nem lehet 0.
1.3 A referenciaszámláló algoritmus nem tudja megoldani a körkörös referencia problémát, például:
/** * Java学习交流QQ群:589809992 我们一起学Java! */public class Main {    public static void main(String[] args) {        MyObject object1 = new MyObject();        MyObject object2 = new MyObject();        object1.object = object2;        object2.object = object1;        object1 = null;        object2 = null;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  
Az utolsó két mondat nullhoz rendeli az objektum1 és az objektum2 objektumot, ami azt jelenti, hogy az objektum1 és az objektum2 által mutatott objektumok már nem elérhetők, de mivel egymásra utalnak, a referenciaszámlálóik nem 0, így a szemétgyűjtő soha nem fogja újrahasznosítani őket.
2. A Tracker Collector vagy a mark and sweep algoritmus
2.1 Gyökérkereső algoritmus


A gyökérkeresési algoritmust a diszkrét matematika gráfelméletéből vezetik be, a program minden referenciakapcsolatot gráfként kezel, egy GC ROOT csomóponttól kezdve, a megfelelő referencia csomópontot keresve, miután megtaláljuk ezt a csomópontot, és folytatjuk a hivatkozási csomópont keresését, amikor az összes referenciacsomópontot kerestük, a megmaradt csomópontokat nem hivatkozott csomópontoknak, azaz haszontalan csomópontoknak tekintik.
Java, amely GC Rootként használható
1. A virtuális gép veremben hivatkozott objektumok (helyi változók táblázata)
2. A statikus attribútumhoz hivatkozott objektum a metódus területén
3. Az objektum, amelyet a konstans a metódus területén idéz
4. Hivatkozott objektumok a helyi metódusveremben (natív objektumok)
2.2 A követési algoritmus sématikus diagramja

2.3 A marker-tisztítási algoritmus elemzése

A címké-törlési algoritmus a gyökérgyűjteményből szkennel, megjelöli a megmaradt objektumokat, majd az egész területet átvizsgálja, hogy címkézetlen objektumokat újrahasznosítsanak, ahogy azt a fenti ábrán látható. A címké-tisztítási algoritmusnak nem kell tárgyakat mozgatnia, csak a nem túlélő objektumokat dolgozza fel, ami rendkívül hatékony, ha sok objektum van, de mivel a címké-törlési algoritmus közvetlenül újrahasznosítja a nem túlélő objektumokat, memória töredezettséget okoz.
3. Tömörítő vagy címkézési algoritmus


A tag-finish algoritmus ugyanazt a módszert használja, mint a tag-clear algoritmus az objektumok címkézéséhez, de a tisztításkor más, miután visszafoglalja a nem túlélő objektumok helyét, az összes túlélő objektumot áthelyezi a bal oldali szabad helyre, és frissíti a megfelelő mutatót. A címké-befejezés algoritmus a címké-tisztítás algoritmuson alapul, és tárgyakat mozgat, így drágább, de megoldja a memória töredezettség problémáját. A tömörítő algoritmus alapján történő gyűjtők megvalósításában általában hozzáadják a fogantyúkat és kezelőtáblákat.
4. Másolási algoritmus (Kompaktáló gyűjtő)


Az algoritmus célja, hogy leküzdje a fogantyú túlterhelését, és megoldja a kupac hulladékgyűjtését. Amikor az objektum tele van, a másolási algoritmus alapján működő szemétgyűjtő átvizsgálja az aktív objektumot a gyökérhalmazból, és minden aktív objektumot lemásol a szabad arcra (így nem legyenek szabad lyukak az aktív objektum által elfoglalt memóriák között), így a szabad felület az objektum arcává, az eredeti objektum arca a szabad arc, és a program a memória az új objektum oldalán oszt ki. A kezelési algoritmuson alapuló tipikus hulladékgyűjtés a stop-and-copy algoritmus, amely a halmot objektumarcokra és szabad területfelületekre osztja, és a program megállítja a végrehajtást az objektum és szabad terület lapok közötti váltás során.
5. Generációs gyűjtő


A generációs hulladék-újrahasznosítási stratégia azon a tényen alapul, hogyA különböző tárgyak életciklusa eltérő。 Ezért a különböző életciklusú tárgyak eltérő újrahasznosítási algoritmusokat alkalmazhatnak az újrahasznosítás hatékonyságának javítása érdekében.
Fiatal generáció
1. Minden újonnan generált objektumot először a fiatalabb generációhoz helyezünk. A fiatalabb generáció célja, hogy a lehető leggyorsabban összegyűjtsék azokat a rövid életciklusú tárgyakat.

2. Az új generációs memória egy Éden-régióra és két túlélő (túlélő0, túlélő1) zónára van osztva, az 8:1:1 arányban. Egy Eden zóna, két Survivor zóna (általában). A legtöbb tárgy az Eden környékén jelenik meg. Amikor a túlélő0 terület is tele van, az eden és a survivor 0 terület másolódik egy másik túlélő1 területre, majd az eden és a survivor0 terület ürül, majd a survivor0 terület üres, majd a túlélő0 terület és a túlélő1 terület felcserélődik. Vagyis a túlélő 1 területet üresen tartsd, és így tovább.

3. Amikor a túlélő 1 terület nem elegendő az Eden és Survivor0 megmaradt tárgyainak tárolására, a túlélő tárgyakat közvetlenül a régi korszakba raktározzák. Ha az öregkor is tele van, akkor az teljes GC-t indít el, vagyis az új generációt és az öregeket újrahasznosítják

4. Az új generáció GC-jét Minor GC-nek is nevezik, és a MinorGC gyakorisága viszonylag magas (nem feltétlenül aktiválódik, amikor az Eden területe megtelt).
Régi generáció

1. Azok a tárgyak, amelyek még életben maradnak, miután a fiatalabb generációban N hulladékhulladék újrahasznosítást tapasztaltak, az idősebb generációba kerülnek. Ezért tekinthető, hogy az öreg generáció bizonyos tárgyakban tárolódik, hosszú életciklussal rendelkezik.

2. Az emlékezet sokkal nagyobb, mint az új generációé (a közelítő arány 1:2), amikor az időskor memóriája betölt, akkor a Fő GC aktiválódik, vagyis a teljes GC, a teljes GC gyakorisága viszonylag alacsony, az öregkorú objektum túlélési ideje viszonylag hosszú, és a túlélési arány magas.
Állandó generáció
Statikus fájlok tárolására használják, például Java osztályok, metódusok stb. A tartós generációk nem befolyásolják jelentősen a szemétgyűjtést, de egyes alkalmazások dinamikusan generálhatnak vagy hívhatnak bizonyos osztályokat, például Hibernate stb., és ebben az esetben viszonylag nagy, állandó generációs teret kell beállítani ezeknek az új osztályoknak a futás alatt.
3. GC (szemétgyűjtő)Az új generációs gyűjtők által használt gyűjtők: Serial, PraNew, Parallel Scavenge
Az időskori gyűjtők által használt gyűjtők: Serial Old, Parallel Old, CMS

Soros gyűjtő (replikációs algoritmus)
Az új generációs egyszálas gyűjtők, a jelölés és tisztítás egyszálúak, előnye az egyszerűség és hatékonyság.
Sorozatos régi gyűjtő (Label-Finish algoritmus)
Öregkorú egyszálas gyűjtő, idős korú sorozatgyűjtő verzió.
ParNew gyűjtő (megállító másolási algoritmus)
Az új generációs gyűjtő a Serial collector többszálas változatának tekinthető, amely jobb teljesítményt nyújt, mint a Serial egy többmagos CPU környezetben.
Párhuzamos gyűjtő (stop-másolási algoritmus)
Párhuzamos gyűjtők nagy áteresztőképességhez és hatékony CPU használathoz. Az áteresztőképesség általában 99%, és az áteresztőképesség = felhasználói szálidő / (felhasználói szálidő + GC szálidő). Olyan háttéralkalmazásokhoz is alkalmas, amelyek nem igényelnek nagy interakciót.
Párhuzamos régi gyűjtő (megállító másolat algoritmus)
A Parallel Scavenge gyűjtő régebbi változata, egy párhuzamos gyűjtő, áteresztőképességi prioritással
CMS (Egyidejű Jellefonó) Gyűjtő (Mark-Clean algoritmus)
Magas egyidejű egyidejű időszak, alacsony szünet, a legrövidebb GC helyreállítási szünetidő, magas CPU-használat, gyors válaszidő, rövid szünetidő, és többmagos CPU magas válaszidőre törekedett
4. A GC megvalósítási mechanizmusaMivel a tárgyat különböző generációkon keresztül dolgozták fel, a szemétgyűjtés területe és ideje is eltérő. Kétféle GC létezik: Scavenge GC és Full GC.
Scavenge GC
Normál esetben, amikor új objektumot generálnak, és nem igényel helyet az Edenben, a Scavenge GC aktiválódik, ami GC-t tesz az Eden területére, megtisztítja a nem túlélő tárgyakat, és áthelyezi a túlélő tárgyakat a Survivor területre. Aztán rendezd el a Survivor két zónáját. A GC így az Eden környékén történik a fiatalabb generáció számára, és nem érinti az idősebb generációt. Mivel a legtöbb objektum az Eden környékéről indul, és az Eden területére nem osztanak túl sokat, az Eden terület GC-jét gyakran végzik. Ezért általában gyors és hatékony algoritmusokat kell alkalmazni, hogy Eden minél hamarabb szabaddá váljon.
Teljes általános összességszámítás
Szervezze meg az egész halmot, beleértve a Youngot, Tenured-t és Perm-t. A teljes GC lassabb, mint a Scavenge GC, mert az egész halom újrahasznosítását igényli, így a teljes GC-k számát a lehető legkevesebbre kell csökkenteni. A JVM hangolási folyamatának nagy része a FullGC hangolása. A teljes GC az alábbi okokból adódhat:
1. A végleges kinevezés teljes írásban van
2. A perm teljes írásban van  
3. A System.gc() hívásként jelenik meg  
4. A Halom tartomány allokációs stratégiája dinamikusan változik az utolsó GC után
5. A Java GC-vel szintén memóriaszivárgás problémákat okozhat1. A statikus gyűjtőosztályok, mint a HashMap, Vector stb. használata a leginkább hajlamos a memóriakiszivárgásra, és ezeknek a statikus változóknak az életciklusa megegyezik az alkalmazáséval, így minden objektum nem szabadulható fel, mert mindig a Vector és mások alkalmazzák őket.
Statikus vektor v = új vektor(); for (int i = 1; i<100; i++) { Object o = új Object();     v.add(o);     o = null; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
Ebben a példában van egy referencia v a Vector objektumra és egy referencia o az objektum objektumra a kódveremben. A For hurokban folyamatosan új objektumokat generálunk, majd hozzáadjuk őket a Vector objektumhoz, majd semlegesítjük az o hivatkozást. A kérdés az, hogy amikor az o referencia nullálódik, ha GC történik, újrahasznosítható-e a általunk létrehozott objektumot a GC? A válasz nem. Mert amikor a GC követi a hivatkozásokat a kódveremben, v hivatkozást talál, és ha tovább követed a követést, azt fogod találni, hogy a memóriatérben vannak hivatkozások Object objektumokra, amelyekre v hivatkozások mutatnak. Ez azt jelenti, hogy bár az o hivatkozást kiürítették, még mindig vannak más hivatkozások az objektumhoz, amelyek elérhetők, így a GC nem szabadíthatja fel őket. Ha e ciklus után az Object objektum nem hat a programra, akkor feltételezzük, hogy a Java programban memóriaszivárgás van.
2. Különböző kapcsolatok, adatbázis-kapcsolatok, hálózati kapcsolatok, IO kapcsolatok stb. nem mutatják a hívást közel-közel, és nem újrahasznosítják a GC-vel, ami memóriaszivárgást eredményez.
3. A hallgatók használata memóriakiszivárgást is okozhat, ha a hallgatót nem törölik az objektum kiengedése közben.




Előző:Az újoncok a CSS-ben játszanak némi fekete technológiával
Következő:Vigyázz a Wanke Cloud snap szoftvervírussal Trojanral!
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com