2024/12 77

[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 JDK 7 ~ JDK 11 내의 GC 기술고성능 / 저지연 컬렉터들과 구분됨 1. 구세대시리얼 올드 컬렉터가장 기초적이고 오래된 컬렉터Mark-Compact 알고리즘단일 스레드메모리 사용량이 적음멀티코어 시스템에서 성능이 저하됨 매개변수-XX: +UseSerialGC: 시리얼 올드 컬렉터와 신세대 시리얼 컬렉터가 모두 활성화됨 CMS 컬렉터동시성을 지원하는 최초의 컬렉터GC 스레드와 사용자 스레드가 동시에 실행됨일시 정지 시간을 최소로 줄이는데 집중구세대가 68% 이상 차면 동작함 Mark-Sweep 알고리즘최초 표시 (Stop-The-World): GC 루트에서 직접 참조되는 객체 표시동시 표시: GC 루트에서 도달 가능한 모든 객..

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-3. 가비지 컬렉터와 메모리 할당 전략: 구현

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 루트 노드 열거GC 루트 노드로부터 참조 체인을 찾는 작업스택 프레임을 비롯하여 정적 변수, 레지스터 등을 포함하여 추적루트 노드를 열거하려면 stop the world를 피할 수 없음 OopMapObject Offset Map각 스레드의 스택에 있는 객체 참조의 위치를 기록하는 맵안전 지점이라는 특정한 위치에만 기록OopMap을 모든 명령어에 생성하지 않음 객체 이동 지원GC에 의해 참조가 변경될 경우, 스레드 스택에 있는 참조가 올바르게 갱신되도록 합니다. 2. 안전안전 지점일시 정지 상태를 트리거하는 지점jvm이 스레드의 상태를 안전하게 분석하고, 참조 관계를 변경하지 않을 것임을 보장 자발적 멈춤플래그 비트 사용각 스레드..

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-2. 가비지 컬렉터와 메모리 할당 전략: 가비지 컬렉션

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 세대 단위 컬렉션 이론대부분의 GC들의 근간 이론객체들을 나이에 따라 각기 다른 영역에 할당죽을 운명인 객체들을 한데 모음살아남을 객체를 나이가 있는 곳의 영역에 유지 가설약한 세대 가설대다수 객체는 일찍 죽음메모리 접근 최적화Young Generation을 대상으로 GC를 자주 실행시킴 강한 세대 가설살아남은 횟수가 늘어날수록, 더 오래 살 가능성이 높음메모리 접근 최적화장기 생존하는 객체는 Old Generation로 이동Old Generation를 대상으로 GC를 자주 실행하지 않음 세대 간 참조 가설세대 간 참조의 개수는 같은 세대 안에서의 참조보다 훨씬 적음상호 참조 관계두 객체는 삶과 죽음을 함께하는 경향이 있음결국 ..

Java 2024.12.21

[JVM 밑바닥까지 파헤치기] 3-1. 가비지 컬렉터와 메모리 할당 전략: 회수

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. 참조Strong Reference프로그램 코드에서 할당된 참조특정 객체에 강한 참조 관계가 하나라도 존재한다면, 해당 객체는 GC의 대상이 되지 않음 Soft ReferenceSoftReference softRef = new SoftReference(strongRef);메모리가 부족할 경우에만 GC의 대상이 되는 참조캐싱 시스템 Weak ReferenceString strong = new String("I am strong");WeakReference weakRef = new WeakReference(strong);strong = null;System.gc();더 이상 강한 참조에 의해 참조되지 않을 경우, 즉시 수집될 수 있는 ..

Java 2024.12.19

[JVM 밑바닥까지 파헤치기] 2. 자바 메모리 영역과 메모리 오버플로

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. 런타임 데이터 영역프로그램 카운터스레드의 현재 실행중인 명령어 바이트코드 줄 번호 표시기바이트코드 인터프리터는 이 카운터의 값을 바꿔 다음에 실행할 바이트코드 명령어를 기억함멀티스레딩 시, 가장 최근에 실행된 명령어의 지점을 복원하는데 쓰임네이티브 메서드 실행 시, 비어있음 JVM 스택메서드를 실행하는 스레드의 메모리 모델각 메서드가 호출될 때마다 스택 프레임을 만들어 관련 정보를 기록 지역 변수 테이블컴파일 타임 정보 기본 데이터 타입, 객체 참조, 반환 주소 타입슬롯 단위 (32bit) 피연산자 스택계산에 필요한 값 저장 동적 링크 및 메서드 반환값호출자와 피호출자 간의 관계 유지 네이티브 메서드 스택힙자바 애플리케이션에서 ..

Java 2024.12.19

[JVM 밑바닥까지 파헤치기] 1. 자바 기술 시스템 소개

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 자바 가상 머신 제품군Sun Classic VM세계 최초의 상용 JVMJDK 1.0자바 코드를 순전히 인터프리터 방식으로 실행 단점컴파일하는 시간이 많이 들어 실행 효율이 좋지 못함 Exact VM정확한 메모리 관리가상 머신이 메모리의 특정 주소 데이터를 알 수 있음 HotSpot VMOpenJDK의 기본 JVM 기능핫 코드 감지컴파일 했을 때 효과를 가장 크게 볼 수 있는 코드 영역을 컴파일해둠런타임에 알아내어 JIT 컴파일러에 알려줌온스택 치환런타임에 컴파일한 소스로 스택을 치환함 Graal VMcross-languageJava, Kotlin, Scala, GroovyJavascript, Ruby, Python, WebAs..

Java 2024.12.19

[헤드퍼스트 디자인 패턴] 12-6. 비지터 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 비지터 패턴다양한 객체에 새로운 기능을 추가할 경우 구성요소Visitor새로운 기능을 추가하는 객체각 객체의 accept 메소드를 호출하여 자신을 전달 ConcreteVisitor각 Element에 대해 수행할 작업 정의 Elementaccept() 메서드를 정의한 객체자신이 받아들일 수 있는 비지터를 정의 장점객체의 구조를 변경하지 않음새로운 기능 추가 용이비지터만 추가하면 됨 2. MenuMenuComponent// 메뉴 항목을 나타내는 요소 클래스public abstract class MenuComponent { public abstract void accept(MenuVisitor visitor);} Menupubl..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-5. 프로토타입 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 프로토타입 패턴어떤 객체의 인스턴스를 만들 때 자원이 많이 들거나 복잡할 경우 장점성능기존 인스턴스를 복사 (생성 X)클라이언트 코드에서 어떤 클래스의 인스턴스를 만드는지 모름 2. GameMonster// Prototype 인터페이스public interface Monster extends Cloneable { Monster clone(); void display(); // 몬스터의 모양을 화면에 표시}// 기본 몬스터 클래스public class DefaultMonster implements Monster { private String shape; // 몬스터의 모양 private String color;..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-4. 플라이웨이트 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 플라이웨이트 패턴객체를 최대한 재사용하여 메모리를 절약하는 디자인 패턴인스턴스 하나로 여러 개의 가상 인스턴스를 제공하고 싶을 경우 구성 요소Intrinsic State여러 객체 간에 공유되는 상태불변 Extrinsic State공유되지 않고 개별 객체에 따라 달라지는 상태호출 시 클라이언트가 전달 2. TreeManagerimport java.util.ArrayList;import java.util.List;public class TreeManager { private final List trees = new ArrayList(); // 나무 추가 (외재적 상태를 포함한 TreeLocation 객체 생성) pub..

Java/Design Pattern 2024.12.19

[헤드퍼스트 디자인 패턴] 12-3. 책임 연쇄 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 책임 연쇄 패턴1개의 요청을 2개 이상의 객체에서 처리해야 할 경우 사용되는 패턴 객체 사슬순차적으로 요청을 처리함자신이 처리할 수 있는 요청만 처리나머지는 다음 객체에 위임 장점요청을 보낸 쪽과 받는 쪽을 분리할 수 있음사슬을 동적으로 수정할 수 있음 2. RemoteControlpublic class RemoteControl { private Handler handlerChain; public void setHandlerChain(Handler handlerChain) { this.handlerChain = handlerChain; } public void pressButton(String r..

Java/Design Pattern 2024.12.19