개발자 노트

자바 메모리 구조 본문

컴퓨터 언어/Java

자바 메모리 구조

jurogrammer 2020. 5. 19. 12:34

자바로 프로젝트를 진행하며 객체 관리가 어떻게 되는지 감이 안잡혀서 메모리 구조 기초 지식을 쌓아보고자 한다.
출처 :
https://www.geeksforgeeks.org/java-memory-management/
https://d2.naver.com/helloworld/1329

자바 메모리 구조

왜 Java Memory Management를 배워야 하는가?

JVM이 관리하지 않는 object에 의해 crash발생 가능.

더 나은 성능을 가진 app을 만들 수 있음.

Java Memory Structure

JVM(Java Virtual Machine)

  • jvm은 runtime data area를 결정한다.
  • 메모리는 thread에 의해, jvm에 의해 할당될 수 있으나 jvm에 의해 할당된 메모리는 반드시 jvm이 해제 시켜주어야 한다.

JavaMemory Area Parts

앞으로 5개의 메모리 영역에 대해 설명한다. 이때 관심있게 봐야할 부분은

  • 언제 area가 생성되는가
  • 이 영역에 gc가 발생하는가?
  • 언제 gc가 발생하는지
  • 어떤 데이터들이 할당되는지
  • 메모리 사이즈가 동적-정적 할당 되는지

Heap area

  • runtime data area가 공유된다
  • 실제 object가 저장된다.(reference가 아님. 변수명같은 것이 아니란 뜻)
    • Scanner sc = new Scanner(System.in);
      sc는 stack 영역에, Scanner Class 객체는 heap 영역에 저장된다.
  • 메모리 사이즈는 시스템 설정에 따라 동적-정적으로 정해진다. 그리고 유저가 변경할 수 있도록 제어권을 줌.
  • 따라서 heap 영역에 대해 GC는 반드시 수행되어야 함.

Method Area

  • Heap area의 논리적인 부분.
  • jvm이 실행될 때 생성된다.
  • 이 영역에 할당되는 데이터 종류는 다음과 같다.
    • class structres
    • method data
    • constructor field data
    • interfaces
    • special method (used in class)
  • 메모리 사이즈는 계산에 따라 고정될 수도, 커질 수도 있다.(expended)
  • 인접할 필요는 없다. (Needs not to be contiguous).
    • (무슨 뜻?) -> 아마 논리적인 메모리 부분에서 메모리 주소가 반드시 인접하도록 데이터를 놓아줄 필요가 없다는 뜻 같다.
  • 비록 Heap 영역의 논리적인 부분이나, GC를 할수도 안할 수도 있다.

JVM Stacks

  • thread가 생성될 때 생성된다.
  • 중간 결과나 데이터를 담을 때 사용된다. 즉, 운영체제에서 사용하는 stack처럼 사용되는 메모리 공간이다.
  • stack 메모리의 크기는 정적-동적 선택가능. stack이 생성될 때 다른 stack과 독립적으로 설정가능하다.
  • 인접할 필요는 없다 (Needs not to be contiguous)

Native method Stacks

  • C stack이라고도 부른다.
    • C언어의 C라 보면 된다.
  • Java language로 작성되어 있지 않은 부분.
  • thread가 생성될 때 각 thread에게 할당.
  • 정적-동적일 수 있음

Program counter register

  • 특정한 메소드를 수행하고 있는 각 JVM thread는 이 메소드와 관련된 pc register를 가지게 된다.
  • non native methods는 JVM instruction 주소를 이 영역에 저장한다.
  • non native methods는 pc가 정해지지 않는다.(undefined)
  • PC register는 return address나 특정 플랫폼의 native pointer를 저장할 수 있다.

Working of a Garbage Collector

  • JVM이 이 프로세스를 작동시킨다.
  • age기법을 통해 objects를 그룹화한다.
    • age는 object가 얼마나 많은 clock cycle동안 살아남는가로 결정.
  • System.gc()나 Runtime.gc()는 JVM에게 GC를 요청하는 것이다. 하지만! 결국 결정은 JVM이 하기 때문에 GC를 하지 않을 수 있다.
    • 이 명령어는 사용하지 않도록 한다. GC가 발생할 때 stop-the-world라고 시스템이 멈추기 때문에 하지 않도록 한다.
    • 출처 : https://d2.naver.com/helloworld/1329
반응형

'컴퓨터 언어 > Java' 카테고리의 다른 글

Collection 정리  (0) 2022.06.30
Exception  (0) 2020.11.08
[eclipse]java version 14이용 문제  (0) 2020.04.22
Generic  (0) 2020.04.16
enum에 대하여  (0) 2020.04.16
Comments