본문 바로가기

JVM

(5)
클래스로더 메모리 누수 원인과 해결법 (ThreadLocal 사용시 주의점) 두 줄 요약원인은 ThreadLocal을 사용 후 명시적으로 remove 하지 않았기 때문이라고 할 수 있다. 따라서 해결법은 ThreadLocal을 사용 후에는 반드시 `remove()`를 호출해야 한다.  ThreadLocal의 작동 방식 ThreadLocal은 쓰레드마다 각기 다른 값을 저장하는 기능을 제공한다. `ThreadLocal.set(value)` 를 호출하면 현재 쓰레드의 ThreadLocalMap에 value가 저장된다. 이 값은 앱이 종료되거나 ThreadLocal.remove()를 호출하지 않는 한 유지된다.  ThreadLocal이 상당한 메모리를 물귀신 하는 과정ThreadLocal 변수로 저장된 것이 만약 어떤 클래스의 인스턴스라고 해보자. 이 인스턴스는 자신의 블루프린트인 클..
Java 클래스 로딩 과정 1. 클래스 파일 파싱(Class Format Check)먼저 클래스 포맷이 올바른지 확인합니다. 잘못된 경우에는 `ClassFormatError`가 발생합니다.  2. 클래스 생성 (Creation of Class)다음으로는 클래스의 런타임 representation을 JVM 메모리 영역에 생성합니다. 이 메모리 영역은 Method Area의 `runtime constant pool`으로, `Meta Space` 또는 `Permanent Generation`이라고도 합니다.  3. 링킹 (Linking) 자바 바이트 코드 유효성 검사 (Java bytecode verification) 후, Java bytecode에 있는 상징적인 레퍼런스들의 Resolution (Resolution of symboli..
Method Area 정의와 구성 Method Area란?Method Area는 모든 스레드들이 공유하는 메모리 영역으로 JVM이 기동될 때 JVM 당 하나씩 생성된다. Garbage Collection(이하 GC)의 대상이 되는 영역으로, 클래스로더가 로드한 클래스 파일로부터 추출된 다음 9가지 정보들이 저장되어 있다. 다음 9가지 정보들은 말하자면 클래스(혹은 인터페이스)의 메타데이터들이다. 그리고 Method Area는 HotspotJVM에서 한 때는 "Permenant Generation"으로 불렸던 영역이다. Type InformationRun-Time Constant PoolField InformationMethod InformationClass VariablesReference to ClassLoader ?Reference ..
JVM Stack 메모리의 정의와 구성 JVM Stack 메모리란스레드의 수행 정보를 기록하는 Stack Frame들을 저장하는 메모리 영역. 스레드마다 하나씩 존재하고, 스레드가 시작할 때 생성된다. 스레드가 자바 메소드를 수행할 때 JVM은 Stack Frame을 하나 생성해서 JVM Stacks에 푸시한다. Stack Frame 중 현재 수행하고 있는 메소드의 정보를 저장하는 것을 Current Frame이라고 한다. 직전에 Push된 Stack Frame이 Current Frame이 되며, 수행을 마친 메소드는 Pop된다. 만약 메소드가 비정상 종료를 하게 되면 Exception을 처리 후 Pop된다. 여기서 설명되는 JVM Stacks는 JVM 명세(Specification)의 내용에 지나지 않으며, JVM Stacks의 실제 구현은..
JVM이란? - JDK vs. JRE vs. JVM JVM 정의Java 프로그램을 실행시켜주는 가상 머신이다. 각 운영체제별로 만들어져서 운영체제와 애플리케이션 사이에 위치하면서 애플리케이션이 플랫폼에 상관 없이 독립적으로 실행될 수 있도록(Write One Run Everywhere) 만들어준다. JVM의 주요 임무는 클래스를 로딩하고 클래스의 바이트 코드를 실행하는 것이다. 실제로 JVM은 Specification에 지나지 않는다. 각 JVM 벤더들은 표준에 맞추어 JVM을 구현할 수 있고, OpenJDK가 사용하는 JVM의 이름은 HotspotJVM이다.  JVM의 주요 역할개발자가 작성한 Java 프로그램과 WAS를 실행시킨다. 실행시킨다는 것은 Class 파일을 JVM으로 로딩하고 인터프리팅하는 것과, 메모리 등의 리소스를 할당하고 관리하는 작업..