티스토리 뷰

3~4장은 연산자,조건,반복문 기본적인 내용임으로 PASS


1. Runtime Data Area : JVM 이 시작되고 운영체제에서 할당받은 메모리 영역.


Runtime Data Areas


Runtime Data Areas & Heap Area



  • Method (Static) Area: JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장되는 공간으로, 모든 스레드에서 공유한다.
  • Runtime Constant Pool
    • 메소드 영역에 포함되지만 독자적 중요성이 있다.
    • 클래스 파일 constant_pool 테이블에 해당하는 영역이다.
    • 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.
    • JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다.
  • 메소드 영역/런타임 상수 풀의 사용기간 및 스레드 공유 범위
    • JVM 시작시 생성
    • 프로그램 종료 시까지
    • 명시적으로 null 선언 시
    • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
    • 모든 스레드에서 공유한다.

  • Heap Area
    • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
    • New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.
    • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
    • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.
    • 힙 영역의 사용기간 및 스레드 공유 범위
      • 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
      • GC(Garbage Collection) 대상
      • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
      • 모든 스레드에서 공유한다.
  • Stack Area
    • 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
    • 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
    • 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
    • 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장
    • 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
    • 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
    • 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

  • PC Register
    • 현재 수행 중인 JVM 명령 주소를 갖는다.
    • 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
    • CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.
    • 연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
  • Native Method Stack Area
    • 자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.
    • 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.
    • 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.


2. String 참조 변수에 대한 이해


String a = "Jinhyy";

String b = new String("Jinhyy");


첫 번째 초기화 방법은 Heap 영역에 Jinhyy 리터럴로 생성된 스트링 객체를 만든다.

후에 String c = "Jinhyy" 라고 한다면, 자바에서 알아서 Jinhyy 값을 갖는 이미 만들어진 스트링 객체를 찾아서 참조한다.

(그래서, a == c 는 true 이다.)


하지만, new 를 쓰는 경우, 같은 리터럴이 이미 존재하더라도, 새로운 객체를 Heap 영역에 만들어 준다. 그래서 Heap 메모리 주소가 틀리다.




* 정리 *

JVM의 메모리 구조는 크게 메소드(클래스관련 필드,메소드 데이터 저장), 힙영역(객체 or 배열), 스택영역(변수, 스레드마다 한개씩) 으로 구분된다.


String 은 참조 변수이자 객체이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함