공부 5

java의 field 초기화와 동시성

다음 코드의 출력을 예상해보자. class A{ A() { f(); } public void f(){ System.out.println("3"); } } class B extends A{ int x = 4; public void f() { System.out.println(x); } } public class Main { public static void main(String[] args) { A a = new B(); } } 답은 뭘까? 3 혹은 4중에 고민하고 있다면, 그렇지 않다. 답은 0이다. java는 C++와 다르게 생성자에서도 virtual하고 순서상 A가 초기화된 후에 B가 초기화되기 때문에, x가 초기화되지 않은 상태로 출력되어 0이 출력된다. 그렇다면 생성자에서 필드를 초기화하는 클래스..

공부 2023.06.15

Garbage Collection(4) - Weak Reference

Garbage Collector가 존재하는 언어중 몇몇은 약한 참조(Weak Reference)라는 것을 제공합니다. java js python lua 일반적으로, 참조당하고 있는 객체는 Garbage Collection 대상이 아닙니다. 하지만 캐시와 같이 속도 면에서는 중요하지만 제거해도 괜찮은 객체는 어떻게 할까요? 이를 위해 Reference Object를 제공합니다. Reference Object를 통해 객체를 간접적으로만 참조하는 방식으로 사용하며, GC는 메모리가 부족하면 Reference Object으로만 참조중인 객체를 제거할 수 있습니다. 따라서 일반적으로는 다음과 같이 접근합니다. var weakRef = new WeaKReference(new T()); ... // 객체는 언제든 제..

공부 2023.01.16

Garbage Collection(3) - Java GC Tuning

이전 포스팅에서는 자바의 Garbage Collector에 대해 다뤘습니다. 이번 포스팅에서는 Garbage Collector를 애플리케이션에 맞게 튜닝하는 방법에 대해 알아봅시다. Garbage Collectors * 이 포스팅에서 다루는 java의 버전은 18입니다. Serial GC -XX:+UseSerialGC Parallel GC -XX:+UseSerialGC Concurrent Mark Sweep(CMS) GC(Removed) Garbage-First(G1) GC -XX:+UseG1GC Z GC -XX:UseZGC Shenandoah GC -XX:+UseShenandoahGC Epsilon GC(Experimental) -XX:+UnlockExperimentalVMOptions -XX:+Use..

공부 2023.01.16

Garbage Collection(2) - Java GC

이전 포스팅에서 Garbage Collection에 대한 전략 세가지를 다뤘습니다. 이번 포스팅에서는 추적 전략을 사용하는 java의 Garbage Collector에 대해 다룹니다. Java GC(Garbage Collector) * 이 포스팅에서 다루는 java의 버전은 18입니다. 이전 포스팅에서 모든 스레드에서 변수 혹은 그 변수의 멤버 등으로 참조하지 않는 객체를 garbage라고 하고 이를 찾는 것을 Garbage Collection이라 했습니다. java에서는 garbage를 도달할 수 없다(Unreachable)고 하고, 반대로 하나 이상의 스레드에서 직/간접적으로 참조되는 객체를 도달할 수 있다(Reachable)고 표현합니다. garbage를 런타임에 찾는 알고리즘이나, 이를 수행하는 ..

공부 2023.01.16

Garbage Collection(1) - 탈출 분석과 참조 카운팅, 추적

우리는 프로그래밍을 하면서 다양한 한정적인 자원을 다룹니다. 네트워크 소켓이나, 메모리와 같이 사용한 후 돌려줘야할 것들이죠. 그 중에서, 메모리에 대한 이야기를 하려고 합니다. var a = new Integer(10); var b = a; System.out.println(a); a = null; // 아직 객체는 참조되는중 b = null; // 더 이상 해당 객체는 참조되지 않음 코드를 읽어보면, new Integer(10)은 더 이상 사용되지 않는 객체겠죠? 좀 더 일반화하자면, 모든 스레드에서 변수 혹은 그 변수의 멤버 등으로 참조하지 않는 객체는 제거해도 될겁니다. 이런 객체를 garbage라고 하고, 이를 찾는 것을 Garbage Collection이라고 합니다. garbage인지 어떻게 ..

공부 2023.01.16