hmk run dev

JAVA 메모리 구조 본문

java

JAVA 메모리 구조

hmk run dev 2022. 1. 31. 23:18

자바는 객체지향 언어로 개발 후 유지보수가 용이 하다는 장점이 있고

JVM에 실행되기 때문에 운영체제 구분없이 실행이 되며 가비지 컬렉터로 메모리 관리를 자동으로 할 수 있어 

안정적으로 프로그래밍을 할 수 있는 언어입니다.

 

자바의 메모리 관리에 대해 알아보기 위해 예시코드를 작성해 보겠습니다.

 

class Person {
	private String name;
    private int age;
    static final String species = "사람";
    
    Person (String name, int age){
    	this.name = "name";
        this.age = "age";
    }
    
    public String getName(){
    	return this.name;
    }
    
    public int getAge() {
    	return this.age;
    }
    
    public String getSpecies () {
    	return Person.species;
    }
}

 

Person이라는 클래스를 지정하고 아래 Main 클래스에서 Person을 불러와 사용하면 

김형민, 28, 사람이 출력된다.

 

자바를 사용해왔던 개발자라면 너무나도 당연한 출력결과 겠지만 이게 어떻게 가능한지 자바메모리를 보면서 동작원리를 알아보자!

class Main {

	public static void main(String [] args) {
    	Person p = new Person("김형민", 28);
        
        System.out.println(p.getName());
        System.out.println(p.getAge());
        System.out.println(p.getSpecies());
    }
}

 

 

자바 코드는 .java의 형태로 저장이되고 

이것을 javac 자바컴파일러가 바이트 코드로 바꾸고 이것을 .class파일로 저장이 된다.

 

바이트 코드로 변환하는 이유는 작성한 코드를 1차 적으로 숨기는 의미도 있고

바이트코드로 바꿈으로써 문법 검사부분을 건너뛰어 시간 단축적인 기능도 포함한다

 

그러나 소스코드 변경시 마다 컴파일을 하므로 시간적인 소모도 있다.

 

이렇게 바이트 코드로 보관된 .class 파일은

Class loader가 Runtime Data Area 로딩시킨다.

 

Runtime Data Area는 5가지 영역으로 나눠져 있다.

 

모든 스레드가 공유 - method area, heap 

스레드 마다 하나씩 - stack, pc register, native method

 

method area - jvm 실행 시 생성됨 바이트 코드가 저장됨 클래스와 변수 static으로 선언한 공유변수 저장

 

heap - 동적으로 생성된 개체가 저장되는 영역, new 연산으로 생성된 인스턴스 변수 저장(class의 객체, 배열 등)

생성된 변수는 해당 객체가 소멸되기 전이나 GC가 정리 하기 전까지 존재

 

stack - 지역변수나 메서드의 매게변수 임시적으로 사용되는 변수 해당 메서드의 호출이 종료시 선언된 변수들은 사라짐

(휘발성 데이터)

 

 

위의 코드를 보면 Person p = new Person("김형민", 28) 코드에서 

p는 stack Person은 heap영역에 저장되어 있다.

 

 

Person의 정보는 힙메모리에 저장되어 있으며 Person의 메모리의 주소를 가지고 있는 데이터를 stack 영역에 저장한다!

 

 

PC register - 스레드가 시작될때 생성되며 현재 수행중인 JVM의 명령어의 주소를 저장하는 공간

 

Native method Stack - 자바가 아닌 다른언어로 작성된 코드를 위한공간 바이트 코드가 아닌 실제 실행시킬수 있는 코드 저장되어있음

 


Excution engine - 로드된 class 파일을 해석하는 엔진 & 바이트 코드를 실행시키기 위한 엔진

 

Native Method Interface - jvm에 실행되는 코드중 네이티브로 샐행하는 것이 있다면 해당 코드를 호출하거나 호출 될 수 있도록 하는 일종의 프레임워크

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'java' 카테고리의 다른 글

서블릿 & 스프링  (0) 2022.02.20
추상클래스 & 인터페이스  (0) 2022.02.16
JPA @Query 띄워쓰기 주의 사항  (0) 2022.01.12
jsoup 네이버 블로그 크롤링(iframe)  (5) 2021.12.04
generic  (0) 2021.11.14
Comments