JavaRush /Java блогы /Random-KK /Java тіліндегі қоқыс жинағыш
Diana
Деңгей

Java тіліндегі қоқыс жинағыш

Топта жарияланған

Қоқыс жинаушының әрекет сызығы (жадты қалпына келтіруші)

Java бағдарламашысына жадтың бөлінуін бақылаудың қажеті жоқ, себебі қоқыс жинағыш жадты автоматты түрде басқарады. Қоқыс жинағышты Java виртуалды машинасы (JVM) басқарады. Қоқыс жинағыш - мерзімді түрде орындалатын және қажет емес нысандар пайдаланатын жадты қалпына келтіретін басымдығы төмен процесс. Әртүрлі JVM-де қоқыс жинаудың әртүрлі алгоритмдері бар. Қолданылатын бірнеше алгоритмдер бар, мысалы: сілтемелерді санау алгоритмі немесе белгілеу және сызып тастау алгоритмдері.Қоқыс жинау – 1

Java-да қоқыс жинағышты іске қосу

JVM әдетте бос жады аз болған кезде қоқыс жинағышты іске қосады. Бірақ қоқыс жинағышты іске қосу әрқашан бос жадтың жеткілікті болатынына кепілдік бермейді. Қалпына келтіруден кейін де жад жеткіліксіз болса, JVM OutOfMemoryError ерекшелігін шығарады. Ерекше жағдайды шығармас бұрын JVM қоқыс жинағышты кемінде бір рет іске қосуы керек екенін ескеріңіз. Сіз қоқыс жинағышты Java тілінде іске қосуды сұрай аласыз, бірақ бұл әрекетті мәжбүрлей алмайсыз.

Қоқыс жинағышты іске қосуды сұрау

Сұраныс жасау үшін келесі әдістердің біріне қоңырау шалуға болады:
System.gc()
Runtime.getRuntime().gc()

Қоқыс жинағышты басқаруға жарамдылық

Нысан тірі ағынға енді қолжетімсіз болған кезде жойылуы керек. Объект әртүрлі жағдайларда жойылуы мүмкін:
  • Нысанға сілтеме жасайтын сілтеме түрінің айнымалы мәні «0» мәніне орнатылса, оған басқа сілтемелер болмаса, нысан жойылуы керек.
  • Егер нысанға сілтеме жасайтын сілтеме түрінің айнымалысы басқа нысанға сілтеме жасау үшін жасалса, оған басқа сілтемелер болмаса, нысан жойылуы керек.
  • Әдісте жергілікті түрде жасалған нысандар, егер олар осы әдістен экспортталмаса (яғни, ерекше жағдай ретінде қайтарылмаса немесе тасталмаса) әдіс шыққан кезде жойылады.
  • Бір-біріне сілтеме жасайтын нысандар, егер олардың ешқайсысы тікелей ағында қол жетімді болмаса, жоюға жатады.
Мысал қарастырайық:
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 көрсеткішімен сілтеме жасалған нысан (бүтін сан) 3-жолдан кейін жойылуы мүмкін, себебі o1 енді нысанға String(жолға) сілтеме жасайды. o2 нөлге сілтеме жасау үшін жасалғанымен, нысан String(жол) қайта өңделмейді, өйткені o1 оған сілтеме жасайды.

Қорытындылау

finalize()Java технологиясы қоқыс жинағыш an objectіні жадтан шығарып алмас бұрын қажетті тазалауды орындау үшін әдісті (аяқтауды) пайдалануға мүмкіндік береді . Бұл әдіс қоқыс жинаушы нысанға басқа сілтемелер жоқ екенін анықтағанда, қоқыс жинаушы арқылы нысанға шақырылады. Бұл сыныпта сипатталған Object, яғни ол барлық сыныптарға мұра болады. finalize()Ішкі сынып жүйе ресурстарынан босату немесе басқа тазалау үшін әдісті қайта анықтайды :
protected void finalize() throws Throwable
Тіркелмеген ерекшелік әдісі арқылы шығарылса finalize(), ерекше жағдай еленбейді және сол нысанның аяқталуы тоқтатылады. Әдіс finalize()нысанның өмір сүру уақытында тек бір рет шақырылады. finalize()Кез келген нысанды кәдеге жаратудан қорғау үшін әдісті қолдануға болады . Бірақ бұл жағдайда қоқыс жинағыш енді finalize()осы нысан үшін іске қосылмайды. Нысан қоқыс жинамас бұрын әдіс finalize()әрқашан бір рет шақырылады. Дегенмен, әдіс берілген нысан үшін оның бар болуының бүкіл мерзімі ішінде іске қосылмауы мүмкін finalize(), өйткені ол жойылуға жатпайды.

Түйіндеме

Бұл бөлімде біз Java тіліндегі жадты басқару әдісі болып табылатын қоқыс жинау процесін қарастырдық. Қоқыс жинауды мәжбүрлеу мүмкін емес. Біз нысандарды қайта өңдеуге жарамды етудің әртүрлі жолдары туралы білдік және әдіс finalize()қоқыс жинаушы нысанды қайтармас бұрын шақырылатынын білдік.

Жаттығу

Сұрақ: 7-жолдан кейін неше нысан жойылуға жатады?
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іні Integerжою керек. 7-жолдың соңы. Бастапқыда нысанға сілтеме жасаған a айнымалы сілтемелері 5-жолдағы Integerнысанға сілтеме жасайды. Осылайша, нысан 5-жолдан кейін жойылуы керек, өйткені оған сілтеме жасайтын айнымалылар жоқ. Айнымалылар және 6 және 7-жолдардағы нысандар мен нысандарға сілтеме жасаңыз , сондықтан оларды қайта өңдеуге болмайды.StringIntegerbcStringLong
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION