16 Ekim 2018 Salı

WeakHashMap Sınıfı - GC'yi Engellemez

Giriş
Şu satırı dahil ederiz.
import java.util.WeakHashMap;
Not :SoftReference yazısına da bakabilirsiniz.

Açıklaması şöyle.
Elements is a WeakHashMap can be reclaimed by the garbage collector if there are no strong references to the object, this makes them useful for caches/lookup storage 
Bu sınıf ile WeakReference sınıfı ilişkilidir. Sınıfın key alanındaki nesneye strong reference olmasa bile GC devreye girinceye kadar halen erişilebilir. GC devreye girince key alanı silinir. Böylece bellekten tasarruf edilir. Açıklaması şöyle.
When a key has been discarded its entry is effectively removed from the map,…
put metodu
Şöyle yaparız.
WeakHashMap<Employee, EmployeeVal> aMap = new WeakHashMap<Employee, EmployeeVal>();

Employee emp = new Employee("Foo");
EmployeeVal val = new EmployeeVal("Bar");

aMap.put(emp, val);

emp = null;

System.gc();
int count = 0;
while (0 != aMap.size()) {
  ++count;
  System.gc();
}
System.out.println("Took " + count
  + " calls to System.gc() to result in weakHashMap size of : "
  + aMap.size());
Çıktı olarak şunu alırız.
Took 20 calls to System.gc() to result in aMap size of : 0.
size metodu
GC çalıştıktan sonra WeakHashMap sınıfının büyüklüğünün azaldığını görmek için şöyle yaparız.
Set < UUID > set = Collections.synchronizedSet(Collections.newSetFromMap(
                                new WeakHashMap <>()
));

UUID uuid1 = UUID.fromString( "a8ee1e34-cead-11e8-a8d5-f2801f1b9fd1" );
UUID uuid2 = UUID.fromString( "39bda2b4-5885-4f56-a900-411a49beebac" );
UUID uuid3 = UUID.fromString( "0b630385-0452-4b96-9238-20cdce37cf55" );
UUID uuid4 = UUID.fromString( "98d2bacf-3f7f-4ea0-9c17-c91f6702322c" );

System.out.println( "Size before adding: " + set.size() );

set.add( uuid1 );
set.add( uuid2 );
set.add( uuid3 );
set.add( uuid4 );

System.out.println( "Size after adding 4 items: " + set.size() );  // Expect 4.

set.remove( uuid3 );

System.out.println( "Size after removing item # 3: " + set.size() );  // Expect 3.

uuid2 = null;  // Release that UUID to garbage-collection.

// That released object may still appear in our `Set` until GC actually executes. 
System.gc(); // Ask the JVM to run the garbage-collection. 
try {
  Thread.sleep( 1_000 );  // Wait a moment, just for the heck of it.
} catch ( InterruptedException e ) {
  e.printStackTrace();
}

System.out.println( "Size after making garbage of item # 2: " + set.size() );// Expect 2.

for ( UUID uuid : set ) {
  System.out.println( uuid.toString() );
}
Çıktı olarak şunu alırız
Size before adding: 0
Size after adding 4 items: 4
Size after removing item # 3: 3
Size after making garbage of item # 2: 2


Hiç yorum yok:

Yorum Gönder