ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 메모리 구조(Runtime Data Area)
    Java/Basics 2019. 5. 16. 10:59


    ■Runtime Data Area


    Runtime Data Area는 JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 


    영역이다. WAS의 성능에 문제가 발생했을 때, 대부분 이 영역들이 원인이 된다.


    (Memory Leak 혹은 GC)


    Runtime Data Area는 5가지로 구분된다.


    PC Register 

    JVM stack 

     Native Method stack

     Heap

     Method Area


    위 그림에서 볼 수 있다시피, 좌측 3개의 영역은 Thread별로 생성되고


    우측 2개의 영역은 모든 Thread가 공유한다.


    ●PC Register (Thread별로 1개씩 존재)


    Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다.


    (Register-Base가 아닌 Stack-base로 작동)


    현재 수행 중인 JVM Instruction 의 주소를 가진다


    ●JVM stack (Thread별로 1개씩 존재)


    Thread의 Method가 호출될 때 수행 정보(메소드 호출 주소, 매개 변수, 지역 변수, 


    연산 스택)가 Frame 이라는 단위로 JVM stack에 저장된다.


    그리고 Method 호출이 종료될 때 stack에서 제거된다.


    ●Native Method stack (Thread별로 1개씩 존재)


    Java 외의 언어로 작성된 네이티브 코드들을 위한 stack 


    (ex JNI를 통해 호출되는 C/C++ 등의 코드)


    (ex Thread.currentThread())


    ●Heap (모든 Thread가 공유)


    인스턴스와 배열이 동적으로 생성되는 공간.


    그리고 Garbage Collection의 대상이 되는 영역. 개발자는 객체를 제거하기


    위해 별도의 코드를 작성할 필요가 없고 오히려 부작용만 낳을 가능성이 큼.


    모든 Thread가 공유하기 때문에 동기화 문제가 발생할 수 있다.


    Heap 구조(with GC) 자세히 알아보기


    ●Method Area (모든 Thread가 공유)


    Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다.


    이 영역에 등록된 class만이 Heap에 생성될 수 있다.


    사실 Method Area는 논리적으로 Heap에 포함된다.


    더 구제적으로는 Heap의 PermGen이라는 영역에 속한 영역인데, 


    Java 8 이후로는 Metaspace라는 OS가 관리하는 영역으로 옮겨지게 된다.


    Type Information

    - Type(class or interface)의 전체 이름

    - Type의 직계 하위 클래스 전체 이름

    - Type의 class/interface 여부

    - Type의 modifier (public / abstract / final)

    - 연관된 interface 이름 리스트

    Field Information

    - Field Type

    - Field Modifier

    (public / private / protected / static / final / volatile / transient)

    Method Information

    - Constructor를 포함한 모든 Method의 메타 데이터를 저장

    Runtime Constant Pool

    - Type, Field, Method로의 모든 레퍼런스를 저장

    - JVM은 이 영역을 통해 실제 메모리 상의 주소를 찾아 참조

    Class Variable

    - static 키워드로 선언된 변수를 저장

    - 기본형이 아닌 static 변수는 레퍼런스 변수만 저장되고 

    실제 인스턴스는 Heap에 저장됨

    - 클래스를 사용하기 이전에 이 변수들은 미리 메모리를 할당받음




    https://javapapers.com/core-java/java-jvm-run-time-data-areas/


    In general, method area is a logical part of heap area. But that is left to the JVM implementers to decide.




    https://java2blog.com/java-virtual-machine-architecture/


    This is logically a part heap space which will contain the class skeleton.




    http://java8.in/java-virtual-machine-run-time-data-areas/


    Method area is created on virtual machine startup, shared among all java virtual machine threads and it is logically part of heap area. 




    https://stackoverflow.com/questions/50163218/is-method-area-still-present-in-java-8


    Since Method Area is a logical concept described in the specification, every JVM has a Method Area, though that doesn’t imply that it has to be reflected in the implementation code.


    ???




    https://stackoverflow.com/questions/9095748/method-area-and-permgen


    Actually the Method area is a part of the Permanent Generation:


    Method Area is basically a non heap space like Stack which keeps class skeleton. skeleton includes static variables with values, constructors etc. The reflection operation are operated on this memory area. Perm is a memory space parallel to heap with keeps the binary code of current executing class.




    https://jobc.tistory.com/205


    Hotspot JVM(Oracle)의 Method Area 는 Permanent Area(PermGen)이라고 한다.




    https://mirinae312.github.io/develop/2018/06/04/jvm_memory.html


    Method Area 는 JVM 제품(벤더)에 따라 구현이 다르다. Hotspot JVM(Oracle)의 Method Area 는 Permanent Area(PermGen)이라고 한다.




    https://www.tutorialspoint.com/What-is-Java-Method-Area


    It is generally part of Heap area.




    https://lazymankook.tistory.com/79


    Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다. Non-Heap 영역으로 Permanent 영역에 저장된다.




    https://hongsii.github.io/2018/12/20/jvm-memory-structure/


    Method Area는 논리적으로 힙의 일부분이지만, 일반적으로 가바지 컬렉션 대상이 아니지만, JVM 벤더가 가비지 컬렉션 여부를 선택할 수 있습니다.




    https://mia-dahae.tistory.com/101


    Java 8이전에 Method Area를 PermGen(Permanat Generation Space)에 할당 했다. Java 8이후에는 PermGen이 완전히 제거 되어 Method Area는 Native Heap에 할당 된다.




    https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html


    The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it.




    https://d2.naver.com/helloworld/1329


    위 그림의 Permanent Generation 영역(이하 Perm 영역)은 Method Area라고도 한다. 


    'Java > Basics' 카테고리의 다른 글

    Java의 날짜와 시간 API  (0) 2019.06.06
    자바 빌드 툴  (0) 2019.05.21
    String compare  (0) 2019.04.09
    Object class  (0) 2019.04.06
    jar,war,ear  (0) 2019.04.06

    댓글

Designed by Tistory.