Java-da (JVM) zibil toplama necə işləyir

Mənbə: DZone

Java-da zibil toplama prosesi

Java zibil kolleksiyası yaddaşı avtomatik olaraq ayırır və boşaldır, ona görə də tərtibatçılar yaddaşı idarə etmək üçün ayrıca proqram yazmağa ehtiyac duymurlar ki, bu da Java-da proqramlaşdırmanın əsas üstünlüklərindən biridir. Hər dəfə Java proqramı JVM-də işlədikdə obyektlər yığında yaradılır və proqrama ayrılmış yaddaşın bir hissəsini təmsil edir. Vaxt keçdikcə bəzi maddələrə ehtiyac qalmayacaq. Zibil yığan bu istifadə olunmamış obyektləri tapır və yaddaşı boşaltmaq üçün onları çıxarır. Kofe fasiləsi №61.  Java-da (JVM) zibil toplama necə işləyir.  Texniki müsahibədə Bahar haqqında 15 vacib sual - 1Zibil toplayıcı yaddaş yığınını qiymətləndirdikdən sonra hansı obyektlərin istifadədə olduğunu və hansının olmadığını müəyyən edəcək və istifadə olunmamış obyektləri siləcək. İstifadə olunan və ya istinad edilən obyekt o deməkdir ki, proqramınızın bəzi hissəsi hələ də həmin obyektin göstəricisini saxlayır. Əgər obyekt artıq istifadə olunmursa və ya ona istinad edilmirsə, o zaman proqramın heç bir hissəsinə istinad edilməyəcək. Beləliklə, istinad edilməmiş obyekt tərəfindən istifadə olunan yaddaş zibil toplama əməliyyatını yerinə yetirməklə azad edilə bilər. Kofe fasiləsi №61.  Java-da (JVM) zibil toplama necə işləyir.  Texniki müsahibədə Bahar haqqında 15 vacib sual - 2Yaddaşın boşaldılması üç əsas proseslə təsvir edilə bilər:
  1. İşarələmə.
  2. Normal aradan qaldırılması.
  3. Sıxılma ilə çıxarılması.
İşarələmə yaddaşın zibil yığan tərəfindən istifadə edilən və istifadə olunmayan hissələrinin müəyyən edilməsi prosesidir. Etiketləmə adətən ilk addımdır. Normal silinmə , istinad edilməyən obyektlərin silinməsi, istinad edilən obyektlərin və göstəricilərin boş yerdə qalması prosesidir. Compaction delete - İstinad edilməmiş obyektləri silməklə yanaşı, o, qalan istinad edilən obyektləri yığcamlaşdırır, yeni yaddaşın ayrılmasını çox asan və daha sürətli etmək üçün obyektləri birlikdə hərəkət etdirir.

JVM yığın yaddaşı

Kofe fasiləsi №61.  Java-da (JVM) zibil toplama necə işləyir.  Texniki müsahibədə Bahar haqqında 15 vacib sual - 3

Gənc Nəsil

Yeni yaradılmış obyektlər Gənc Nəsildən başlayır. Burada yeni obyektlər yaşamağa başladığı üçün onu körpələr evi də adlandırırlar. Gənc Nəsil bütün yeni obyektlərin başladığı Eden Space və obyektlərin tək bir zibil toplama dövründə sağ qaldıqdan sonra Edendən çıxarıldığı iki Survivor Space-ə bölünür. Obyektlər Gənc Nəsil zibil kollektoru tərəfindən toplandıqda onlar yenidən zibil yığılmasına səbəb olur. Eden Space Bütün yeni obyektlər ilk olaraq Eden Space-də yaradılır. Kiçik zibil yığımı JVM tərəfindən müəyyən edilmiş həddə çatdıqda işə düşəcək. Qeyd olunan obyektlər Eden Space-dən birinci qənaət sahəsinə ('Eden' və 'from' -> 'to') köçürülür. Eden Space təmizləndikdə istinad edilməmiş obyektlər silinir. Survivor 0 (S0) və Survivor 1 (S1) Hər iki sağ qalan (From and to) sahələri boş başlayır. Zibil yığımı yenidən baş verdikdə, istinad edilən bütün obyektlər qalan boş yerə köçürülür. Zibilin yığılması başa çatdıqda, sağ qalanın yerləri (adları) "dan" və "to" dəyişdirilir. Əgər əvvəlki zibil yığımı zamanı S1 “to” rolunda idisə, indi S1 ​​doludur və “dan” olur. Müvafiq olaraq, S0 boşdursa, o zaman "to" olacaq.

Köhnə Nəsil

Kiçik zibil yığıldıqdan sonra köhnəlmiş obyektlər müəyyən yaş həddinə çatdıqda (defolt olaraq müasir JVM-lərin həddi 15 zibil toplama dövrünə təyin olunur) onlar uzunömürlü obyektlərlə birlikdə gənc nəsildən köhnə obyektə keçirlər. Kiçik zibil yığanlar meydana çıxmağa davam etdikcə, obyektlər Köhnə Nəsil məkanına köçməyə davam etdikcə, o, dolmağa başlayacaq və böyük zibil yığılması baş verəcək. Əsas zibil yığımı obyektlər Köhnə Nəsil zibil kollektoru tərəfindən toplandıqda baş verir. Kofe fasiləsi №61.  Java-da (JVM) zibil toplama necə işləyir.  Texniki müsahibədə Bahar haqqında 15 vacib sual - 4

Daimi Nəsil

Siniflər və metodlar kimi metadata Daimi Nəsildə saxlanılır. Artıq istifadə olunmayan siniflər zibil yığan şəxs tərəfindən oradan çıxarıla bilər. Tam zibil yığılması zamanı bütün nəsillərdən istifadə olunmamış obyektlər toplanır.Kofe fasiləsi №61.  Java-da (JVM) zibil toplama necə işləyir.  Texniki müsahibədə Bahar haqqında 15 vacib sual - 5

Zibillərin yığılmasının növləri

Yığın içərisində müxtəlif hissələri təmizləyən zibil kolleksiyaları çox vaxt Kiçik, Böyük və Tam zibil kolleksiyaları adlanır. Lakin Minor, Major və Full terminləri düzgün tərif olmadan geniş şəkildə istifadə edildiyi üçün biz bütün bu zibil yığım növlərinin izahına baxacağıq.

Kiçik Zibil Kolleksiyası

Gənc Nəsil məkanından zibillərin toplanması Kiçik Zibil Kolleksiyası adlanır. Bu tip qurma həmişə JVM yeni obyekt üçün yer ayıra bilmədikdə, yəni Eden Space dolu olduqda işə salınır. Beləliklə, seçim nisbəti nə qədər yüksək olsa, Kiçik Zibil Toplama bir o qədər tez-tez baş verir.

Böyük Zibil Kolleksiyası

Böyük Zibil Kolleksiyası Tenured (köhnə yer) təmizləyir. Köhnə Nəsil daha böyük olduğu üçün Gənc Nəsildən daha az toplaşma baş verir. Köhnə Nəsildən obyektlər yoxa çıxanda biz deyirik ki, “böyük zibil yığılması” baş verib. Köhnə Nəsil kolleksiyaçısı, Gənc Nəsildən irəliləyiş uğursuzluqlarının qarşısını almaq üçün toplamaya nə vaxt başlamalı olduğunu təxmin etməyə çalışacaq. Kollektorlar Köhnə Nəslin doldurma həddinə nəzarət edir və bu həddi aşdıqda yığmağa başlayırlar. Əgər bu hədd təşviqat tələblərinə cavab vermək üçün kifayət etmirsə, "Tam Zibil Toplama" işə salınır.

Tam Zibil Kolleksiyası

Tam Zibil Kolleksiyası bütün dəstəni – həm gənc, həm də köhnə məkanları təmizləyir. Bir çox insanlar Major (yalnız OLD nəsil) və Tam GC (Gənc + OLD (Yığın)) arasında qarışıqdır. Tam Çöp Kolleksiyası yaşlı nəslin yığılıb sıxılmasından sonra gəncdən yaşlı nəslə qədər bütün canlı obyektlərin təbliğini əhatə edir. Tam zibil yığılması Stop-the-World üçün dayanacaq olacaq. O, yeni obyektlərin ayrılmamasını və kollektor işləyərkən obyektlərin əlçatmaz olmasını təmin edir.

Texniki müsahibədə Bahar haqqında 15 vacib sual

Mənbə: Dev.to Spring Framework Java platforması üçün universal çərçivədir. Onun əsas xüsusiyyətləri istənilən Java proqramı tərəfindən istifadə edilə bilər və Java EE əsaslı veb proqramları yaratmaq üçün genişlənmələr mövcuddur. Budur, Bahar kodlaşdırması ilə bağlı müsahibə sualları və cavablarının siyahısı. Ümid edirik ki, onlar sizə 2021-ci ildə texniki müsahibənizə hazırlaşmağa kömək edəcəklər.Kofe fasiləsi №61.  Java-da (JVM) zibil toplama necə işləyir.  Texniki müsahibədə Bahar haqqında 15 vacib sual - 6

1. Bahar nədir?

Cavab: Spring Java proqramlarını inkişaf etdirmək üçün açıq mənbə çərçivəsidir. Spring Framework-ün əsas xüsusiyyətləri istənilən Java proqramını inkişaf etdirmək üçün istifadə edilə bilər və əlavələr Java EE platforması əsasında veb proqramlar yaratmaq üçün də mövcuddur. Bahar çərçivəsi J2EE-nin inkişafda istifadəsini asanlaşdırmaq və POJO (Plain Old Java Object) əsaslı modeli daxil etməklə proqramlaşdırma təcrübələrini təkmilləşdirmək məqsədi daşıyır.

2. Yaz çərçivəsində paxlanın standart əhatə dairəsi nədir?

Cavab: Fasulyenin standart əhatə dairəsi Singleton (dizayn nümunəsidir).

3. Bean məftilləri nədir?

Cavab: Fasulye naqilləri, Spring konteynerində tətbiq komponentləri (lobya) arasında assosiasiyalar yaratmaq aktıdır.

4. Spring Security nədir?

Cavab: Bahar Təhlükəsizliyi Java proqramlarına autentifikasiya və avtorizasiya üsullarını təqdim etməyə yönəlmiş Spring çərçivəsinin ayrıca moduludur. O, həmçinin CSRF hücumları kimi ən çox yayılmış təhlükəsizlik boşluqlarını düzəldir. Veb tətbiqlərində Spring Security-dən istifadə etmək üçün sadə annotasiya ilə başlaya bilərsiniz: @EnableWebSecurity.

5. Lobya tərifində nə var?

Cavab: Lobya tərifi konfiqurasiya metadata adlanan məlumatları ehtiva edir və konteyner aşağıdakıları bilməlidir:
  • Bir lobya necə yaradılır;
  • Fasulyenin həyat dövrü təfərrüatları;
  • lobya asılılıqları.

6. Spring Boot nədir?

Cavab: Spring Boot, Spring proqramını minimum kodla işə sala bilməniz üçün qazan konfiqurasiyasını azaltmaq üçün əvvəlcədən konfiqurasiya edilmiş çərçivələr dəstini təmin edən layihədir.

7. DispatcherServlet nədir və nə üçün istifadə olunur?

Cavab: DispatcherServlet, Spring MVC tətbiqinə daxil olan bütün veb sorğularını idarə edən Ön Nəzarətçi dizayn nümunəsinin tətbiqidir. Ön Nəzarətçi nümunəsi (Müəssisə Tətbiqi Dizayn Nümunəsi) işi bütün sorğunu götürmək və faktiki emal üçün tətbiqin müxtəlif komponentlərinə yönləndirmək olan veb proqramlarda ümumi nümunədir. Baharda MVC DispatcherServlet sorğunu idarə etmək üçün düzgün nəzarətçi tapmaq üçün istifadə olunur. Bu, işləyicinin xəritələşdirilməsindən istifadə etməklə həyata keçirilir: məsələn, @RequestMapping annotasiyası.

8. Spring-mvc.jar sinif yolunda lazımdır, yoxsa yay nüvəsinin bir hissəsidir?

Cavab: Spring-mvc.jar spring-core-un bir hissəsidir, yəni Java layihənizdə Spring MVC çərçivəsini istifadə etmək istəyirsinizsə, o zaman tətbiqinizin sinif yoluna spring-mvc.jar daxil etməlisiniz. Java veb proqramında spring-mvc.jar adətən /WEB-INF/lib qovluğuna yerləşdirilir.

9. Bahardan istifadə etməyin faydaları nələrdir?

Cavab: Aşağıda Spring Framework-dən istifadənin bəzi üstünlüklərinin siyahısı verilmişdir:
  • Yüngül - Ölçü və şəffaflığa gəldikdə yay nisbətən yüngüldür. Spring Framework-in əsas versiyası təxminən 2 MB-dır.
  • Nəzarətin tərsinə çevrilməsi (IOC) - Baharda nəzarət texnikasının inversiyasından istifadə edərək boş birləşmə əldə edilir. Obyektlər asılı obyektləri yaratmaq və ya axtarmaq əvəzinə öz asılılıqlarını təmin edir.
  • Aspekt yönümlü - Spring aspekt yönümlü proqramlaşdırmanı dəstəkləyir və proqram biznes məntiqini sistem xidmətlərindən ayırmaqla ardıcıl inkişafı təmin edir.
  • Konteynerlər - Yay Konteyneri obyektləri yaradır, onları bir-birinə bağlayır, konfiqurasiya edir və yaradılışdan utilizasiyaya qədər idarə edir.
  • MVC Çərçivəsi - Bahar veb çərçivəsi, Struts və ya digər həddən artıq dizayn edilmiş və ya daha az populyar veb çərçivələr kimi veb çərçivələrə alternativ təmin edən yaxşı dizayn edilmiş MVC veb çərçivəsidir.
  • Transaction Management - Spring yerli əməliyyatlara (məsələn, vahid verilənlər bazasından istifadə etməklə) və ya qlobal əməliyyatlara (məsələn, JTA-dan istifadə etməklə) miqyas verə bilən ardıcıl əməliyyat idarəetmə interfeysinə malikdir.
  • İstisnaların idarə edilməsi - Spring texnologiyaya xas istisnaları (JDBC, Hibernate və ya JDO tərəfindən atılanlar kimi) ardıcıl, yoxlanılmamış istisnalara çevirmək üçün rahat API təmin edir.

10. Yaz lobyaları nədir?

Cavab: Yaz lobyaları Spring Container tərəfindən idarə olunan obyektlərin nümunələridir. Onlar çərçivə ilə yaradılır və birləşdirilir və sonra onları götürə biləcəyiniz “obyekt çantasına” (konteynerə) yerləşdirilir. Asılılıq inyeksiyasını təşkil edən şey məftildir. Bu o deməkdir ki, siz sadəcə olaraq “Mənə bu şey lazımdır” deyə bilərsiniz və çərçivə həmin obyekti əldə etmək üçün müəyyən qaydalara əməl edəcək.

11. Əsas Konteyner modulunun məqsədi nədir?

Cavab: Kernel konteyneri Spring çərçivəsinin əsas funksionallığını təmin edir. Əsas konteynerin əsas komponenti Fabrika nümunəsinin tətbiqi olan BeanFactory-dir. BeanFactory, konfiqurasiya və tətbiq spesifikasiyası asılılıqlarını faktiki tətbiq kodundan ayırmaq üçün İnversiya nəzarətindən istifadə edir.

12. Tətbiq konteksti nədir?

Cavab: İlk baxışdan tətbiq konteksti lobya fabriki ilə eynidir. Hər iki lobya təriflərini yükləyin, paxlaları bir yerə yığın və tələb əsasında paylayın. Lakin o, həmçinin təmin edir:
  • Mətn mesajlarının həlli üçün alət, o cümlədən beynəlmiləlləşdirmə dəstəyi.
  • Fayl resurslarını yükləməyin ümumi yolu.
  • Dinləyici kimi qeydə alınan lobya üçün tədbirlər.

13. Java Server Faces (JSF) Spring ilə necə inteqrasiya olunur?

Cavab: JSF və Spring eyni xüsusiyyətlərdən bəzilərini bölüşür, xüsusən də Nəzarətin İnversiya xidmətləri sahəsində. faces-config.xml konfiqurasiya faylında JSF tərəfindən idarə olunan lobya elan etməklə siz FacesServlet-ə başlanğıcda həmin lobya nümunəsini yaratmağa icazə verirsiniz. JSF səhifələriniz bu paxlalara və onların bütün xassələrinə giriş imkanına malikdir. JSF və Spring iki şəkildə inteqrasiya oluna bilər: DelegatingVariableResolver : Spring JSF və Spring ilə birlikdə istifadə etməyə imkan verən JSF dəyişən həlledicisi ilə gəlir. DelegatingVariableResolver əvvəlcə dəyərlərin axtarışını əsas JSF tətbiqinin standart tərcüməçisinə, sonra isə Spring WebApplicationContext-in "biznes kontekstinə" verir. Bu, asılılıqları JSF tərəfindən idarə olunan lobyalara yerləşdirməyi asanlaşdırır. FacesContextUtils : Fərdi VariableResolver öz xassələrini faces-config.xml-də lobya ilə müqayisə edərkən yaxşı işləyir. Ancaq lobya çəkmək lazımdırsa, FacesContextUtils sinfi bunu asanlaşdırır. O, WebApplicationContextUtils-ə bənzəyir, lakin ServletContext parametrindən çox FacesContext parametrini qəbul edir.
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext (FacesContext.getCurrentInstance ());

14. Spring MVC çərçivəsi nədir?

Cavab: Spring Web MVC çərçivəsi , çevik və boş birləşmiş veb proqramlarını inkişaf etdirmək üçün istifadə oluna bilən model-görüntü-nəzarətçi arxitekturasını və əvvəlcədən qurulmuş komponentləri təmin edir. MVC nümunəsi tətbiqin müxtəlif aspektlərinin (giriş məntiqi, biznes məntiqi və UI məntiqi) ayrılması ilə nəticələnir və bu elementlər arasında boş birləşməyə imkan verir.

15. Baharda hadisələrin idarə edilməsi necə işləyir?

Cavab: ApplicationContext- də emal ApplicationEvent sinfi və ApplicationListener interfeysi vasitəsilə təmin edilir . Yəni, lobya ApplicationListener tətbiq edirsə , onda hər dəfə ApplicationEvent ApplicationContext- də dərc edildikdə həmin lobya qeydə alınır. Oxuduğunuz üçün təşəkkür edirik və texniki müsahibənizdə uğurlar!