본문 바로가기

Language/자바

[Java] The Java Memory Architecture [1.Act]

https://blog.codecentric.de/en/2010/01/java-outofmemoryerror-1-akt-das-java-memory-modell-stellt-sich-vor/ 참조


Purpose

* OOM 시리즈에 대하여 자바 메모리 구조를 자세하게 소개하고, 이러한 에러의 원인과 분석에 대한 툴과 메소드를

  다룸.

* JVM 6 버전이며, JVM 의 Heap 영역만 다룸.


OOM (OutOfMemoryError)

* 자바 가상 머신이 객체를 할당할 수 없을 때 던짐. 메모리가 없어서. GC에 의해 더 이상 이용할 수 없는



Desc

* 모든 쓰레드에서 접근 가능한 메모리 영역과 오직 한 스레드만 접근할 수 있는 메모리 영역을 구분해서 

  설명. 두개의 영역은 모든 스레드가 이용할 수 있으며, Method Area, Heap 이라 한다.

* 메소드 영역은 클래스 정보를 저장할 책임이 있다. 클래스 로더는 클래스의 바이트코드를 로드해

  이것을 JVM 에 전달한다. JVM 은 바이트코드의 내부적 클래스 대표를 만들고 메소드 영역에 이것을 저장함.

  하나의 클래스 내부적 대표는 다음 데이터 영역을 가지고 있음.

  - Runtime Constant Pool Numeric constants of the class of types int, long, float or double, String-constants 

    and symbolic references to all methods, attributes and types of this class.

    런타임 상수 풀 int, long, float 또는 double 유형의 클래스의 숫자 상수,이 클래스의 모든 메서드, 특성 및 유형에 

    대한 문자열 상수 및 기호식 참조입니다.

 - 메소드 코드 구현체, 생성자 포함

 - Attributes A list of all named attributes of this class.

   속성이 클래스의 모든 명명 된 속성 목록입니다. (클래스에 선언된 명명된 속성들, 전역변수 말하는거 같은데)

 - FieldsValues of all fields of this class as references to the Runtime Constant Pool

    이 클래스의 모든 필드의 FieldsValue는 런타임 상수 풀에 대한 참조로 사용됩니다.


* 메소드 영역은 힙의 영역이며, 런타임 시에 만들어짐. 메소드 영역의 크기는 고정이거나 동적이며, GC를 제공하지 

  않음.


* Heap 은 JVM 내에 모든 쓰레드가 이용 가능. 자바 힙은 런타임시의 모든 클래스들의 인스턴스와 배열을 관리한다.

  Heap 은 JVM 스타트 할 때 만들어지며, 사이즈는 고정이거나 동적임. GC는 명세되있지 않고 프로그래머들이

  직접 명시할 수 없게 되있음.

* Sun HotSpot 을 기준으로 Heap 은 2가지 영역으로 나뉘어있다. Young 과 Tenured. 메소드 영역은 분리된 영역에

  구현되는데, 퍼머넌트 영역에. Sun HotSpot JVM 의 메모리 구조 예시는 JVM 명세가 어떻게 JVM 내부에 메모리를

  정의하는지 일반적으로 보여주지만, 특별 최적화 구현에 대한 여지도 충분히 남겨놓았다.

* In addition to the heap and method area, that are available for all threads of a JVM, every thread also has 

  exclusive access to memory that is created for each thread

  JVM의 모든 스레드에서 사용할 수있는 힙 및 메소드 영역 외에도 모든 스레드는 각 스레드에 대해 작성된 

  메모리에 독점적으로 액세스 할 수 있습니다.

  - PC Register The Program Counter register. The register points to the current JVM instruction of the method the      

    thread is executing, if the method is not a native method. If it is a native method the content of 

    the PC register is not defined.

    PC 레지스터 프로그램 카운터 레지스터. 메소드가 원시 메소드가 아닌 경우 레지스터는 스레드가 실행중인 메소드의 

    현재 JVM 명령을 가리 킵니다. 네이티브 메소드의 경우, PC 레지스터의 내용은 정의되지 않습니다.

  - Java Virtual Machine Stack Each thread gets its own stack on which so called Frames are pushed 

    for each method the thread currently executed.

    자바 가상 머신 스택 각 스레드는 소위 프레임이 스레드가 현재 실행되는 각 메소드에 대해 푸시되는 

    자체 스택을 가져옵니다.

    이것은 근처 method calls 의 stack 에 많은 프레임이 있다 라는 것을 의미. 그러나 한 스레드에서는 

    동시에 하나만 active 된다. 프레임은 메소드의 로컬 변수, method class의 런타임 상수 풀에 대한 참조, JVM 

    operations의 실행에 대한 명령어 스택을 가지고 있다.

  - Native Methode Stack Native methods 는 이것 자신만의 stack 을 가지는데 'C-Stack' 이라 한다.

 

* 지금까지 메모리 영역, 힙영역, 스택영역에 대해 얘기했는데 OOM 은 이 모든 메모리 영역에서 발생함.

* 가비지 컬렉터가 새로운 객체에 대해 충분한 메모리를 선언해주지 못할 때, 힙에서 OOM 이 발생한다.

  만약 새로운 클래스를 만드는 메소드 영역에서 충분한 메모리가 없으면 permanent 영역에서 OOM 이 발생한다.

  스레드 배타적인 메모리 영역에서는 'unable to create new native thread' 가 발생.

  OS 영역에서 메모리가 없을 때는 'java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of

  Swap space?'


    





'Language > 자바' 카테고리의 다른 글

[Java] Entity annotation  (0) 2017.01.05
[Java] Java Memory Leaks et al. [2. Act]  (0) 2016.12.19
[Java] Create and Understand Java HeapDumps  (0) 2016.12.19
자바 Comparator 구현  (0) 2016.10.25
객체지향의 개념  (0) 2016.09.26