백엔드

[백엔드 로드맵] 언어 배우기 - JAVA

do_hyuk 2024. 1. 4. 00:08

백엔드 개발자로서 다룰 수 있는 언어가 다양하다면 많은 장점이 있을 것이다. 하지만 여러 언어를 조금씩 파는 것보다

주 언어를 더 깊게 파는 것이 중요하다고 생각하여 Java에 대해 공부하였다.

1. Java 기본

1-1. 기동 원리

 

1. 시스템으로부터 메모리 할당(JVM)

2. Java 컴파일러에 의해. java 형식에서. class 형식으로 변환(바이트 코드 변환)

3. 클래스 로더에 의해 클래스 파일들은 JVM에 로드된다.

4. 실행기(Execution Engine)에 의해 클래스 파일을 해석하며 프로그램 실행

 

1-2. 변수

지역 변수 : 함수 안에 선언 / 함수가 실행될 때

전역 변수(필드 변수) : 함수 밖에 선언

  1. 클래스 변수 : static 변수
  2. 인스턴스 변수 : 객체 변수
변수의 사용처에 따라 적절하게 선언해야 한다.
1. static 변수의 무분별한 사용은 메모리에 악영향을 끼친다.
2. 병렬 프로그래밍에서 잘 못된 변수 사용은 의도치 않은 결과를 발생시킬 수 있다.

 

1-3. 스코프

- public : 어디서든 호출 가능

- protected : 같은 패키지 호출 가능(상속 패키지 접근 가능)

- default : 같은 패키지 호출 가능

- private : 같은 클래스 내에서만 호출 가능

 

1-4. 데이터 타입

primitive fields(기본형 타입) - 스택 영역

boolean
byte
short
int
long
char
float
double
참조형 데이터의 주소값

reference fields(참조형 타입) - 힙 영역

String
List


2. 메모리 영역

JVM 메모리 영역은 크게 세 영역으로 나눈다.

2-1. 메서드=클래스=static 영역

  • 클래스 로더에 의해 로딩된 클래스, 메서드, Static 변수, 전역 변수들이 저장되는 공간이다.
  • 프로그램 기동 시 가장 먼저 데이터가 저장되는 공간이다.

2-2. 힙 영역(GC 영역)

  • 런타임시 결정되는 참조형 데이터 타입이 저장되는 공간이다.
  • new 연산자를 통해 생성된 객체가 저장되는 공간이다.

2-3. 스택 영역

  • 런타임시 결정되는 기본형 데이터 타입이 저장되는 공간이다.
  • 지역변수, 리턴값, 참조변수의 주소값 등이 저장되는 공간이다.
  • 메서드 호출 시마다 메모리에 FILO로 하나씩 생성된다.
Java6까지는 new로 선언된 String만 Heap영역에 저장되었고, literal("")로 선언된 String은
String Constant Pool(Permanent)에 저장되었었다.
하지만 Java7부터 Perm 영역이 사라지고 Constant Pool의 저장 영역이 Heap으로 옮겨졌다.

 

기존의 Permanent 영역은 Metaspace라는 영역이 대체하였고, Perm에 있던 Constant Pool 영역은  Heap으로

옮겨지면서 이제 literal로 선언된 String도 GC 대상이 되었다.


3. Garbage Collection(GC)

GC란? Java에서 메모리 누수를 방지하기 위해 사용하는 방법으로 JVM의 힙 영역에 존재하는 오브젝트들 중에서

더 이상 사용되지 않는 오브젝트들을 지우고 해당 오브젝트에 할당되었던 메모리를 반환받는 작업을 일컫는다.

 

3-1. GC 구조

 

- Young Generation

  • Eden : 새로 생성되는 오브젝트들이 할당되는 영역
  • Survivor 0 : Minor GC에서 살아남은(Reachable) 오브젝트들이 Eden 영역으로부터 이동하는 영역
  • Survivor1 : Minor GC에서 살아남은 오브젝트들이 Survivor0 영역으로 부터 이동하는 영역

- OldGeneration

  • Old : Survivor1 영역에 존재하는 오브젝트들의 Age 값이 특정값을 넘겼을 때 이동하는 영역으로
            이 단계를 Promotion이라고 한다.
Old Generation 영역이 가득 차게 되면 Major GC가 발생한다.

 

3-2. GC 과정

아래 예제 코드를 통해 메모리 할당 과정을 살펴보고 어떻게 GC의 대상이 되는지 확인하겠다.

public class Main {
	public static void main(String[] args) {
		String url = "https://";	// 지역 변수, 참조형 데이터
		url += "skysoo1111.github.io";
		System.out.println(url);
	}
}

 

- String 변수 할당

String은 참조형 변수이기 때문에 힘 영역에 할당되고, 그 주소값은 스택 영역에 할당된다.

String url = "https://";

- String 변수 더하기

url 변수에 String 값을 더하면서 값이 변동되는데, 이때 기존에 할당된 값을 변경하는 것이 아니라

힙 영역에 새롭게 값이 할당된다.

url += "ehgur062300.github.io";

 

그로 인해 자연스레 기존에 힙 영역에 할당되었던 값은 더 이상 참조하지 않는 값이 되면서 

Unreachable 객체(GC 대상)가 된다.

 

이렇게 Unreachable 객체는 Minor GC  과정에서 삭제되고, 살아남은 Reachable 객체들은

Survivor0 → Survivor1 → Old  순으로 영역을 이동하고 이동하는 객체들의 Age는 증가한다.