JVM 문제 해결 단계

첫째, 사용 JPS는 자바 응용 프로그램의 프로세스 ID를 얻을 수   

 

(자바 가상 머신 프로세스 상태 도구)       

 

    JPS 출력은 주로 JVM 실행 상태 정보를 처리하는 데 사용된다. 다음과 같은 구문은 다음과 같습니다

JPS [옵션] [호스트 ID]

    당신은 그것을 현재 호스트 호스트 ID 또는 서버에 기본값을 지정하지 않은 경우.

    다음과 같이 명령 줄 매개 변수 옵션은 다음과 같습니다

-q는 클래스 이름, 항아리 이름과 입력 주 메서드 매개 변수 출력하지 마십시오

메인 메소드에 전달 -m 출력 파라미터

-l 출력 메인 클래스 또는 항아리의 완전한 이름

JVM의 전달 -v 출력 파라미터

   다음과 같은 :

 

루트 @ 우분투 : / # JPS -m -l

2458 org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml

29,920 com.sun.tools.hat.Main는 9998 /tmp/dump.dat을 -port

3149 org.apache.catalina.startup.Bootstrap 시작

30,972 sun.tools.jps.Jps -m -l

8247 org.apache.catalina.startup.Bootstrap 시작

25,687 com.sun.tools.hat.Main는 dump.dat 9999 -port

21,711 MRF-center.jar

둘째, 프로세스 번호를 통해 스레드 내에서 대부분의 CPU를 많이 사용하는 프로세스를 식별하고,

 

최고 -HP의 PID (일반적으로 권장) 메모리 소비는 21,742를 얻기 위해 스레드 ID 번호에 따라 선택, 스레드 ID를 얻으

각 Java 스레드가 CPU 시간을 소비하는 IME 열은, CPU 시간은 스레드 21,742의 긴 스레드 ID입니다

 

의 printf "%의 X \ 없음"21742

    21742 16 진수 값의 54ee 가져 오기 다음이 사용됩니다. 

사용의 printf "% X \ n"스레드 ID는 16 진수 값으로 변환하거나 손 스레드 ID 값에 의해 계산된다 진수로 변환되고

 

셋째, 사용 jstack을 쿼리 메모리 소비 값 코드 레벨 타겟팅.

구문은 다음과 같습니다

jstack는 프로세스 ID는 | 그렙 (변환 후의 16 진수 스레드 ID 값), 코드 레벨로 위치 할 수있다.

루트 @ 우분투 : / # jstack을 21,711 | 그렙 54ee

지정된 Object.wait (IN "PollIntervalRetrySchedulerThread"프리 오 = 10 TID = 0x00007f950043e000 NID = 0x54ee) 0x00007f94c6eda000]

    CPU 소비) (이 클래스 PollIntervalRetrySchedulerThread되는 Object.wait에서 볼 수있다

 

자바 과정에서 정보를 확인하는 데 사용되는 메인 스레드 스택을 jstack을. 다음과 같은 구문은 다음과 같습니다 

jstack을 [옵션] PID

jstack을 [옵션] 실행 코어

jstack을 [옵션] [서버 아이디 @] 원격 호스트 이름 또는-IP

    다음과 같이 명령 줄 매개 변수 옵션은 다음과 같습니다

 

교착 상태가 발생하면 -l 긴 목록뿐만 아니라, 출력 자바 정보는 스택 정보를 C / C ++로 인쇄됩니다 스택 것, jstack을 -l PID 잠금 보유 -m 혼합 모드를 관찰하기 위해 사용할 수있는 추가 잠금 정보를 인쇄합니다 (네이티브 법 등)

    jstack을 스레드 스택, 우리는 특정 코드를 타겟팅 할 수있는 정보에 따라 스택을 찾을 수 있으므로 사용 JVM 성능 조정에 매우이다. 명령을 사용 PS, 상단의 printf, jstack을, GREP가,의는 위치 정보를 가장 CPU를 많이 사용하는 자바 스레드 자바 프로세스의 인스턴스를 찾아 쌓아 보자.

네, 그러면 jstat (JVM 통계 모니터링 도구) FullGC 상황을 모니터링 , FullGC에게 시스템의 주파수를 얻을.

다음과 같은 구문은 다음과 같습니다

 

그러면 jstat [generalOption | outputOptions VMID [간격 [S | MS] [계산]]]

    VMID는 일반적으로 리눅스 / 유닉스 시스템에서 프로세스 ID는 자바 가상 머신의 ID입니다. 주기는 샘플링 간격이다. 카운트 된 샘플의 수이다. GC 예는 다음과 같은 정보가 출력 샘플링 시간 간격이 250 밀리 초 샘플의 수가 4이다 :

 

루트 @ 우분투 : / # 그러면 jstat 21711 (250) 4 -gc

S0C S1C S0U S1U EC 유럽 연합 (EU)의 OC 또는 PC PU YGC YGCT FGC의 GCTF의 GCT   

64.0 192.0 192.0 0.0 6144.0 1854.9 4111.6 32000.0 55296.0 25472.7 702 3 0.431 0.218 0.649

64.0 192.0 192.0 0.0 6144.0 1972.2 4111.6 32000.0 55296.0 25472.7 702 3 0.431 0.218 0.649

64.0 192.0 192.0 0.0 6144.0 1972.2 4111.6 32000.0 55296.0 25472.7 702 3 0.431 0.218 0.649

64.0 192.0 192.0 0.0 6144.0 2109.7 4111.6 32000.0 55296.0 25472.7 702 3 0.431 0.218 0.649

    JVM 힙 메모리 레이아웃 보면, 위의 열을의 중요성을 이해하려면 :

 

 

    그것은 볼 수있다 :

 

이전 세대의 젊은 세대 힙 메모리는 = + + 영구적 인 세대

+ = 에덴 젊은 세대 영역이 개 생존자 영역 (부터까지와)

    이제 각 열의 의미를 설명합니다 :

 

S0C, S1C, S0U, S1U : 생존자 0/1 영역 용량 (용량) 및 금액 (사용)

EC, 유럽 연합 (EU) : 에덴 영역의 크기와 양의

OC, OU : 기존의 발전 용량 및 사용

PC, PU : 용량과 사용의 영구적 인 세대

YGC, YGT : 젊은 세대의 GC와 GC의 수 시간이 소요

FGC, FGCT : 전체 전체 GC 및 GC는 수 시간이 소요

GCT : GC 총 시간

 

 

五,  jmap는 (메모리 맵)和jhat를 (자바 힙 분석 도구)

    jmap는이 jhat를 일반적인 사용과 결합 된 힙 메모리 사용량을보고하는 데 사용됩니다.

    다음 jmap의 구문은 :

jmap의 [옵션] PID

jmap의 [옵션] 실행 코어

jmap의 [옵션] [서버 아이디 @] 원격 호스트 이름 또는-IP

    64 비트 JVM에서 실행되는 경우에는 -J-D64 옵션 명령 매개 변수를 지정해야 할 수도 있습니다.

jmap는 생존 중 PID

    클래스 로더의 인쇄 프로세스 및 객체 정보, 출력의 클래스 로더 지속적인 발전 : 아래 그림과 같이 객체가 살아 (신뢰할 수없는)인지 클래스 로더의 이름, 객체 주소, 친 클래스 로더는, 클래스 크기 및 기타 정보를로드 한 :

   GC 알고리즘, 힙 구성 매개 변수 및 각 세대 힙 메모리 사용량의 사용을 포함하여, 프로세스 힙 메모리 사용량을 볼 수있는 jmap -heap PID를 사용합니다. 다음 예와 같이 :

루트 @ 우분투 : / # jmap는 -heap 21711

ID 21711을 처리하기 위해 부착, 기다려주십시오 ...

디버거가 성공적으로 연결.

서버 컴파일러가 감지되었습니다.

JVM 버전은 20.10-B01입니다

스레드 로컬 객체 할당을 사용.

4 스레드 병렬 GC (S)

 

힙 구성 :

MinHeapFreeRatio = 40   

MaxHeapFreeRatio = 70   

MaxHeapSize = 2,067,791,872 (1972.0MB)

newSize와 = 1,310,720 (1.25MB)

MaxNewSize는 = 17,592,186,044,415메가바이트

OldSize = 5,439,488 (5.1875MB)

NewRatio = 2   

SurvivorRatio = 8   

PermSize = 21,757,952 (20.75MB)

를 MaxPermSize = 85,983,232 (82.0MB)

 

힙 사용법 :

PS 젊은 세대

에덴 공간 :

   용량 = 6,422,528 (6.125MB)

   중고 = 5,445,552 (5.1932830810546875MB)

   무료 = 976,976 (0.9317169189453125MB)

   84.78829520089286 % 사용

우주에서 :

   용량 = 131072 (0.125MB)

   중고 = 98,304 (0.09375MB)

   무료 = 32768 (0.03125MB)

   75.0 % 사용

공간 :

   용량 = 131072 (0.125MB)

   중고 = 0 (0.0MB)

   무료 = 131072 (0.125MB)

   0.0 % 사용

PS 올드 세대

   용량 = 35,258,368 (33.625MB)

   중고 = 4,119,544 (3.9287033081054688MB)

   무료 = 31,138,824 (29.69629669189453MB)

   11.683876009235595 % 사용

PS 파마 세대

   용량 = 52,428,800 (50.0MB)

   중고 = 26,075,168 (24.867218017578125MB)

   무료 = 26,353,632 (25.132781982421875MB)

   49.73443603515625 % 사용

   ....

    사용 jmap는의 -histo의 [: 라이브] 만, 객체를 살고 라이브 통계에 넣을 경우 힙 메모리의 뷰 객체의 PID 수는 히스토그램의 크기는 다음과 같다 :

 

루트 @ 우분투 : / #에있는 jmap의 -histo : 21,711 라이브 |

NUM은 ------------------------------------------- #bytes 클래스 이름을 #instances ---

   1 : 38,445 5,597,736 <constMethodKlass>

   2 : 38,445 5,237,288 <methodKlass>

   3 : 3500 3,749,504 <constantPoolKlass>

   4 : 60,858 3,242,600 <symbolKlass>

   5 : 3500 2,715,264 <instanceKlassKlass>

   6 : 2,796 2,131,424 <constantPoolCacheKlass>

   7 : 5543 1317400 [의 I

   8 : 13,714 1,010,768 [C

   9 : 4752 1,003,344 [B

  10 1,225 639,656 <methodDataKlass>

  11 : 14,194 454,208 java.lang.String의

  12 : 3809 396136 java.lang.Class의

  13 : 4979 311,952 [S

  14 : 5598 287064 [[I

  15 : 3028 266464 java.lang.reflect.Method의

  16 : 280 163,520 <objArrayKlassKlass>

  17 : 4355 139360 java.util.HashMap에 $ 항목

  18 1,869 138,568 [Ljava.util.HashMap $ 입력;

  19 : 2443 97720 java.util.LinkedHashMap $ 항목

  20 : 2072 82880 java.lang.ref.SoftReference

  21 1,807 71,528 [Ljava.lang.Object;

  22 : 2206 70592 java.lang.ref.WeakReference

  23 : 934 52304 Jawakutilklaidaked ः ashanap

  24 : 871 48776 java.beans.MethodDescriptor

  25 : 1442 46144 java.util.concurrent.ConcurrentHashMap $ HashEntry

  26 804 38 592 Jawakutilk ः의 ashanap

  27 : 948 37920 java.util.concurrent.ConcurrentHashMap $ 세그먼트

  28 1,621 35,696 [Ljava.lang.Class;

  29 1,313 34,880 [Ljava.lang.String;

  30 : 1396 33504되는 java.util.LinkedList $ 항목

  31 : 462 33264 java.lang.reflect.Field의

  32 : 1024 32768 java.util.Hashtable에 $ 항목

  33 : 948 31,440 [Ljava.util.concurrent.ConcurrentHashMap $ HashEntry;

    클래스 이름 개체 유형으로는 다음과 같습니다 :

 

B 바이트

C의 문자

이중 D

F 플로트

나는 int로

긴 J

Z 부울

[배열은, [I]는 [INT를 나타내는 예로서

다른 개체 [L + 클래스 이름

    아주 일반적인 상황도입니다 : 분석보기 jhat를 다음 파일에 프로세스 메모리 사용량 덤프를 jmap을합니다. 다음과 같이 덤프 명령 형식에 대한 jmap는이다 :

 

jmap는의 -dump : 형식 = B, 파일 = dumpFileName PID

위의 프로세스 ID 21711을 수행하기 위해 덤프 :

 

루트 @ 우분투 : / #에있는 jmap의 -dump : 형식 = B, 파일 = / tmp를 / 21,711 dump.dat     

힙 덤프하는 것은 /tmp/dump.dat합니다 ...

힙 덤프 파일 생성

   덤프 파일이 jhat를 여기 MAT, VisualVM과 및 기타 도구로 볼 수 있습니다 :

 

루트 @ 우분투 : / # jhat를 -port 9998 /tmp/dump.dat

/tmp/dump.dat에서 읽기 ...

덤프 파일 생성 (화) 1월 28일 중부 표준시 17시 46분 14초 2014Snapshot는 해결 읽고 ...

132,207 개체를 해결 ...

참조 쫓는, 26 점을 기대 ..........................

중복 참조를 제거 ..........................

스냅 샷은 해결.

포트 9998Server에 시작 HTTP 서버가 준비되었습니다.

     덤프 파일이 너무 큰 경우, 당신은이 매개 변수는 -J-Xmx512m이 9998 /tmp/dump.dat을 -port jhat를 최대 힙 메모리를 지정합니다 -J-Xmx512m를 추가해야 할 수도 있습니다. 의 9998 전망 : 그런 다음 브라우저에서 호스트 주소를 입력 할 수 있습니다

추천

출처www.cnblogs.com/name/p/11757141.html