JavaRush /Блоги Java /Random-TG /Ҷамъоварии партов дар Java
Diana
Сатҳи

Ҷамъоварии партов дар Java

Дар гурӯҳ нашр шудааст

Хатти рафтори коллектори ахлот (барқароркунандаи хотира)

Ба барномасози Java лозим нест, ки тақсимоти хотираро назорат кунад, зеро коллектори ахлот хотираро ба таври худкор идора мекунад. Ҷамъоварии партов аз ҷониби Java Virtual Machine (JVM) идора карда мешавад. Ҷамъоварии партов як раванди афзалиятноки кам аст, ки давра ба давра кор мекунад ва хотираи аз ҷониби an objectҳое, ки дигар лозим нестанд, озод мекунад. JVM-ҳои гуногун алгоритмҳои гуногуни ҷамъоварии ахлот доранд. Якчанд алгоритмҳои истифодашуда мавҷуданд, масалан: алгоритми ҳисобкунии истинод ё алгоритмҳои аломатгузорӣ ва скрепинг.Ҷамъоварии партовҳо - 1

Ба кор андохтани коллектори ахлот дар Java

JVM одатан коллектори партовҳоро ҳангоми кам будани хотираи холӣ иҷро мекунад. Аммо кори коллектори партовҳо кафолат намедиҳад, ки хотираи ройгон ҳамеша кофӣ хоҳад буд. Агар ҳатто пас аз барқарорсозӣ хотираи кофӣ набошад, JVM истиснои OutOfMemoryError -ро мепартояд. Лутфан қайд кунед, ки JVM бояд ҳадди аққал як маротиба пеш аз партофтани истисно коллекторро иҷро кунад. Шумо метавонед аз коллектори ахлот дархост кунед, ки дар Java кор кунад, аммо ин амалро маҷбур карда наметавонед.

Дархост барои идора кардани коллектори ахлот

Барои дархост, шумо метавонед ба яке аз усулҳои зерин занг занед:
System.gc()
Runtime.getRuntime().gc()

Муносиб барои идора кардани коллектори партовҳо

Вақте ки он дигар барои ҷараёни зинда дастрас нест, an object бояд партофта шавад. Объект метавонад дар ҳолатҳои гуногун ихтиёрдорӣ карда шавад:
  • Агар тағирёбандаи навъи истинод, ки ба an object ишора мекунад, ба "0" муқаррар карда шуда бошад, an object бояд нобуд карда шавад, агар ба он истинодҳои дигар вуҷуд надошта бошанд.
  • Агар як тағирёбандаи навъи истинод, ки ба an object ишора мекунад, барои истинод ба an objectи дигар сохта шуда бошад, агар ба он истинодҳои дигар мавҷуд набошад, an object бояд партофта шавад.
  • Объектҳое, ки дар усул ба таври маҳаллӣ сохта шудаанд, ҳангоми баромадан аз усул хориҷ карда мешаванд, ба шарте ки онҳо аз ин усул содир карда нашаванд (яъне ҳамчун истисно баргардонида ё партофта шаванд).
  • Объектҳое, ки ба ҳамдигар ишора мекунанд, метавонанд ихтиёрдорӣ карда шаванд, агар ҳеҷ яке аз онҳо дар риштаи зинда дастрас набошад.
Биёед як мисолро дида бароем:
public class TestGC
  {
    public static void main(String [] args)
    {
      Object o1 = new Integer(3);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
Дар ин мисол Integer, an objectи (адади бутун), ки дар аввал аз ҷониби o1 истинод шудааст, метавонад пас аз сатри 3 партофта шавад, зеро o1 ҳоло ба an object String(сатр) ишора мекунад. Гарчанде ки o2 барои истинод ба нул сохта шудааст, an object String(сатр) дубора коркард намешавад, зеро o1 ба он ишора мекунад.

Анҷом

finalize()Технологияи Java ба шумо имкон медиҳад, ки пеш аз он ки коллектори ахлот an objectро аз хотира баргардонад, аз усули (ниҳоии) тозакунии зарурӣ истифода баред . Ин усул аз ҷониби коллектори ахлот дар an object даъват карда мешавад, вақте ки ҷамъкунандаи ахлот муайян мекунад, ки дигар истинод ба an object вуҷуд надорад. Ин дар синф тавсиф шудааст Object, ки маънои онро дорад, ки он аз ҷониби ҳама синфҳо мерос гирифта шудааст. Зерсинф усули finalize()озод шудан аз захираҳои система ё тозакунии дигарро бекор мекунад:
protected void finalize() throws Throwable
Агар истиснои сабтнашуда бо усули партофта шавад finalize(), истисно сарфи назар карда мешавад ва анҷом додани он an object қатъ мегардад. Усул finalize()танҳо як маротиба дар тӯли умри an object даъват карда мешавад. finalize()Дар ҳама гуна an object барои муҳофизат кардани он аз партов истифода бурдан мумкин аст . Аммо дар ин ҳолат, барои ин an object дигар партовгоҳ фаъол нест finalize(). Ин усул finalize()ҳамеша як маротиба пеш аз ҷамъоварии партовҳои an object даъват карда мешавад. Бо вуҷуди ин, мумкин аст, ки усул finalize()барои an objectи додашуда дар тӯли тамоми давраи мавҷудияти он фаъол карда нашавад, зеро он метавонад ихтиёрдорӣ карда нашавад.

Хулоса

Дар ин бахш мо раванди ҷамъоварии ахлотро дида баромадем, ки он як усули идоракунии хотира дар забони Java мебошад. Хошокро мачбур кардан мумкин нест. Мо дар бораи роҳҳои гуногуни қобor коркарди ашё фаҳмидем ва фаҳмидем, ки ин усул finalize()пеш аз баргардонидани ашё аз ҷониби коллектори ахлот истифода мешавад.

Машқ кунед

Савол: Пас аз сатри 7 чанд an object бояд ихтиёрдорӣ карда шавад?
public class TutorialGC
  {
    public static void main(String [] args)
    {
      Object a = new Integer(100);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
Вариантҳои ҷавоб: A. 0 B. 1 C. 2 D. 3 E. Рамзро тартиб додан мумкин нест Варианти дуруст: B Шарҳ: Аз се an objectе, ки дар сатрҳои 1, 2 ва 3 сохта шудаанд, танҳо an object Integerбояд дар партовгоҳ партофта шавад. охири сатри 7. Истинодҳои тағирёбанда, a, ки дар ибтидо ба an object истинод карда буд Integer, ба an object Stringдар сатри 5 ишора мекунад. Ҳамин тариқ, Integeran object бояд пас аз сатри 5 партофта шавад, зеро ҳеҷ гуна тағирёбандае вуҷуд надорад, ки ба он муроҷиат мекунанд. Тағйирёбандаҳо bва cба an objectҳо Stringва Longan objectҳо дар сатрҳои 6 ва 7 ишора мекунанд, бинобар ин онҳо дубора истифода намешаванд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION