Java JVM: 가상 머신 성능 모니터링, 문제 해결 도구 (3)

1. 기본 문제 해결 도구

  • 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를 사용하여 네이티브 라이브러리를 호출하는 경우 네이티브 라이브러리에서 사용하는 메모리가 힙에 없습니다.
      • 가상 머신 및 가비지 컬렉터: 작업 시 일정량의 메모리 소모 필요
  • 외부 명령으로 시스템 속도 저하
  • 서버 가상 머신 프로세스 충돌
  • 부적절한 데이터 구조는 과도한 메모리 사용으로 이어집니다.
  • Windows 가상 메모리로 인한 긴 일시 중지
  • safepoint로 인한 긴 일시 중지

추천

출처blog.csdn.net/baidu_40468340/article/details/128548313