16 Mart 2023 Perşembe

Escape Analysis Optimization

Giriş
Escape Analysis Optimization nesneyi mümkünse heap'te yaratmamayı amaçlıyor. Amaç GC'nin mümkün olduğunca az çalışması. Açıklaması şöyle
In general, allocating objects, executing the new operator, is a very expensive thing. Not because you are allocating memory, allocators are often fast. But because you will burden the garbage collector. Then it will have to come and clean up that memory. In this way, you significantly increase its workload, so any virtual machine tries to avoid it. How can you do this?

The compiler has a wonderful Escape Analysis that will help you understand if your object is leaking, whether it is needed by someone outside the local method currently executing or not.
1. Scalar Replacement Optimization
Metodun dışına taşmayan nesnelerin alanlarını stack'e taşır.

Örnek
Şöyle yaparız
class Test {
  int a, b;
}

public void foo() {
  Test obj = new Test();
  obj.a = 42;
  obj.b = 10;

  System.out.println(obj.a + obj.b);
}
Açıklaması şöyle
Why allocate anything on the heap here? It will die right away, and the garbage collector will have to collect it. ...
Instead, the famous Scalar Replacement optimization will work, which will replace the use of this object with the use of its fields.
2. Stack Allocation Optimization
Burada nesne alanlarına bölünüp stack üzerinde yaratılamıyor çünkü o zaman bar() metoduna daha fazla parametre geçmek gerekiyor. Onun yerine nesne stack'te yaratılıyor

Örnek
Şöyle yaparız
class Test {
  int a, b;
}

public void bar(Test arg){
  arg.b = 10;
  System.out.println(arg.a + arg.b);
}

public void foo() {
  Test obj = new Test();
  obj.a = 42;
  bar(obj); 
}
Açıklaması şöyle
If we notice that our object is actually used locally, doesn’t leak anywhere, except for passing the call to some function and passing it there as an argument, where it is also good and doesn’t leak, then we can replace the allocation of such an object in the heap with an allocation on the stack.
Partial Escape Analysis
Nesne bir koşula bağlı olarak metoddan dışarıya sızabilir. Önce örneğin Scalar Replacement Optimization ile başlıyor. Eğer koşul gerçekleşirse nesne heap'te yaratılıyor.

Örnek
Şöyle yaparız. Burada nesne shouldEscape parametresine bağlı olarak dışarıya sızabilir. 
class Test {
  int a, b;
}

static Test t;

public void foo(boolean shouldEscape){
  Test obj = new Test();
  obj.a = 42;
  obj.b = 10;

  System.out.println(obj.a + obj.b);

  if (shouldEscape) {
    t = obj;
  }
}

Hiç yorum yok:

Yorum Gönder