본문 바로가기
프로그래밍/스프링 자바

[Java] JVM, 자바 메모리, GC

by 커피는아아 2021. 7. 3.
반응형

JVM

  • 자바 가상 머신
  • 자바 컴파일러로 .java파일을 컴파일한 .class() 바이트코드를 OS에 맞게 실행해 주는 프로그램
  • JIT, 운영체제에 영향을 받지 않고 돌아가기 때문에 플랫폼에 의존하지 않을 수 있다.
  • 가비지 컬렉션를 수행한다.

자바 메모리 영역

  • 메소드(클래스, 스태틱(정적)) 영역
    • 하나의 JAVA 파일은 크게 필드(field), 생성자(constructor), 메소드(method)로 구성된다. 그중 필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다. Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다. 다르게 말하면 전역변수가 프로그램이 종료될 때까지 어디서든 사용이 가능한 이유이기도 하다. 따라서 전역변수를 무분별하게 많이 사용하다 보면 메모리가 부족할 우려가 있어 필요한 변수만 사용할 필요가 있다
  • 스택 영역
    • 우리가 현재까지 작성하던 메소드 내에서 정의하는 기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간이 Stack(스택) 영역이다. 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.
  • 힙 영역 (GC 대상)
    • 인스턴스를 생성하는 방법은 "클래스 변수 = new 클래스();" 라는 것.
    • 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다.
    • 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된
      Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값)을 new 연산자를 통해 리턴 받는다.
    • 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다. 이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.

GC란?

  • 가비지 컬렉션은 더이상 필요하지 않은 메모리를 정리해주는 프로그램을 말한다.
    • JVM에서는 힙영역에서 사용하지 않는 객체를 삭제하는 과정을 말한다.
    • 가비지컬렉션은 동적으로 할당한 메모리 영역중 사용하지 않은 영역을 탐지하여 해제하는 기능

GC 수거 대상 (Reachability)

  • 가비지 컬렉션이 동작할 때 객체가 참조하고 있으면 mark를 하며 마킹되지 않은 객체는 sweep 대상이 된다.
    • 참조 안한다는 것은 String a = null; 같은 경우를 말한다.

힙 메모리 구조

  • Young 제너레이션
    • eden
    • Survivor space 1
    • Survivor space 2
  • old 제너레이션
  • permanent 영역

구조를 나눈 이유

  • 대부분의 객체는 금방 접근 불가능한(unreachable) 상태가 된다
    • 즉 금방 garbage가 된다.
  • 오래도니 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
  • 즉, 새로 생성된 객체가 메모리에 많이 차지한다.

가비지 컬렉션 과정 (mark and sweep Compact)

  1. 어떠한 새로운 객체가 들어오면 Eden에 할당한다.
  2. Eden space가 가득차게 되면 miner GC가 시작된다.
  3. Mark 된 (참조되는 객체) 것은 Survivor으로 이동되어지고, 아닌 것(참조되지 않는 것) 삭제된다.
  4. Survivor는 순서가 정해지는 것이 아니라 GC 과정에서 스위칭되며 비어있는 Survivor가 반드시 존재해야된다.
  5. 한번의 miner GC 과정에서 살아남으면 age가 증가한다.
  6. 특정한 임계값이 넘어가면 Old 제너레이션으로 넘어간다.
  7. Old 도 마찬가지로 가득차게 되면 Major GC가 수행되고 그 후 Compact 과정이 일어난다.

Stop the world

  • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
    • Gc를 실행하는 스레드왜 모든 스레드가 작업을 중단한다

GC 방식

  • Serial GC (스레드가 1개)
  • Parallel GC
    • 자바8의 default GC
    • Young 영역의 GC를 멀티스레드로 수행
  • G1 gc
    • G1 GC의 가장 큰 장점은 성능이다.
    • 자바 9버전 이후에 사용됨