바른목소리(나만의글쓰기)

JVM의 Memory Structure(Runtime Data Area)를 알아보자.

작성일 작성자 쩝쩝.

http://howtodoinjava.com/2014/08/28/jvm-memory-model-structure-and-components/#method_area         
http://novathin.kr/75         

 

JVM(Java Virtual Machine)         


Heap Area   
1) JVM이 구동되면 자동으로 설정값에 의해 실행되어지는 영역이다./ Automatic Storage management(garbage collector)라는 놈에 의해 계속해서 재배열되어진다.
2) 모든 JVM thread들간에 공유되어지는 Runtime data area 메모리, 모든 class instainces,arrays들이 여기에 위치함.
3) Heap의 영역은 고정적일수도 있고, 계산에 의해 확장성일수도 있다. 그러나 너무큰 Heap은 불필요하다.
4) Heap에는 [Object instacne]와 [instance Level]의 변수들이 저장.  Object가 [지역이든/전역이든] 상관없이 무조건 여기에 위치함.
5) Static 명령에 의해 선언된 변수도 여기에 들어온다.         
         
Method Area / Runtime Constant Pool         
1) 논리적으로 Heap Area의 부분에 속하지만 물리적으로는 그렇지 않다.          
2) 관리방법이 Heap에서 처리하는 내역과 거의 유사한다.          
3) 모든 Class의 구조/ Field, method data / Interface초기화  Code/Meta 들이 여기에 들어온다.         
4) Type의 유형들이 들어온다. Class와 super class의 관계, type유형등         
5) 고정 상수[Cosntant]들의 정보가 들어온다.         
6) Class Variable[Class 변수]가 들어온다.         
         
         
Java VM Stack         
1) JVM(Java Virtual machine) thread 1개가 만들어질때 동시에 Private JVM Stack 1개가 만들어진다.         
2) Stack에는 [지역변수], [부분결과] , [method],[Function][이 Hold되졌다 사라진다. (LIFO / Last In First Out)         
3) JVM Stack이[push/pop frames]을 제외하고 결코 다중으로 생성되지 않는다.

   [ Stack Frame 1Set가 다른 Set를 호출하는 행위에 대한 이해가 필요하며 매우 중요한 내용이다.]
    Stack Fram : Stack에 보내질대 [Stack Frame]으로 틀을 짜서 메모리에 보내지게 된다.
    Local Variable Section : 이 함수를 실행하기 사용된 지역변수를 담는다
    Operand Stack : 이 함수를 실행하기 위하 사용된 연산과 관련된 내역
    Frame data : 이 함수를 실행하기 위해 사용된 상수, Exception의 처리, return값

 

Native method Stack[C Stack]         
아래의 이미지처럼 Java Stack에서 Nativate function call을 사용할 목적으로 사용하는 영역이다.         

 

PC(Program Counter) Registers         
Application 이 구동될때 1개의 method는 1개의 thread를 타고 움직이게 된다.         
이 때 method는 java용 method일수도 있고, natvie method일수도 있다.         
Java용 method가 구동될때 PC Register가 지정되지만, native의 경우에는 지정이 되지 않는다.         
이러한 등록을 통해 platform내에서 pointer로 메모리를 왔다갔다 하는것이다.         
         
         
         
Java Application이 실행이 되면 아래와 같은 큰 구조를 움직인다.         
1) Java Application에서 시작할 Java Class를 지정한다.         
2) 지정된 Java Class에는 main()가 존재한다.         
3) 구문이 시작되면 Application관련된 Class정보(meta정보),상수정보(Constant) ,Class 변수들이

    Method Area로 집결된다.
4) main()함수가 호출되기 전 main()을 둘러싸고 있는 지정된 public class가 구동된다.
5) 이 class가 구동되면서 JVM Stack 에 Stack Frame을 구성하여 처음으로 수행한다.
   5-1) 이 class내에서 static 명령이 있다면 해당 명령에 에서 push/put명령을 통해 [Heap]에 static변수가 저장된다.
   5-2) 현재 구동되고 있는 [Stack Frame]내에서 Local Variable / Operand stack등이 변경된다         
6) 드디에 public static void main()을 만났다.         
   6-1) 현재의 Stack Frame에 의해 JVM Stack 바로 위에 main을 위한 [Stack Frame]을 생성한다.         
   6-2) main에서 구동되고 있는 [Stack Frame]내에서 Local Variable / Oeprand stack등이 변경된다.

         (각종 변수선언 사용등에 의해)
   6-3) 함수를 호출한 경우, JVM Stack에서 [Stack Frame]한 개 위에 추가 구동을 하게되고,

         구동을 끝내면 다시 main으로 복귀한다.
         

 

10월 3주 이 블로그 인기글



맨위로
통합 검색어 입력폼