JAVA 메모리 - 자바 가상머신 스택과 네이티브 메서드 스택

예전에 신입개발자로써 취직을 준비하면서 네이티브 메서드라는게 있다는 걸 외웠던게 기억나는데

이를 좀더 깊게 고민해본 글이다.

자바 가상머신 스택에 대하여

일단, 책을보다 이게 있는지 처음 알았다. 예전에 공부했을때는 적당히 네이터브 메서드에 영역에 퉁쳐서

C처럼 생긴 메모리구조에다가 우겨넣었는데, 깊이 있게 이해 해 보니

말도 안되는 걸 왜 그때는 이해하지 못하였는지 생각이 들었다.

 

자바라는게 결국 C에서 하던 메모리 관리를 직접하지 않고 코드에 더 집중하게해 생산성을 높이는 언어인 것을 알고 있었으면서 C 메모리체로 설명하는 자바 메모리를 의심하지 않고 공부했던 내 자신이 조금은 부끄러웠다.

 

일단 자바 가상머신스택은 스레드 프라이빗 영역인데

쉽게 말해 스레드가 어떤 동작을 하기위해 스택 프레임을 만들게 되는데 지역변수 , 피연산자스택 ,동적링크 , 리턴값등을 가지고 스택을 만들고 이를 가상 머신 스택에 푸시 하고 - 사용할때 팝 하는 걸 의미한다.

 

혹시, 개발에 대해 이해도가 조금 부족한 사람을 위해 첨언 하자면 , 코드를 만들어 하나의 함수를 만들었을때 안에 있는 변수 , 연산자 , 주입 , 결과 값을 스택으로 만들고

이를 자바 가상 머신스택에 넣는거라고 이해해 볼 수 있다.

 

결국 스레드가 연결되어 라이프사이클이 동일하게 유지되게 된다는 것도 함께 이해할 수 있다.

그리고 이러한 스택의 크기는 32비트인데 (기본크기)

double처럼 64비트를 쓰는게 있으면 2칸 사용해서 하나의 순서로 들어가게 된다고 한다.

 

이것보다 더 큰 경우도 가능하지만, 일반적으로 스레드가 요청하는 스택의 깊이가

초과되는 경우 오버플로우가 , 그리고 생성할때 메모리가 부족하면 아웃오브 메모리가 발생하게 되는거다.

네이티브 메서드 스택 영역에 대해

결국 네이티브 메서드도 가상머신 스택과 매우 유사한데

차이점은 자바가상머신 스택은 - 바이트코드 (자바 메서드) , 네이티브메서드스택 - (네이티브메서드)

 

을 사용하는 것이며 아무런 정의가 되어 있지 않기 때문에 자유성을 보장한다.

그래서 이를 통해 자바가상머신을 구현하는 사람이 자유롭게 구현할 수 있게된다는 걸 알 수 있다.

네이티브 메서드란?

혹시 햇갈리는 사람이 있을까봐 정리해보는데

네이티브 메서드는 자바가 아닌 다른 개발언어를 사용해 컴파일하여 사용하는것을 말한다.

 

JVM을 뜯어보면 아래 C로 개발된 네이티브 구현체들이 다수 존재하는 것을 확인할 수 있는데

이런 것을 실행시키는 메서드 영역이라고 이해할 수 있다