자바의 메모리 구조
가비지 컬렉터의 원리는?
가비지 컬렉터는 자바의 메모리 관리 방법 중 하나로, JVM이 Heap 영역에서 동적으로 할당한 메모리 영역 중에서 사용하지 않는 객체들을 주기적으로 제거하는 기능을 말한다.
- 프로그램이 생성한 모든 객체를 추적하고 각 객체가 참조하는 횟수를 카운트하거나 더 이상 추적되지 않는지를 추적하는 방식으로 이루어진다.
- 가비지 컬렉터는 도달 가능성 분석 즉, 어떤 객체들이 더 이상 참조되지 않고 접근되지 않는지를 판단한다. 여기서 직접적이거나 간접적으로라도 참조될 수 있는 객체는 메모리에서 해체되지 않는다.
- 이러한 접근 하지 않는 객체들을 해체하고 메모리를 회수한다.
- 이를 통해 프로그램은 메모리를 효율적으로 사용할 수 있게 된다.
스태틱(Static)이 호출되면 메모리 공간의 변화는?
- 메모리 공간에는 아무런 변화가 없다. 정적 메서드나 변수는 클래스 수준에 속하므로, 다른 클래스의 인스턴스와는 독립적으로 동작한다. 클래스가 이미 로드 될때 스태틱 메서드나 변수는 이미 메모리에 할당되어있다.
재귀호출과 메모리 공간
재귀의 깊이가 깊어지면 왜 스택오버플로우가 발생할까?
재귀호출은 함수가 자기 자신을 반복적으로 호출하는 것을 의미한다.
이때, 함수는 호출 스택에 새로운 프레임을 추가하게 되는데 여기에는 함수의 매개변수, 반환 주소 등이 저장된다.
재귀 함수의 깊이가 깊어지면 호출 스택에 쌓이는 프레임의 수가 증가하게 되는데, 호출 스택의 용량을 초과하면 스택 오버플로우가 발생하게 된다.
정리하자면, 호출 스택이 메모리의 한계에 도달하여 더 이상 프레임을 추가할 수 없을 때 발생한다.
재귀호출이 되었을 때 메모리 공간이 어떻게 변화할까?
메모리 공간은 재귀 호출이 깊어질 수 호출 스택에 쌓이는 프레임 수가 증가한다. 이때, 호출 스택의 용량을 초과하게 되면 스택 오버플로우가 발생할 수 있으므로, 재귀의 깊이를 적절하게 조절하는 등의 조치를 취하여 스택 오버플로우를 방지하여야 한다.
전역변수와 지역변수
전역변수와 지역변수의 차이는?
- 전역 변수는 프로그램의 전역에 접근할 수 있는 변수다. 전역변수는 프로그램이 실행될 때부터 메모리에 할당되어 프로그램이 종료될 때까지 유지된다. 보통 전역변수는 프로그램 전체에서 공유되어야 하는 데이터를 저장하는데 사용된다. 주의점은 프로그램의 어느 곳에서든지 값을 변할 수 있으므로 주의해서 사용해야한다.
- 지역변수는 특정한 함수나 블록 내에서만 접근할 수 있는 변수다. 해당 함수나 블록이 실행될 때 생성되고, 실행이 종료되면 메모리에서 사라진다. 실행 될때마다 메모리에 새로 할당되고, 실행이 종료되면 자동으로 메모리에서 해제된다. 임시적인 데이터를 저장하는데 사용되며, 메모리 관리에도 효율적이다.
멀티프로세스와 멀티스레드
프로세스와 스레드란 무엇일까?
- 프로세스는 실행 중인 프로그램을 말한다. 프로세스는 독립적인 메모리 공간을 가지고 독립적으로 실행된다.
- 스레드는 프로세스 내에서 실행되는 단위로 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 스레드는 같은 프로세스 내의 메모리를 공유한다.
멀티스레드 프로그래밍에서 동기화가 필요한 이유
- 여러 스레드가 동시에 같은 메모리에 접근 할때 데이터 일관성과 정확성을 보장하기 위해서 필요하다. 동기화를 하지 않으면 경쟁 조건이나 교착상태가 발생할 수 있는데, 예를 들어 두 개의 스레드가 같은 변수를 증가시키고자 할때, A가 읽고 증가시키기 전에 B가 증가를 시키는 경우 실행 순서가 예상치 못해 변경 될 수 있다. 이를 방지하고자 자바에서는 synchronized 키워드를 통해 동기화 시키고, 또는 Lock 인터페이스와 구현체들을 사용해서 동기화를 제어할 수 있다.
멀티 프로세스 대신 멀티 스레드를 사용하는 이유
- 멀티 스레드를 사용하는 주된 이유는 자원과 실행 효율성 때문이다. 멀티스레드는 프로세스의 메모리와 자원을 공유하는 것에 비해 멀티 프로세스는 독립적인 메모리 공간을 가져서 자원 공유가 어렵다. 이때, 멀티 프로세스는 프로세스 간 통신(IPC)가 필요하고 프로세스 간의 전환에는 더 많은 비용이 소모되는데, 멀티스레드는 공유하므로 데이터를 손쉽게 공유할 수 있고, 여러 작업들을 동시에 처리할 수 있으므로 응답성이 향상될 수 있기 때문에 사용한다.