본문 바로가기
코딩/JAVA

겨울방학 JAVA 1일차

by sonysame 2017. 12. 27.

[Java] 클래스 로딩과 메모리 영역 (stack, heap, method area)

클래스 로딩

1. 클래스를 사용하는 시점에 해당 클래스의 바이트코드가 들어 있는 파일을 찾는다.

2. 찾은 파일은 메모리에 로딩된다.

   클래스의 바이트 코드는 "Method Area" 영역에 로딩된다. 


JVM이 관리하는 주요 메모리 영역

 1) Stack (스택)

메서드가 호출될 때마다 그 메서드의 로컬 변수를 준비하는 메모리 영역

메서드 호출이 끝나면 그 메서드를 위해 준비했던 모든 변수가 스택에서 제거된다.


 2) Heap (힙)

new 명령을 통해 생성된 인스턴스 변수가 놓이는 메모리 영역

가비지 컬렉터에 의해 관리된다.

가비지 컬렉터가 메모리를 해제하기 전까진 계속 유지된다.


 3) Method Area (메서드 영역)

클래스의 코드가 로딩되는 메모리 영역

메서드 코드가 이 영역에 존재한다. 


* JVM이 종료되면 JVM이 사용한 모든 메모리는 OS에 자동으로 반납된다.

  - OS의 메모리 관리 정책에 따라 프로세스가 종료되면 그 프로세스가 사용한 모든 

    메모리를 강제로 해제시킨다.




Heap영역은 다시 몇가지 영역으로 세분화

-register: JVM에 의해서 사용되고 다음 실행할 코드가 어떤 코드인지 가리키는 포인터

프로그램적으로 활용 X

-runtime constant pool 상수들이 모여있다.

-Method Area: 클래스 자체에 대한 정보, 클래스를 처음 사용할 때 1번 메모리에 적재

나머지: instance가 저장되는 영역



1. JVM이 기동

2. Class Loader가 실행(3가지 단계)

3. Main class의 정보가 method area에 적재

->main 호출

4. Stack에 main()에 대한 정보가

Car car; 5. Method Area에 Car class에 대한 정보가

car = new Car; 6.Heap에 instance accel()같은 경우는 포인터가 들어가고, 실제 코드는 Method Area의 Car class에 들어있



모두 종료 후 Heap 영역 반환되고 Stack필요없어진 거 날아가고 Method area도 반환되고 모두 종료



static=>heap이 아닌 method area에!



=================================================

클래스 안에 메소드가 여러개 나올 수 있다

이름이 같은 메소드가 나올 수 있다

단, 메소드의 시그니쳐가 달라요

(메소드의 인자의 개수나 타입을 지칭)

=> method overloading






Access Modifier(접근제어자)


4가지 종류의 접근제어자가 존재

1. public : package와 상관없이 무조건 접근 가능

2. protected: 상속과 관련


3. package(default): 키워드로 존재하지 X->같은 package내에서 접근가능

4. private->같은 클래스내에서 접근가능


public과 3번에 있는 default : class


field, method, constructor가 존재

몽땅 다 붙을 수 있다.




'코딩 > JAVA' 카테고리의 다른 글

겨울방학 JAVA 4일차  (0) 2017.12.29
겨울방학 JAVA 3일차  (0) 2017.12.28
겨울방학 JAVA 2일차  (0) 2017.12.27
점프투자바를 참고했음을 알립니다!  (0) 2017.05.09
인터페이스  (0) 2017.04.01