분류 전체보기: 2109개의 글

Full GC가 발생하는 등 프로그램에 이상현상이 생기면 살펴봐야할 것 중에 메모리를 소모하는 클래스 중에 이상하게 많이 생성된 인스턴스가 존재하는지 살펴보는 것이다 예를들어, DB커넥션 객체가 1개만 있어야 하는데 여러개 생성되었는지 등 이상현상을 확인해봐야 한다 그래서 메모리 내의 인스턴스들의 점유 현황을 확인하는 방법이 필요하다 물론 GUI 로 쉽게 볼 수 있는 툴이 있지만, 공부겸.. jcmd, jmap을 이용해서 찾아보고자 한다 메모리 점유율 분석하기 - jcmd & jmap 힙 히스토그램 ※ Heap Histograms 힙 히스토그램 힙 덤프 보다 어플리케이션 내의 많은 객체를 빠르게 살펴볼 수 있다. 어떤 객체 타입이 메모리를 많이 소모하는지 빠르게 파악하는데 유용하다. 1. jcmd 힙 히..

큰 객체 할당, TLAB 요약 TLAB( Thread Local Allocation Buffer ) 보다 큰 객체들은 TLAB 바깥에 할당되서 TLAB 안에 할당되는 객체보다 처리가 느리다. TLAB 은 스레드 내의 로컬 영역으로, TLAB 안에 할당된 객체는 스레드 동기화 등의 추가적인 처리를 하지 않고 로컬 변수처럼 처리할 수 있기 때문에 더 빠르다. TLAB 은 에덴내의 한 영역으로 에덴의 크기에 좌우된다. TLAB 을 튜닝하려면 JFR을 사용해서 TLAB 밖에 할당되는 객체들의 크기를 확인한 뒤, TLAB이 최대한 많은 객체들을 포함할 수 있도록 TLAB의 크기를 늘리면 된다. 주의할 점은 JFR의 TLAB 확인 기능은 어플리케이션에 많은 부하가 발생해서 기본적으로 꺼져있으며 프러뎍선 환경에서 사..
크다? JVM의 TLAB 크기에 좌우 TLAB 이란? TLAB : Thread Local Allocation Buffer , 스레드 로컬 할당 버퍼 - 에덴 내에 있는 한 영역 - 스레드 마다 할당되는 객체 버퍼 - 하나의 스레드가 처리할 수 있는 객체의 최대 크기 - 각 스레드마다 스레드 로컬에 할당되므로, 동기화에 신경쓰지 않아도 된다. - TLAB에 할당되지 못하는 크기가 큰 객체들은 TLAB 밖에 할당된다. - TLAB 밖에 할당된 객체들은 스레드 동기화등 여러가지 절차가 추가적으로 필요하기 때문에 처리하는데 TLAB 안에 있는 객체보다 처리가 느리다. TLAB이 가득차면, 일정 크기의 객체는 더이상 TLAB안에 할당될 수 없다. 이 시점에서 JVM에게는 두 가지 선택사항이 있다. 1) TLAB ..
현재 위치에서 디렉토리 즉 폴더 개수 세기 ls -l | grep ^d | wc -l 위의 명령어를 실행 시키면 현재 위치의 디렉토리(파일) 개수를 체크 할 수 있습니다. 현재 위치에서 파일의 개수 세기 ls -l | grep ^- | wc -l 현재 디렉토리의 하위 파일 개수 세기 find . -type f | wc -l 위의 명령어들은 외우면 편하긴 하지만... 리눅스를 주로 사용하는 것이 아니라 자꾸 잊어 버리네요. 파일 개수, 디렉토리(개수)를 세는것보다 용량 등의 체크를 더 많이 사용하지만 종종 파일 개수, 폴더 개수를 체크할일이 있어 포스팅 하였습니다. 필요하신분들 요긴하게 사용하시기 바랍니다. 감사합니다.

JMC, JFR 을 이용해서 메모리 누수를 진단해보자! Memory Leak 발견하기 메모리 누수로 인한 잦은 GC로 어플리케이션이 느려질 수 있으며, 결국 OutOfMemoryError가 발생한다. 메모리 누수를 JFR을 이용해서 찾을 수 있다. Old Generation에 GC가 발생했는데도 꾸준히 살아있는 객체들의 갯수가 증가한다면 메모리 누수를 의심할 수 있다. 메모리 누수는 오랜 기간 쌓인 로그를 봐야할 경우가 많기 때문에 JMC을 이용해서 로그를 잘 남겨놔야 한다. ( JMC Event Trigger를 이용해서 특정시간마다 특정기간동안 JFR 을 돌려서 기록할 수 있다) Memory Leak 클래스 찾기 메모리 누수가 발견되었다면, 어떤 클래스에서 메모리 누수가 발생하는지 찾아야한다. 메모리 ..

(프로덕션 환경에서 사용할려면 라이센스 필요, 그외에는 무료로 사용 가능) JMC 는 두 가지 주요 목적으로 사용될 수 있다 1) JVM의 상태를 모니터링 2) Java Flight Recorder를 이용해서 생성한 덤프 파일 분석 JMC, JFR을 통해 무엇을 할 수 있는지 살펴보자 ※ 주의! 어플리케이션 성능 JFR을 이용해서 어플리케이션을 모니터링할 때는 성능을 주의해야한다. JFR을 이용해서 얻을 수 있는 데이터 종류가 많기 때문에, 모든 것을 측정하려고 하면 어플리케이션에 부하가 심해진다. 따라서 원하는 데이터만 골라서 기록해야 한다. JFR은 데이터의 종류 뿐만 아니라 데이터를 얼마나 자주 측정할지 등 기본적인 설정이 필요하다. JFR은 미리 설정된 프로파일을 제공한다. (default.jfc..

1. 서바이버 스페이스 이해하기 Young Generation에서 객체들의 이동은 다음과 같다. 2. 서바이버 스페이스의 존재 이유 - 몇번의 Minor GC 동안 영 제너레이션 내에 객체가 남아있도록 설계하여, 올드 제너레이션으로 승격될 만큼 오래 살아남지 못한 객체들은 그 전에 제거한다. - S0S1을 핑퐁을 쳐가며 오래 살아남지 못할 객체들은 Old Generation 전에 소거한다. 3. 서바이버 스페이스 오버플로우 서바이버 스페이스가 작아서 또는 어떤 이유로 꽉차게 되면 Minor GC발생 시, 객체가 에덴에서 올드 제너레이션으로 바로 승격된다. 오랫동안 사용되지 않을 객체라도 서바이버의 필터링을 거치지 못하기 때문에 올드 제너레이션으로 이동하게 되어 Full GC를 초래한다. 서바이버 스페이스..
튜닝 목표 : 잘 튜닝된 G1은 Full GC가 발생하지 않아야 한다! Full GC 예방 방법 1) 힙 전체 크기 늘리기 & 제너레이션 간의 비율 조정 2) 백그라운드 스레드의 개수 늘리기 3) 백그라운드 스레드 자주 실행하기 4) 혼합 GC의 작업량 늘리기 MaxGCPauseMillis 를 통한 쉬운 튜닝 G1을 튜닝하는 방법은 많지만, G1의 목표중 하나는 손 쉬운 튜닝이다. G1은 Throughput Collector 에서 봤던 플래그인 -XX:MaxGCPauseMillis=N 을 통해서 간단히 튜닝할 수 있도록 제공한다. -XX:MaxGCPauseMillis = N (디폴트 200ms) G1은 어떤 단계인지 상관없이 Stop-the-world가 발생하면 플래그 값을 읽고, 플래그가 기준값을 넘어..

CMS와 마찬가지로 G1의 목표는 Full GC가 발생하지 않는 것 Full GC 가 발생하는 네 가지 경우는 다음과 같다 1) Concurrent GC Fail , 동시 병렬모드 실패 - Concurrent GC는 표시 단계를 거쳐서 혼합 컬렉션때 가비지가 소거된다. 그런데 혼합 컬렉션이 진행되기 전, 표시 단계에서 올드 제너레이션이 가득찰 경우 G1은 표시 단계를 중단한다. - 이 때, 힙 크기를 늘리거나, 표시 단계를 빨리 시작하거나, 표시 단계의 스레드 수를 늘려서 표시 단계가 더 빨리 수행되도록 튜닝해야 한다. 2) 승격 실패 ( 영 -> 올드 ) - 혼합 컬렉션이 시작되었지만, 혼합컬렉션에 의해 소거되는 올드 제너레이션의 영역보다, Minor GC로 승격되어서 올드 제너레이션 영역으로 이동하는..

G1(Garbage First) 이해하기 힙을 디폴트 2048개의 영역으로 나누어서 영역마다 가비지 컬렉을 실행한다. 각 영역은 영, 올드 제너레이션 어떤 용도든지 사용될 수 있다. 각 영역은 서로 인접할 필요 없다. 영역을 많이 나눔으로써, 미참조 객체를 일부 영역들에 모아서 남겨둘 수 있다. 따라서 가비지만 모인 영역들만 집중적으로 처리하여 가비지 컬렉을 빠르게 끝낼 수 있다. 가비지를 우선(Garbage First, G1)이다. G1 기본동작 1) Minor GC : Stop-the-world를 발생시킴 2) Concurrent GC 2-1) 표시 2-2) 혼합 컬렉션 3) Full GC : 피하는 것이 목적 1) Minor GC - 빈 공간은 어디에도 속하지 않는다. G1이 필요하다고 생각하면 아..