[JVM] JVM 클래스 로더 (Class Loader)
·
JAVA/JAVA (JVM)
Class Loader 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 JVM의 클래스 로더(class loader)라고 한다. 자바에서 소스를 작성하면 .java파일이 생성되고 .java소스를 컴파일러가 컴파일하면 .class파일이 생성되는데 클래스 로더는 .class 파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재한다. (같은 JVM 내에서 동작) 클래스 로더는 계층 구조를 가지고 있으며 System Class Loader는 Platform Class Loader를 부모로 가지고, Platform Class Loader는 Boo..
내부 클래스는 꼭!! static 으로 선언해야한다.
·
JAVA/JAVA (JVM)
Inner 클래스의 문제점 인텔리제이와 같은 IDE에서 내부 클래스를 선언하여 사용하면 다음과 같이 경고 메세지가 뜰 것이다. (내부 클래스가 외부의 멤버를 참조하여 사용하지 않을 경우) 메세지 내용을 보면 Inner class ' ' may be 'static'. 즉, 내부 클래스를 인스턴스가 아닌 static으로 설정하라는 경고이다. 별거 아닌 경고인줄 알고 무시하기에는, inner 클래스가 가지는 심각한 문제를 보면 마음이 바뀔 것이다. 왜냐하면 inner 클래스는 inner static 클래스보다 메모리를 더 먹고, 더 느리고, 바깥 클래스가 GC 대상에서 빠져 버려 메모리 관리가 안될 수 있기 때문이다. Inner 클래스는 외부 참조를 한다 일반적으로 내부 인스턴스 클래스를 만들기 위해서는 먼저..
클래스는 언제 메모리에 로딩 & 초기화 되는가
·
JAVA/JAVA (JVM)
JVM의 클래스 로더 (Class Loader) 자바의 클래스들이 언제 어디서 메모리에 올라가고 클래스 멤버들이 초기화되는지, 원리를 알기위해선 우선 JVM(자바 가상 머신)의 클래스 로더(Class Loader)의 진행 방식에 대해 알 필요가 있다. 특히나 다음과 같이 내부(중첩) 클래스 중에 static 키워드가 붙고 안붙고의 유무에 따른 메모리 로드 차이와 쓰레드에 세이프하다는 등, 이러한 부분은 꽤나 고수준의 지식이기 때문에 글 로만 훑어보고 넘어가기 다반사라 이를 이해하기 위해선 클래스 로더 부터 살펴볼 필요가 있다. class Outer { class Inner { } static class Holder { } } 클래스 로더는 컴파일 된 자바의 클래스 파일(*.class)을 동적으로 로드하고..
[JAVA] 가비지 컬렉션(Garbage Collection) 동작 원리 & GC 종류
·
JAVA/JAVA (JVM)
가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 객체(garbage)를 주기적으로 제거하는 프로세스를 말한다. C나 C++에서는 free()라는 함수를 통해 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 한다. 반면 Java는 JVM에 탑재되어 있는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 완벽하게 관리하지 않아도 되어 오롯이 개발에만..
[JAVA] JVM 내부 구조와 메모리 구조
·
JAVA/JAVA (JVM)
자바 가상 머신(JVM)의 동작 방식) 1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당받는다. (JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.) 2. 컴파일(Compile): 작성한 자바 소스코드(.java)를 자바 컴파일러를 사용하여 컴파일한다. 컴파일은 소스 코드를 기계어가 아닌 중간 단계의 바이트 코드(Bytecode)로 변환하는 과정이다. 컴파일된 바이트 코드는 .class 확장자를 가진 파일에 저장된다. 3. 클래스 로딩: 자바 가상 머신(Java Virtual Machine, JVM)은 프로그램을 실행하기 전에 컴파일된 바이트 코드를 클래스로 로딩한다. 클래스 로더(Class Loader)는 필요한 클래스들을 찾아서 메모리(JVM Runtime Da..
[JAVA] JVM (Java Virtual Machine) 이란?
·
JAVA/JAVA (JVM)
JVM의 동작 방식 (자바 코드 실행 과정) 1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당받는다. (JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.) 2. 컴파일(Compile): 작성한 자바 소스코드(.java)를 자바 컴파일러를 사용하여 컴파일한다. 컴파일은 소스 코드를 기계어가 아닌 중간 단계의 바이트 코드(Bytecode)로 변환하는 과정이다. 컴파일된 바이트 코드는 .class 확장자를 가진 파일에 저장된다. 3. 클래스 로딩: 자바 가상 머신(Java Virtual Machine, JVM)은 프로그램을 실행하기 전에 컴파일된 바이트 코드를 클래스로 로딩한다. 클래스 로더(Class Loader)는 필요한 클래스들을 찾아서 메모리(JVM Runtime..