상세 컨텐츠

본문 제목

JVM 힙(Heap), 가비지컬렉션(Garbage Collection)

기록 - 프로그래밍/Java

by wjjun 2024. 1. 5. 00:13

본문

 

힙 영역 (heap)

힙 영역은 객체, 배열이 생성되는 영역입니다. 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조합니다. 참조하는 변수나 필드가 없다면 더 이상 사용하지 않는 객체로 인식되어 Garbage Collector를 실행하여 힙 영역에서 참조되지 않는 객체를 제거합니다.

자바에서는 객체를 직접 제거하기 위한 방법은 제공하고 있지 않습니다.

 

 

JVM

컴퓨터의 모든 데이터 처리와 연산 작업을 수행하는 '마이크로프로세서'에서 Java 클래스 파일의 바이트코드를 실행하는 가상 인스턴스 입니다. JVM을 조정하면 WebLogic Server와 애플리케이션 성능에 영향을 미치게 됩니다.

 

 

WebLogic Server 이란

Java 기반의 애플리케이션 서버 소프트웨어(WAS)입니다. 이 서버로 대규모 애플리케이션 설계, 개발 및 배포할 수 있는 플랫폼을 제공하고 있습니다.

 

 

WebLogic Server 특징

스케일링 및 가용성 : 클러스터링, 로드 밸런싱을 지원하고 애플리케이션 가용성과 성능 향상에 기여합니다. 이를 통해 트래픽과 부하에 대응이 가능합니다.

분산 트랜잭션 관리 : 분산 트랜잭션 관리를 지원하여 여러 데이터 소스와 서비스 간에 일관된 트랜잭션 작업이 가능합니다.

보안 : 사용자 인증, 권한 부여, 데이터 암호화 등의 보안 사항을 제공합니다.

웹 서비스, RESTful 지원 : 웹 서비스와 RESTful 서비스의 개발, 배포를 지원합니다.

성능 최적화 : 모니터링 최적화 도구를 제공하여 애플리케이션 성능 개선이 가능합니다.

클라우드 호환성 : 클라우드 환경에서 사용할 수 있도록 설계되어 클라우드 플랫폼과 통합이 가능합니다.

개발자 도구 : 자바 애플리케이션을 개발하고 테스트 할 수 있는 다양한 개발 도구를 제공합니다.

 

 

HotSpot JVM Architecture

오라클에서 개발한 자바 가상 머신 중 하나로, 자바 프로그램을 실행하기 위해 사용됩니다.

Java HotSpot(TM) 64-Bit Server VM

 

Class files --> Class Loader Subsystem <--> Runtime Data Area <--> Execution Engine

Runtime Data Area (Method Area, Heap, Java Threads, Program Counter Register, Native Interal Threads)

Execution Engine (JIT Compiler, Garbage Collector)

 

 

HotSpot JVM 성능

성능 튜닝에서는 주요 JVM 구성요소가 있습니다. (1) Heap (2) JIT Compiler (3) Garbage Collector

힙 크기 조정과 상황에 따라 가장 적합한 가비지 수집기를 선택하는 것과 관련이 있습니다. 

 

민감도 : 애플리케이션이나 시스템에 요청된 데이터를 얼마나 빨리 응답하는가 입니다.

(1) 데스크탑 UI 이벤트에 응답하는 속도

(2) 웹사이트가 페이지를 반환하는 속도

(3) 데이터베이스 쿼리가 반환되는 속도

 

처리량 : 특정 기간동안 애플리케이션 작업량을 최대로 하는데 집중합니다. 처리량 측정방법

(1) 주어진 시간에 완료된 트랜잭션 수

(2) 일괄 프로그램이 한 시간 안에 완료할 수 있는 작업의 수

(3) 한 시간 안에 완료할 수 있는 데이터베이스 쿼리 수

 

 

 

HotSpot JVM 특징

JIT 컴파일러 : 자바 바이트 코드를 네이티브 코드로 컴파일 합니다. 컴파일된 코드는 런타임에서 실행하므로 빠른 속도로 실행이 가능합니다.

가비지 컬렉션 : JVM이 메모리 관리를 자동으로 할 수 있도록 가비지 컬렉션을 제공하여 복잡한 메모리 누수, 관리를 개발자 대신 처리하며 안정성을 제공합니다.

성능 최적화 : 프러그램 실행 특성을 분석하며 자주 실행되는 코드는 효율적으로 컴파일 하여 애플리케이션 성능을 향상시킵니다.

모니터링 도구 : 애플리케이션 성능과 동작을 분석하기 위해 필요한 다양한 진단할 수 있는 도구를 제공합니다.

 

 

 

가비지 컬렉션 (Garbage Collection) 기본 프로세스

힙 메모리에서 사용 중인 객체와 사용하지 않는 객체를 식별하여 삭제하는 프로세스를 의미합니다. 

 

1단계 (표시) : 프로세스의 첫 단계를 마킹이라 표현합니다. 마킹 단계에서 사용하는 객체와 사용하지 않는 객체를 식별하여 표식을 다르게 합니다.

2단계 (삭제) : 2단계 일반 삭제에서는 사용(참조)하지 않는 객체를 삭제하고 사용중인 객체는 비어있는 메모리 공간에 할당합니다.

2a단계 (압축 통한 삭제) : 2단계 일반 삭제가 완료되면 사용중인 객체를 한 곳으로 모아 압축할 수 있습니다. 이렇게 한 곳으로 압축해 놓으면 새로운 객체가 메모리에 할당될 때 쉽고 빠르게 처리 가능해집니다.

 

 

세대별 가비지 컬렉션 (Generational Garbage Collection)

메모리 관리를 개선하고 가비지 컬렉션을 효율적으로 만드는 목적을 갖고 있습니다.

보통의 객체 수명은 주기가 짧습니다. 할당된 시간이 늘수록 살아남는 객체의 수는 점점 적어집니다.

 

객체 할당을 통해 학습된 정보로 JVM 성능을 향상시키는데 사용됩니다. 그래서 힙은 작은 부분 세대로 분할합니다. Yound, Old Generation, Tenured, Permanent Generation 개념이 여기서 등장합니다.

 

 

Hotspot Heap Structure

Young Generation (Eden : die / S0 : survivor space / S1 : survivor space)

Old Generation (Tenured)

Permanent Generation (Permanent)

 

Young Generation은 새로운 객체가 할당되고 Young Generation 공간이 가득차면 Minor Garbage Collection이 발생합니다. 죽은 객체들은 삭제되고 남은 객체는 Old Generation 영역으로 이동합니다.

 

그리고 Minor Garbage Collection 발생하면 Stop the World 이벤트가 발생합니다. 이것은 애플리케이션의 모든 스레드가 중지되는 것을 의미합니다.

 

Old Generation은 오래 살아남은 객체를 저장하는 공간입니다. Young Generation 객체의 Age가 충족이되면 Old Generation 영역으로 이동합니다. 

 

 

Garbage Collection 과정

(1) 새로운 객체가 Eden 공간에 할당됩니다. 두 개의 Survivor 공간은 비어있습니다.

(2) Eden 공간이 가득 차면 Minor Gabage Collection 발생합니다.

(3) 참조되고 있는 객체는 Survivor 공간으로 이동합니다. 참조되지 않는 객체는 Eden 공간에서 삭제됩니다.

(4) 다음 Minor GC에서도 Eden 공간에 동일하게 일이 발생합니다. 참조되지 않은 객체는 삭제되고 참조된 객체는 Survivor 공간으로 이동합니다. 다만, 여기서는 두 번째 Survivor 2번 공간으로 이동하게 됩니다.

첫 번째 Survivor 1번 공간에서 살아남은 객체는 수명이 증가하여 Survivor 2번 공간으로 이동합니다. 그리고 Eden과 Survivor 1번 공간의 객체를 삭제합니다. 이제 Survivor 공간에 수명이 다른 객체가 존재하게 됩니다.

(5) 다음 Minor GC 에서도 동일 프로세스가 반복됩니다. 이번에는 생존자 공간이 전환됩니다. 참조되고 있는 객체는 Survivor 1번 공간으로 이동합니다. 살아남은 객체의 수명은 증가합니다. 그리고 Eden과 Survivor 2번 공간이 삭제됩니다.

(6) Minor GC 이후 오래된 객체는 특정 Age 임계값에 도달하면 Young Generation 에서 Old Generation으로 승격(Promotion)하게 됩니다.

 

Garbage Collection 참고

 

Java Garbage Collection Basics

Java Overview Java is a programming language and computing platform first released by Sun Microsystems in 1995. It is the underlying technology that powers Java programs including utilities, games, and business applications. Java runs on more than 850 mill

www.oracle.com

 

관련글 더보기

댓글 영역