JMC (Java Mission Control) 및 JFR (Java Flight Recorder)
JMC는 Java7부터 JDK에 포함되어 있으며 jmc를 직접 입력하여 시작할 수 있습니다.
사용하기 전에 JMX 연결을 지원하도록 Java 프로세스를 구성하고 시작 시 구성을 추가해야 합니다.
-Dcom.sun.management.jmxremote.port=7091
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=거짓
상용 기능 잠금 해제 및 비행 기록 구성 열기(하나 선택)
jcmd pid VM.unlock_commercial_features
-XX:+CommercialFeatures 잠금 해제 -XX:+FlightRecorder
jps : 자바 가상 머신 프로세스 상태 도구 가상 머신 프로세스 상태 도구
구문: jps [옵션] [호스트 ID]
-q: 출력 PID만
-m: main 메서드에 전달된 매개변수 출력
-l: 애플리케이션 JAR 파일의 전체 패키지 이름 또는 전체 경로 이름
-v: 가상 머신이 시작될 때 지정된 매개변수 목록 보기
실행 중인 가상 머신 프로세스를 나열하고 가상 머신 실행 기본 클래스 이름과 이러한 프로세스의 로컬 가상 머신 고유 ID를 표시할 수 있습니다.
RMI 프로토콜을 통해 RMI 서비스가 활성화된 원격 가상 머신의 프로세스 상태를 쿼리할 수도 있습니다. hostid 매개변수는 RMI 레지스트리에 등록된 호스트 이름입니다.
jstat: 가상 머신 통계 모니터링 도구
가상 머신의 다양한 실행 상태 정보를 모니터링하기 위한 명령줄 도구
가상 머신 프로세스에서 클래스 로딩, 메모리, 가비지 수집 및 컴파일과 같은 런타임 데이터를 표시할 수 있습니다.
예
250밀리초마다 프로세스 2764의 가비지 수집 상태를 쿼리하여 총 20개의 쿼리
jstat -gc 2764 250 20
질의 결과 2764가 사용하는 신세대 Eden 영역(E)은 6.2%, Survivor 영역 2개(S0, S1)는 비어있고, 구세대(O)와 영구세대는 41.42%를 사용하고 있으며, 각각 47.20%의 공간, MinorGC(YGC) 16회, 시간소모(YGCT) 0.105초, Full GC(FGC) 3회, 시간소모(FGCT) 0.472초, 모든 GC의 총 소요시간(GCT) 0.577초
jinfo: Java 구성 정보 도구
가상 머신의 다양한 매개변수를 실시간으로 확인 및 조정
jmap: Java 메모리 매핑 도구
힙 덤프 스냅샷을 생성하고 최종 실행 대기열, Java 힙 및 메서드 영역의 세부 정보를 쿼리할 수도 있습니다.
jhat: 가상 머신 힙 덤프 스냅샷 분석 도구
jmap에 의해 생성된 힙 덤프 정보를 분석하기 위해 jmap과 함께 사용
일반적으로 애플리케이션이 배포된 서버에서 직접 분석되지 않음
jstack: Java 스택 추적 도구
스레드의 긴 일시 중지에 대한 이유를 찾는 데 사용되는 가상 머신의 현재 순간에 스레드 스냅샷 생성
2. 시각적 문제 해결 도구
JHSDB: 서비스 에이전트 기반 디버깅 도구
JConsole: Java 모니터링 및 관리 콘솔
VisualVM: 다중 오류 처리 도구
Java Mission Control: 지속적인 온라인 모니터링 도구
3. 기타 고장 관련
대용량 메모리 하드웨어에 대한 프로그램 배포 전략
메모리가 큰 하드웨어에서 모놀리식 애플리케이션의 주요 배포 방법
단일 Java 가상 머신 인스턴스를 통해 대량의 Java 힙 메모리 관리
많은 양의 힙 메모리를 회수하여 긴 일시 중지
대용량 메모리는 64비트 JVM(Java Virtual Machine)을 지원해야 합니다.
힙 메모리 오버플로 발생 시 대용량 스냅샷 파일을 생성할 수 있을 만큼 애플리케이션이 안정적인지 확인해야 함
동일한 프로그램은 일반적으로 32비트 가상 머신보다 64비트 가상 머신에서 더 많은 메모리를 사용합니다.
동시에 여러 JVM(Java Virtual Machine)을 사용하여 하드웨어 리소스를 활용하는 논리 클러스터를 설정합니다.
노드는 글로벌 리소스를 놓고 경쟁하며 가장 일반적으로 디스크 경쟁입니다.
연결 풀과 같은 특정 리소스 풀을 가장 효율적으로 활용하기 어렵습니다.
노드는 필연적으로 32비트 메모리로 제한되며 각 프로세스는 2GB의 메모리만 사용할 수 있습니다.
로컬 캐시 사용량이 많음
클러스터 간 동기화로 인한 메모리 오버플로
오프힙 메모리로 인한 오버플로 오류
Java 오프 힙 메모리 제한
직접 메모리: -XX:MaxDirectMemorySize를 통해 크기 조정 가능
스레드 스택: -Xss로 크기를 조정할 수 있으며 메모리 부족으로 인해 StackOverflowError가 발생합니다.
소켓 버퍼 영역: 각 소켓 연결에는 수신 및 송신 두 개의 버퍼 영역이 있습니다.
JNI 코드: 코드가 JNI를 사용하여 네이티브 라이브러리를 호출하는 경우 네이티브 라이브러리에서 사용하는 메모리가 힙에 없습니다.