java for telco_gc
TRANSCRIPT
• JVM Garbage Collection
•
September 03, 2012
Gökhan Özman
1
2
İçerik
1. GC Giriş
2. Java Bellek Modeli
3. GC Nesilleri
4. GC Çeşitleri
5. Nesne Referans Tipleri
6. Hotspot Vm Seçenekleri
3
Ne oluyor?
4
Garbage Collection(Çöp toplama)
5
Çöp ?
Ogrenci a=new Ogrenci();
Ogrenci b=new Ogrenci();
a=b;
ya da
a=null;
Garbage Collection Giriş
a
b
Ogrenci
Ogrenci
6
• finalize()
• System.gc()
• Runtime.gc()
Garbage Collection Giriş
Neden gc, ne işe yarar?
7
• Bellek geri dönüşümü
• JVM bütünlüğü
• Geliştirici verimliliği
Garbage Collection Giriş
8
• Stack• Metotlar
• Lokal değişkenler
• Referans değişkenleri
• Heap• Nesneler
• Sınıf değişkenleri
Java Bellek Modeli
Stack&Heap
9
Java Bellek Modeli
main() x
method2 car
method1 b c
p=0
q=0
Car object
stack
heap
Java Heap
10
Java Bellek Modeli
Heap
Young gen.Old gen.
%33
Young gen.
11
Java Bellek Modeli
Eden Space
Survivor Space 1
Survivor Space 2
EDEN
12
Java Bellek Modeli
SURVIVOR
13
Java Bellek Modeli
Old gen.
14
Java Bellek Modeli
Old gen.
15
Java Bellek Modeli
Young gen. Old gen.
Java işlem alanı
16
Java Bellek Modeli
Bellek(İşletim Sistemi)
Java işlem alanı(java.exe)
Java nesne alanı(heap) Diğer...
Diğerleri
17
• Kalıcı alan
• Kod çevrim alanı
• Soket alanı
• Thread yığını
• Direk bellek alanı
• GC
Java Bellek Modeli
Kalıcı Alan(Perm gen.)
18
• Sınıfların metadata elemanları tutulur
• Web uygulamalarında OOM(Out of Memory) hatası
• -XX:PermSize=<deger>(initial)
• -XX:MaxPermSize=<deger>(max)
Java Bellek Modeli
Kod çevrim alanı
19
Java Bellek Modeli
Kod çevrim alanı
20
• Çok nadir bellek sorunu yaşanır
• Bu alanda yeterli bellek bulunamazsa
JVM büyük ihtimal çöker
Java Bellek Modeli
Soket alanı
21
• Her TCP bağlantısı 2 buffer içerir:
1. Alım için: ~37k
2. Gönderim için: ~25k
• Java kodu içerisinde ayarlanır.
• Bellek hatasından önce genelde diğer limitlerde hata oluşur. Örn: IOException: Too many open files
Java Bellek Modeli
Thread stack
22
• Özel alan
• Belleğe dikkat
• -Xss
Java Bellek Modeli
Direk bellek alanı
23
• Heap dışında belleği kullanma imkanı !
• Java.nio.ByteBuffer.allocateDirect
• -XX:MaxDirectMemorySize=
Java Bellek Modeli
24
Nesne Yaşamdöngüsü
Yaratılma
Kullanım
Görünmezlik
ErişilemezlikToplanma
Sonlandırılma
Temizlenme
25
• Yaratılma Durumu
• Nesne için gerekli bellek ayrılmıştır
• Nesne yaratımı başlamıştır.
• Super sınıf constructor u çağrılmıştır
Nesne Yaşamdöngüsü
26
• Kullanım Durumu
• En az bir strong referans tarafından erişim vardır.
Nesne Yaşamdöngüsü
27
• Görünmezlik Durumu
• Herhangi bir strong referans kalmadıysa
Nesne Yaşamdöngüsü
28
• Erişilemezlik Durumu
• Collection için aday
• Circular referanslar sayılmaz
Nesne Yaşamdöngüsü
Erişilmezlik Durumu
29
Java Bellek Modeli
main()
buildCar()
Car
Engine
Stack
Heap
30
• Toplanma Durumu
• GC nesnenin artık erişilemez durumda oldugunu tespit eder
• Finalize()
• Finalized
• Deallocated
Nesne Yaşamdöngüsü
31
• Strong
• Soft
• Weak
• Phantom
Nesne Referans Tipleri
32
• Strong Referans
• En çok kullandığımız referans tipi
Person person = new Person();
person = null;
Nesne Referans Tipleri
33
• Soft Referans
• Cache için oldukça uygundur.
• OutOfMemory e kadar dayanır.
Person person = new Person();
SoftReference<Person> softPerson = new
SoftReference<Person>(person);
Nesne Referans Tipleri
34
• Weak Referans
• Sadece weak referans kalmışsa gc toplar.
Person person = new Person();
WeakReference<Person> weakPerson = new
WeakReference<Person>(person);
Nesne Referans Tipleri
35
• Phantom Referans
• finalize() !!!
• Nesneye erişim için kullanılmaz
ReferenceQueue q = new ReferenceQueue();
PhantomReference phantomImage= new
PhantomReference(bigImage, q);
q.remove();
Nesne Referans Tipleri
Algoritmalar
36
• Referans sayma
• Referans takip etme
GC Çeşitleri
Yöntemler
37
• Sıkıştırma(compacting collector)
• Kopyalama(copying collector)
• Nesillere ayırma(generational collector)
GC Çeşitleri
Yaklaşımlar(çalışma zamanı bakımından)
38
• Stop the World
• Incremental
• Concurrent
GC Çeşitleri
GC Zamanları
39
• Heap büyüklüğüne göre değişir.
• Minor collection
• Major collection
GC Çeşitleri
-verbose:gc
40
GC Çeşitleri
Toplam young gen. alanı Toplam old gen. alanı Toplam perm gen. alanı
Full gc süresi Old gen. de kalan nesneler Perm gen. boyutu
Serial Collector
41
Collector Çeşitleri
GC GCUygulama Uygulama Uygulama
Paralel(Throughput) Collector
42
Collector Çeşitleri
GC GCUygulama Uygulama Uygulama
Concurrent Mark&Sweep(CMS) Collector
43
Collector Çeşitleri
GC GCUygulama Uygulama Uygulama
initial mark
concurrent mark
remark concurrentsweep
Gargabe First Collector
44
• Garbage First (G1) Collector
Total Java Heap
Collector Çeşitleri
Region 1 Region 2 Region 3 Region 4 Region 5 Region n...
Gargabe First Collector
45
• Garbage First (G1) Collector
• -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
• -XX:MaxGCPauseMillis=n
• -XX:G1HeapRegionSize=n
• -XX:ParallelGCThreads=n
Collector Çeşitleri
Heap/Generation Sizing
46
• Heap Size: -Xms, -Xmx
Örn: Xms 128m -Xmx 1g
• -XX:MinHeapFreeRatio=40
GC sonrası kalan min. heap miktarı. tavsiye edilen miktar %40
• -XX:MaxHeapFreeRatio=70
GC sonrası kalan max. heap miktarı. tavsiye edilen miktar %70
• -XX:NewRatio=2
new/old generation oranı
• -XX:NewSize=128m new generation büyüklük degeri.
• -XX:SurvivorRatio=3
eden/survivor space oranı
HotSpot VM Options
Heap/Generation Sizing
47
• Permanent Size:
• -XX:PermSize -XX:MaxPermSize
• Stack Size :
• -Xss 128k veya -XX:ThreadStackSize=128k
• Solaris x86 nın default verdiği değer 512k
HotSpot VM Options
GC Davranışı ile ilgili parametreler
48
• -XX:MaxTenuringThreshold
• Tenuring Threshold: Young Gen’deki canlı bir objenin kaç minor collection süresi boyunca hala canlıysa, «promote» olması gerektiğini ifade eden bir değer
• XX:+DisableExplicitGC
• Explicit gc yi kapat. System.gc()’yi çağırdığınız zaman GC tetiklenmez
• XX:ParallelGCThreads=n ve -XX:ConcGCThreads=m (default: CPU sayısı kadar)
• Parallel ve CMS collector thread sayıları
• -XX:CMSInitiatingOccupancyFraction=90
• CMS’i geç başlatmak: Old’un %90’ı dolmadan CMS’i başlatma
• -XX:+CMSClassUnloadingEnabled
• CMS’in Perm Gen’i temizlemesi için
HotSpot VM Options
Debugging
49
• VM hatalarını belli bir file’a yazdır:
• -XX:ErrorFile=./hs_err_pid<pid>.log
• Out of memory olduğuda «heap dump» al:
• XX:+HeapDumpOnOutOfMemoryError
• -XX:HeapDumpPath=./java_pid<pid>.hprof
• Hata ve out of memory durumlarında aksiyon almak
• -XX:OnError="<cmd args>;<cmd args>"
• -XX:OnOutOfMemoryError="<cmd args>; <cmd args>"
HotSpot VM Options