자바의 메모리 구조, 프로세스, 쓰레드, String에 대해서 정리

자바 메모리 구조

Java Virtual Machine, 즉 자바 가상 머신의 약자

자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고,

그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다.

JVM의 메모리 공간(Runtime Data Area)은 크게

Method(Static) 영역, Stack 영역, Heap 영역으로 구분한다.

JVM은 Java와 OS(운영체제) 사이에서 중개자 역할을 수행하여

Java가 OS(운영체제)에 구애받지 않고 독립적으로 작동이 가능하다.

또한 가장 중요한 메모리 관리, Garbage collection(가비지 컬렉션)을 수행한다.

1. Method(Static) area

클래스, 인터페이스, 메서드, 필드 등의 대한 정보를 저장 , JVM 구동 시작 시에 생성이 되며, 종료 시까지 유지되는 공통 영역이다.

2. Heap area

인스턴스가 생성되는 공간 해당 영역이 가진 데이터는 모든 Java Stack 영역에서 참조되어, Thread 간 공유가 된다.

garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

3. Stack area

메서드 작업에서 필요한 메모리 공간 제공 각 Thread 별로 따로 할당되는 영역.

호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장

OOME란?

java. lang.OutOfMemoryError JVM이 Heap Memory에 더 이상 Object를 할당 X - 발생.

해결방법으로는

1. 가장 쉬운 방법 : -Xmx 옵션을 사용하여 Heap Memory의 크기를 증가시키는 방법

2. OOME가 발생한 시점에 생성된 Heap Dump 분석을 기반으로 쓸데없이 많은 Memory를 사용하거나 
       
   Memory Leak을 유발하는 로직을 찾아내어 수정

프로세스와 스레드

프로세스는 실행 중인 프로그램을 일컫으며,

운영체제에서 할당받은 자원(메모리, CPU 시간 등)을 이용하여 독립적으로 실행

스레드는 프로세스 내에서 실행되는 작업 단위로,

하나의 프로세스에서 여러 개의 스레드를 생성하여 병렬적으로 실행할 수 있다.

스레드는 프로세스 내의 자원을 공유하기 때문에, 동일한 주소 공간과 자원을 가지며,

각각의 스레드는 독립적으로 실행될 수 있다.

일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법을

싱글 스레드 프로그래밍(Single Thread Programming)이라고 한다.

반면, 동일 어드레스 공간의 메모리를 공유하면서 병렬로 처리하는 방법을

멀티 스레드 프로그래밍(Multi Thread Programming)이라고 한다.

String, StringBuilder, StringBuffer 차이점

String은 불변입니다.

따라서 새로운 값을 할당할 때마다 새로운 클래스에 대한 객체가 생성된다.

StringBuilder와 StringBuffer는 이런 String의 특징때문에 사용하는 가변타입이라고 볼 수 있다.

StringBuilder와 StringBuffer는 Thread-safe 여부의 차이가 있다.

StringBuilder는 Thread-safe하지 않는다.

따라서 Multi-Thread 환경에서 사용할 때는 StringBuffer를 사용한다.

Thread-safe란?

멀티 쓰레드 프로그래밍에서,

어떤 공유 자원에 여러 쓰레드가 동시에 접근해도,

프로그램 실행에 문제가 없는 상태를 의미