[자바]static, JVM memory의 기본(1편)

Posted by ITPangPang
2016. 4. 9. 00:13 Java/Java 알아두면 좋은것


Static, JVM memory 기본에 대하여 

1, 2편으로 나눠서 올릴 것이며


기본 1편에서는 Static이 무엇인지 JVM이 무엇인지 알아보겠습니다.

기본 2편에서는 JVM memory와 연관지어서 Static의 장,단점을 알아보겠습니다.

 

Static(기본)


처음에는 static 뿌리뽑기, static 끝장내기 등등 글을 올리고 싶었으나

static 키워드가 개발하면서 중요한 부분이고 파고들수록 내용이 심오해서 기본만 올리고

다음번에 시간내서 심화편을 올려야겠다고 생각했다..

 

먼저 static의 뜻을 알아보면 정지상태의, 고정된, 변화가없는 이라는 뜻으로

실제로 클래스가 로딩될때 static선언된 자원들은 JVM(Java Virtual Machine)에서 메모리에 딱 한번만 올라갑니다

시작부터 JVM을 설명하기에는 내용이 복잡해지므로 내려가면서 천천히 설명하겠습니다.

 

먼저 자원들이 사용되려면 메모리를 할당받아야 합니다.

Java에서 메모리를 할당받는 방법은 2가지가 있습니다.

① 객체생성

② Static사용

 

객체생성을 해서 메모리를 할당받아 사용해보겟습니다

int i를 출력하고 싶은데 객체생성을 하지 않아 i는 메모리를 할당받지 못해서 사용 할 수가 없습니다

 

객체 생성을(인스턴스화) 하고 나니까 int i를 사용할 수 있습니다(정상적으로 1이 출력되었습니다)

 

이번에는 두번째 방법으로 static 변수를 사용해보겠습니다


첫번째 방법과는 다르게 int 앞에 static만 붙였을뿐인데 객체생성 없이 바로 사용할 수 있습니다

그렇다면 굳이 객체생성을 할 필요가 있을까요? 전부 static을 붙여서 쓴다면 편하지 않을까요?

static의 장단점을 알아보기 전에 먼저 JVM메모리 부분에 대해 간단히 알아보겠습니다

 

JVM(기본) memory

static에 대하여 JVM을 안건드리고 설명할 수도 있지만, static의 장단점을 알기 위해서는 memory에 대해 알아야 하므로 JVM에 대해 알아보겠습니다.

JVM의 전체 구조와 하나하나의 과정은 생략하고(하나하나 전부 중요하지만) 나름 이해하기 쉬운 부분만 알아보겠습니다.

JVM 뿌리뽑기, 파헤치기편은 나중에 열심히 준비해서 올려보겠습니다.


JVM(Java Virtual Machine)의 (일부)구조입니다.

위 그림은 이번에 알아볼 영역만 그린걸로, 모든 구조가 궁금하신분들은 JVM Structure 검색하셔서 보시기 바랍니다

(Execution engine, Garbage Collector, Method+Heap Area를 제외한 나머지 Runtime Data Area 등등 제외)

 

개발자가 소스코드를 작성후에 실행을 시키면 컴파일러라는 녀석이 .java를 .class(Byte Code)로 변환시켜줍니다

 

 

변환을 하고 나면 Class Loader가 .class파일(+라이브러리도)을 가져옵니다(로드)

 

Class Loader는 로드한 Class파일을 메모리영역(RunTime Data Area)에 올려주는 역할을 합니다  

메모리영역(RunTime Data Area)에 Class파일에 올라간 파일은 실행엔진(Execution Engine)에 의하여 실행되게 됩니다

(실행엔진은 안그리려고 했는데 잠시 추가 시키겠습니다)

(Execution Engine 밑에 Interpret, JIT는 궁금하신분은 한번 찾아보세여 여기까지 설명하기는 길어지기 때문에)

 

JVM 큰틀의 작동원리는 설명했고, 메소드영역(Method Area)에 대해 한번 알아보겠습니다


메소드 영역(Method Area)이란 곳이 있습니다.(이 영역은 JVM이 실행될 때 생성됩니다)

한마디로 일단 정의하자면 메소드 영역은 Type정보를 가지고 있는 영역입니다

이 메소드 영역은 7개의 정보를 저장하고 있습니다.(또 머리가 아파옵니다)

여기서는 7개의 정보를 전부 알아보는 것이 아니라 Class Variable만 보겠습니다

- Class Variable

Class Variable은 Static Variable 입니다(드디어 Static이 나왔습니다)

② Static 변수는 Class Variable에 저장됩니다

어디서든 공유해서 쓸 수 있다는 변수를 의미합니다

Static변수는 클래스가 사용되기 전에 미리 메모리에 올라갑니다.

 

다음은 힙 영역(Heap Area)에 대해 알아보겠습니다. 

힙 영역(Heap Area)이란 곳이 있습니다.

힙 영역도 메소드 영역과 마찬가지로 모든것을 알아보기에는 내용이 많으므로 필요한 부분만 알아보겠습니다.

힙 영역은 메모리 영역 중에 가장 중요한 역할을 맡고 있습니다.

힙 영역의 특징에 대해 알아보겠습니다.

① 인스턴스와 배열을 저장하는 영역입니다.(객체 생성과 연관이 있겠죠?)

② 데이터가 동적으로 생성,소멸 된다.

③ JVM이 Heap영역에 메모리를 할당한다.

 

 

 1편은 여기서 마무리 짓고 다음 기본 2편에서 JVM memory와 연관지어서 Static의 장,단점을 알아보겠습니다.