JavaRush /Java блогу /Random-KY /Javaдагы таштанды жыйноочу
Diana
Деңгээл

Javaдагы таштанды жыйноочу

Группада жарыяланган

Таштанды жыйноочунун жүрүм-турум сызыгы (эстутумду калыбына келтирүүчү)

Java программистине эстутумдун бөлүштүрүлүшүн көзөмөлдөөнүн кереги жок, анткени таштанды жыйноочу эстутумду автоматтык түрдө башкарат. Таштанды жыйноочу Java Virtual Machine (JVM) тарабынан башкарылат. Таштанды жыйноочу - мезгил-мезгor менен иштеген жана керексиз an objectтер колдонгон эстутумду калыбына келтирүүчү төмөнкү артыкчылыктуу процесс. Ар кандай JVMтерде таштанды чогултуу алгоритмдери бар. Колдонулган бир нече алгоритмдер бар, мисалы: шилтемени эсептөө алгоритми же белгилөө жана кыруу алгоритмдери.Таштанды чыгаруу - 1

Java-да таштанды жыйноочу иштеп жатат

JVM адатта бош эстутум аз болгондо таштанды жыйгычты иштетет. Бирок таштанды жыйноочуну иштетүү ар дайым бош эстутум жетиштүү деп кепилдик бере алbyte. Эгерде калыбына келтирилгенден кийин да эстутум жетишсиз болсо, JVM OutOfMemoryError өзгөчөлүгүн ыргытат. Эскерте кетсек, JVM таштанды жыйгычты жок дегенде бир жолу иштетиши керек. Сиз таштанды жыйгычтан Java'да иштешин сурансаңыз болот, бирок бул аракетти мажбурлай албайсыз.

Таштанды жыйгычты иштетүү өтүнүчү

Сурам жасоо үчүн төмөнкү ыкмалардын бирине чалсаңыз болот:
System.gc()
Runtime.getRuntime().gc()

Таштанды жыйноочуну иштетүүгө ылайыктуу

Объект жандуу агым үчүн жеткorктүү болбой калганда утилдештирorши керек. Объект ар кандай учурларда тескөөгө алынышы мүмкүн:
  • Объектке шилтеме берген шилтеме түрүндөгү өзгөрмө "0" деп коюлса, an objectке башка шилтемелер жок болсо, аны жок кылуу керек.
  • Эгерде an objectке шилтеме кылуучу шилтеме түрүндөгү өзгөрмө башка an objectке шилтеме кылуу үчүн түзүлсө, an objectке башка шилтемелер жок болсо, аны жок кылуу керек.
  • Методдо локалдык түрдө түзүлгөн an objectтер, эгерде алар ошол ыкмадан экспорттолбосо (б.а. кайтарылбаса же өзгөчө учур катары ыргытылбаса) метод чыкканда жокко чыгарылат.
  • Бири-бирине шилтеме берген an objectтер, эгерде алардын бири да жандуу жипте жок болсо, утилдештирorши мүмкүн.
Келгиле, бир мисал карап көрөлү:
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, башында o1 көрсөткүчү шилтеме кылган an objectти (бүтүн сан) 3-саптан кийин жоюуга болот, анткени o1 азыр an objectке String(сапка) тиешелүү. o2 нөлгө кайрылуу үчүн түзүлгөнүнө карабастан, an object String(сап) кайра иштетилбейт, анткени o1 ага тиешелүү.

Аяктоо

finalize()Java технологиясы таштанды жыйноочу an objectти эс тутумдан чыгарып алганга чейин керектүү тазалоону жүргүзүү үчүн ыкманы колдонууга (аяктоо) мүмкүндүк берет . Бул ыкма таштанды жыйноочу an objectке дагы шилтемелер жок экенин аныктаганда таштанды жыйноочу тарабынан чакырылат. Бул класста сүрөттөлөт Object, башкача айтканда, ал бардык класстар тарабынан мураска алынган. Субкласс finalize()өзүн система ресурстарынан бошотуу же башка тазалоо ыкмасын жокко чыгарат:
protected void finalize() throws Throwable
Эгер каттоодон өтпөгөн өзгөчөлүк ыкмасы менен ыргытылса finalize(), өзгөчө жагдай этибарга алынbyte жана ал an objectтин жыйынтыкталуусу токтойт. Метод finalize()an objectтин иштөө мезгorнде бир гана жолу чакырылат. finalize()Ар кандай an objectиде аны утилдештирүүдөн коргоо ыкмасын колдонууга болот . finalize()Бирок бул учурда таштанды жыйноочу бул an object үчүн иштетилбейт . Объект таштанды чогултулганга чейин метод finalize()дайыма бир жолу чакырылат. Бирок, бул ыкма берилген an object үчүн анын бар болгон бүткүл мөөнөтүнүн ичинде иштетилбей калышы мүмкүн finalize(), анткени ал утилдештирүүгө жатпайт.

Жыйынтык

Бул бөлүмдө биз Java тorндеги эс тутумду башкаруу ыкмасы болгон таштанды чогултуу процессин карадык. Таштанды чогултууга мажбурлоо мүмкүн эмес. Объекттерди кайра иштетүүгө жарамдуу кылуунун ар кандай жолдору менен тааныштык жана бул ыкма finalize()an object таштанды жыйноочу тарабынан калыбына келтирилгенге чейин колдонулаарын билдик.

Көнүгүү

Суроо: 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 Түшүндүрмө: 1, 2 жана 3-саптарда түзүлгөн үч an objectтин ичинен an object гана Integerутилдештирorши керек. 7-саптын аягы. Өзгөрмө шилтемелери, а, алгач an objectке шилтеме кылган , 5-саптагы Integeran objectке шилтеме кылат. Ошентип, an object 5-саптан кийин жок кылынышы керек, анткени ага шилтеме берген өзгөрмөлөр жок. Өзгөрмөлөр жана 6 жана 7-саптардагы an objectтерге жана an objectтерге кайрылыңыз , ошондуктан аларды кайра иштетүүгө болбойт.StringIntegerbcStringLong
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION