>  기사  >  Java  >  Java에서 JVM 명령을 사용하여 서버 문제를 해결하는 방법

Java에서 JVM 명령을 사용하여 서버 문제를 해결하는 방법

青灯夜游
青灯夜游앞으로
2018-10-17 15:28:302488검색

이 기사에서는 Java에서 JVM 명령을 사용하여 서버 문제를 해결하는 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. top(Linux 명령)

top 명령 실행: (아래에서 사용된 프로세스 15477의 세부 정보 보기)

 

시스템 정보(처음 5줄):

    • 라인 1: 상위 작업 대기열 정보(시스템 실행 상태 및 평균 부하). uptime 명령 결과와 동일합니다.

      • 평균 시스템 로드: 단일 코어 CPU의 경우 0.00은 로드 없음을 의미하고, 1.00은 전체 로드를 의미하며, 1개 이상의 면은 과부하를 의미하며, 이상적인 값은

      • 멀티 코어입니다. CPU 로드: CPU 코어 수 * 이상적인 값 0.7 = 이상적인 로드, 예: 4코어 CPU 로드는 2.8을 초과하지 않습니다. 이는 높은 로드가 없음을 의미합니다.

      • 형식: 최대 xx일, HH:MM

      • 예: 241일, 20:11은 241일 20시간 11분 동안 지속적으로 실행되었음을 의미합니다

      • 단락 1: 시스템 현재 시간, 예: 16:07:37

      • 단락 2: 시스템 실행 시간, 다시 시작하기 전의 시간 시간이 길수록 시스템이 더 안정적입니다.

      • 단락 3: 현재 로그인된 사용자 수, 예: 1 user, 현재 로그인한 사용자는 1명임을 나타냅니다.

      • 단락 4: 시스템 로드, 즉 평균 길이 작업 대기열, 3가지 값은 최근에 계산됩니다. 1, 5, 15분 동안의 시스템 부하 평균

    • 2행: 작업 프로세스 관련 정보

      • 단락 1: 총 프로세스 수, 예: 작업: 총 231개, 실행 중인 총 231개의 프로세스를 나타냅니다.

      • 단락 2: 실행 중인 프로세스 수, 예: 실행 중인 1개,

      • 단락 3: 휴면 프로세스 수, 예: 230 Sleeping,

      • 4단락: 중지된 프로세스 수, 예: 0 중지됨,

      • 단락 5: 좀비 프로세스 수, 예: 0 Zombie

    • 라인 3: Cpus CPU 관련 정보 멀티 코어 CPU인 경우 숫자 1을 누르면 각 코어의 CPU 정보가 표시됩니다. 이때 1번 줄은 CPU 코어 번호 줄로 변환되며 1번 줄은 앞뒤로 전환될 수 있습니다. .

      • 단락 1: us 사용자 공간 점유 CPU 백분율us 用户空间占用CPU百分比,例如:Cpu(s): 12.7%us,

      • 第2段:sy 内核空间占用CPU百分比,例如:8.4%sy,

      • 第3段:ni 用户进程空间内改变过优先级的进程占用CPU百分比,例如:0.0%ni,

      • 第4段:id 空闲CPU百分比,例如:77.1%id,

      • 第5段:wa 等待输入输出的CPU时间百分比,例如:0.0%wa,

      • 第6段:hi CPU服务于硬件中断所耗费的时间总额,例如:0.0%hi,

      • 第7段:si CPU服务软中断所耗费的时间总额,例如:1.8%si,

      • 第8段:st Steal time 虚拟机被hypervisor偷去的CPU时间(如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)

    • 第4行:Mem 内存相关信息(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers) 

      • 第1段:物理内存总量,例如:Mem: 12196436k total,

      • 第2段:使用的物理内存总量,例如:12056552k used,

      • 第3段:空闲内存总量,例如:Mem: 139884k free,

      • 第4段:用作内核缓存的内存量,例如:64564k buffers

    •  第5行:Swap 交换分区相关信息(Swap: 2097144k total, 151016k used, 1946128k free, 3120236k cached) 

      • 第1段:交换区总量,例如:Swap: 2097144k total,

      • 第2段:使用的交换区总量,例如:151016k used,

      • 第3段:空闲交换区总量,例如:1946128k free,

      • 第4段:缓冲的交换区总量,3120236k cached

 进程信息:

  在top命令中按f按可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*号的是默认列。

    • A: PID = (Process Id) 进程Id;

    • E: USER, 예: Cpu(s): 12.7%us,

      🎜🎜🎜단락 2: sy 커널 공간이 차지하는 CPU 비율(예: 8.4%sy,🎜🎜🎜🎜3단락: ni 우선순위가 변경된 프로세스가 차지하는 CPU 비율) 사용자 프로세스 공간에서, 예: 0.0%ni,🎜🎜🎜🎜단락 4: id 유휴 CPU 비율, 예: 77.1%id,🎜🎜🎜🎜단락 5: wa 입력 대기 중 CPU 시간 백분율을 출력합니다. 예: 0.0% wa, 🎜🎜🎜🎜 단락 6: hi CPU가 하드웨어 인터럽트를 처리하는 데 소비한 총 시간, 예: 0.0 % hi, 🎜🎜🎜🎜 단락 7: si CPU 서비스 소프트 인터럽트에 소요된 총 시간입니다. 예: 1.8%si,🎜🎜🎜🎜단락 8: st Steal time 하이퍼바이저가 가상 머신을 훔쳤습니다. 소비된 CPU 시간(VM이 현재 하이퍼바이저에 있는 경우 하이퍼바이저는 실제로 CPU 처리 시간의 일부를 소비합니다.) 🎜🎜🎜🎜🎜라인 4: 🎜🎜Mem 메모리 관련 정보 🎜 (Mem: 총 12196436k, 사용된 12056552k, 사용 가능한 139884k, 버퍼 64564k) 🎜🎜🎜🎜🎜🎜단락 1: 총 물리적 메모리, 예: Mem: 총 12196436k,🎜🎜🎜 🎜2항: 총 금액 사용된 물리적 메모리의 양, 예: 12056552k 사용됨,🎜🎜🎜🎜페이지 3: 사용 가능한 총 메모리 양, 예: Mem: 139884k free,🎜🎜🎜🎜페이지 4: 커널 캐시로 사용된 메모리 양, 예: 64564k 버퍼🎜🎜🎜🎜🎜페이지 5 행: 스왑 파티션 관련 정보 스왑(스왑: 총 2097144k, 151016k 사용, 1946128k 무료, 3120236k 캐시) 🎜🎜🎜🎜🎜🎜단락 1: p 영역 총계, 예: 스왑 : 총 2097144k,🎜🎜🎜 🎜No.2 세그먼트: 사용된 스왑 영역의 총량, 예: 151016k 사용,🎜🎜🎜🎜세그먼트 3: 프리 스왑 영역의 총량, 예: 1946128k free,🎜🎜🎜🎜 세그먼트 4: 버퍼링된 스왑 영역의 총량, 3120236k 캐시됨 🎜🎜🎜🎜🎜🎜 🎜프로세스 정보: 🎜🎜🎜 상단 명령에서 f를 누르면 표시된 열 정보를 볼 수 있고, 해당 문자를 누르면 열을 켜거나 끌 수 있습니다. . 대문자는 켜짐을 의미하고, 소문자는 꺼짐을 의미합니다. *로 표시된 열은 기본 열입니다. 🎜🎜🎜🎜🎜🎜🎜A: PID = (프로세스 ID) 프로세스 ID 🎜🎜🎜🎜🎜E: USER = (사용자 이름) 프로세스 소유자의 사용자 이름 🎜
    • H: PR = (우선순위) 우선순위 PR = (Priority) 优先级

    • I: NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级

    • O: VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

    • Q: RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

    • T: SHR = (Shared Mem size (kb)) 共享内存大小,单位kb

    • W: S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程

    • K: %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比

    • N: %MEM = (Memory usage (RES)) 进程使用的物理内存百分比

    • M: TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒 
      b: PPID = (Parent Process Pid) 父进程Id 
      c: RUSER = (Real user name) 
      d: UID = (User Id) 进程所有者的用户id 
      f: GROUP = (Group Name) 进程所有者的组名 
      g: TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ? 
      j: P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义 
      p: SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb 
      l: TIME = (CPU Time) 进程使用的CPU时间总计,单位秒 
      r: CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb 
      s: DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb 
      u: nFLT = (Page Fault count) 页面错误次数 
      v: nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数 
      y: WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名 
      z: Flags = (Task Flags ) 任务标志,参考 sched.h

    • X: COMMAND

    I: NI = (좋은 값) 좋은 값입니다. 음수 값은 높은 우선 순위를 나타내고, 양수 값은 낮은 우선 순위를 나타냅니다

O: VIRT = (가상 이미지(kb)) 프로세스에서 사용하는 총 가상 메모리 양, 유닛 kb . VIRT=SWAP+RES

Q: RES = (상주 크기(kb)) 프로세스에서 사용하고 스왑 아웃

되지 않은 물리적 메모리의 크기(kb)입니다. RES=CODE+DATA

T: SHR = (공유 메모리 크기(kb)) 공유 메모리 크기, 단위 kb

W: S = ( 프로세스 상태) 프로세스 상태입니다. D=무중단 절전 상태, R=실행 중, S=절전, T=추적/중지, Z=좀비 프로세스

K: %CPU = (CPU 사용량) 마지막 업데이트 현재 CPU 시간 사용량 백분율

N: %MEM = (메모리 사용량(RES)) 프로세스에서 사용하는 물리적 메모리의 백분율

M: TIME+ = (CPU 시간, 100분의 1) 프로세스에서 사용한 총 CPU 시간, 단위 1/100초
b: PPID = (상위 프로세스 Pid) 상위 프로세스 Id
c: RUSER = (실제 사용자 이름)
d: UID = (사용자 ID) 프로세스 소유자의 사용자 ID
f : GROUP = (그룹 이름) 프로세스 소유자의 그룹 이름
g: TTY = (Tty 제어) 프로세스를 시작한 터미널의 이름 . 터미널에서 시작되지 않은 프로세스는 다음과 같이 표시됩니다.
j: P = (마지막으로 사용한 CPU(SMP)) 마지막으로 사용한 CPU는 다중 CPU 환경에서만 의미가 있습니다.
p: SWAP = (스왑된 크기(kb)) 스왑 아웃된 프로세스에서 사용하는 가상 메모리의 크기(kb)
l: TIME = (CPU 시간) 프로세스에서 사용한 총 CPU 시간(초)
r: CODE = (코드 크기(kb)) 실행 코드가 차지하는 물리적 메모리 크기 , kb
s: DATA = (데이터+스택 크기(kb)) 실행 코드 이외의 부분(데이터 세그먼트 + 스택)이 차지하는 물리적 메모리 크기, 단위 kb
u: nFLT code> = (페이지 폴트 수) 페이지 폴트 수 <br>v: <code>nDRT = (더티 페이지 수) 이후 수정된 페이지 수 마지막으로 작성된 시간
y: WCHAN = (Sleeping in Function) 프로세스가 절전 모드인 경우 절전 모드의 시스템 함수 이름이 표시됩니다.
z: 플래그 code> = (작업 플래그 <sched.h>) 작업 플래그, sched.h 참조<p></p> <p></p> <p>top -Hp PID 실행, 예: top -Hp 15477<img src="https://img.php.cn/upload/article/000/000/024/00a3d0e0fc1c314d9dbd1c777dd54c3b-4.png" alt="" style="max-width:90%"></p>프로세스의 스레드 보기 <p><span style='font-family: "Microsoft YaHei"'>참고: 이때 PID는 스레드 id</span></p> <p><span style='font-family: "Microsoft YaHei"'></span>스레드 15571에 예외가 있어서 확인해야 할 경우 jstack을 사용하여 스택을 인쇄하고 스레드 15571 상태를 확인하세요(15571 16진수 = 3cd3) </p>🎜 🎜🎜🎜🎜 2. jstack 🎜🎜 참조 java 명령 - jstack 도구 🎜🎜 ps jstack 로그를 통해 Java 프로세스를 볼 수 있습니다: 🎜🎜🎜🎜🎜 🎜🎜🎜 모니터 모니터: 🎜🎜🎜 모니터는 Java에서 스레드 간의 상호 배제 및 협력을 달성하는 것은 객체 잠금 또는 클래스 잠금으로 간주될 수 있습니다. 🎜🎜모든 개체에는 모니터가 하나만 있습니다. 🎜🎜다음 그림은 스레드와 모니터의 관계 및 스레드의 상태 전이를 설명합니다. 🎜🎜🎜🎜🎜🎜Entrt Set: 스레드가 동기화를 통해 개체의 잠금을 획득하도록 요청함을 나타냅니다. 객체가 잠겨 있으면 소유자를 입력하고 그렇지 않으면 항목 영역에서 기다리십시오. 객체 잠금이 다른 스레드에 의해 해제되면 즉시 경쟁에 참여합니다. 🎜🎜🎜🎜The Owner(소유자): 스레드가 개체 잠금을 위해 성공적으로 경쟁했음을 나타냅니다. 🎜🎜<p><span style='font-family: "Microsoft YaHei"'>Wait Set: 스레드가 객체의 <span style='font-family: "Microsoft YaHei"'>object.wait</span>() 메서드를 통해 객체의 잠금을 해제하고 대기 영역에서 깨어나기를 기다림을 나타냅니다. </span></p> <p><span style='font-family: "Microsoft YaHei"'>그림에서 볼 수 있듯이 모니터는 특정 순간에 하나의 스레드만 소유할 수 있습니다. 이 스레드는 <span style='font-family: "Microsoft YaHei"'><code><code><span style='font-family: "Microsoft YaHei"'>Active Thread</span>,而其它线程都是 <span style='font-family: "Microsoft YaHei"'>Waiting</span> <span style='font-family: "Microsoft YaHei"'>Thread</span>,分别在两个队列 <span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>和 <span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>里面等候。

<span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>中等待的线程动作是 <span style='font-family: "Microsoft YaHei"'>Waiting for monitor entry</span>。

在 <span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>中等待的线程动作是 <span style='font-family: "Microsoft YaHei"'>in Object.wait()</span>Active Thread

이고 다른 스레드는 입니다. Waiting <p>Thread<span style="color: #888888"></span></p>, 각각 두 개의 대기열 Entry <h4>Set</h4><p>Wait<strong> </strong>Set</p>에서 대기 중입니다.

Entry

Set

에서 대기 중인 스레드 작업은 Waiting for monitor Entry입니다.

<strong>Wait</strong> <span style="color: #993300">Set<strong></strong></span>에서 대기 중인 스레드 작업은 Object.wait()

<p>입니다. <strong>스레드가 임계 섹션에 들어가기 위해 적용되면 Entry Set 대기열에 들어갑니다. </strong><span style="color: #993300"><strong><strong>(Synchronized로 보호되는 코드 세그먼트를 임계 섹션이라고 부릅니다. 스레드가 임계 섹션에 진입하기 위해 적용되면 "Entry Set" 대기열에 들어갑니다.) </strong></strong></span>스레드 상태: </p> <p><strong>NEW</strong>: 아님 시작되었습니다. 덤프에 나타나지 않습니다. </p> <h4></h4>RUNNABLE<p>: 가상 머신에서 실행되는 실행 상태입니다. </p> <p>소유자 영역<strong></strong><span style="color: #000000"></span></p>BLOCKED<p>: 차단되었으며 모니터 잠금을 기다리는 중입니다. <strong></strong>엔트리 세트 구역에서 자물쇠<span style="color: #000000"></span>를 기다리고 있습니다. </p> <p><strong>WATING</strong>: 다른 스레드가 특정 작업을 수행할 때까지 무기한 대기합니다. <span style="color: #000000"></span>Wait Set 영역에서</p> <p>특정 조건이나 모니터가 발생할 때까지 기다리세요. 일반적으로 wait()와 같은 문에 머물게 됩니다. <strong></strong><span style="color: #000000">TIMED_WATING</span>: 다른 스레드에서 특정 작업을 기다리는 시간이 제한되어 있습니다. </p> <p> <span style="color: #808080">Wait </span>Set Area </p> <p>와 WAITING의 차이점은 wait() 및 기타 문에 wait(timeout) 시간 제한을 추가한다는 것입니다. <span style="color: #808080"></span></p>TERMINATED<h4>: 종료되었습니다. </h4> <p>호출 수정</p> <p>은 스레드가 메서드를 호출할 때 추가로 중요한 작업을 나타냅니다. 위의 메서드 호출을 수정하세요. <strong></strong></p>locked<p> <주소> 대상 : 모니터 소유자인 객체 잠금을 성공적으로 신청하려면 동기화를 사용하세요. <strong>소유자 공간. </strong></p> <p><strong>잠금 대기 중</strong> <주소> 대상: 동기화를 사용한 개체 잠금 신청이 실패했습니다. </p>항목 세트 영역에서 잠금을 기다리는 중입니다. 스레드 상태는 Blocked<p><strong></strong></p>waiting on<p> <Address> 목표: 동기화를 사용하여 객체 잠금을 성공적으로 적용한 후 잠금을 해제하고 대기 설정 영역에서 잠금을 기다립니다. 스레드 상태는 WAITING 또는 TIMED_WATING<strong></strong></p>🎜parking to wait for🎜 <Address> 대상: park()가 🎜Wait Set 영역에서 호출되어 허가를 기다리고 있습니다. 🎜🎜🎜🎜(park는 모니터를 통해 개체를 차단하지 않는 기본 스레드 차단 기본 요소입니다. 🎜🎜🎜🎜 park: 스레드가 잠금을 얻을 필요가 없는 wait와 비교하여 WAITING 상태로 들어갑니다. 기다렸다가 unpark를 통해 깨어남) 🎜 🎜🎜Thread action🎜🎜Thread 상태가 생성되는 이유. 🎜🎜🎜runnable🎜: 소유자 영역, Object.wait()🎜의 RUNNABLE🎜🎜🎜 상태: wait() 호출, 대기 설정 영역, 상태는 WAITING 또는 TIMED_WAITING, 대기 수정 🎜🎜🎜모니터 항목 대기🎜: 잠금 대기 중, 진입 설정 영역, 상태 BLOCKED, 수정 대기 중 잠금🎜🎜🎜대기 조건🎜: 특정 조건으로 인해 주차됨, 대기 설정 영역, 상태는 대기 중🎜🎜🎜sleeping🎜: 휴면 스레드, 스레드 호출 .수면()🎜<h4>요약</h4> <p>1. 먼저 스레드 상태/스레드 동작을 살펴보고(더 직관적으로) 스레드가 현재 어느 단계에 있는지 확인하세요. 그런 다음 통화 수정 및 잠금 상태를 보면 기본적으로 보조 스레드에 문제가 있는지 확인할 수 있습니다. </p> <p>2. 짧은 시간(문제가 있을 수 있는 기간)에 스레드 스냅샷을 여러 번 인쇄할 수 있습니다. ) 그런 다음 문제가 있을 수 있는 특정 스레드의 위치를 ​​확인합니다. 이러한 경우 문제를 효과적으로 찾을 수 있습니다. </p> <h3> 3. jps</h3> <p>는 리눅스 명령어 ps와 비슷합니다. </p> <p>참고 자바 명령어 학습 시리즈(1) - Jps</p> <p>./jps</p> <p style="text-align: center;"><img src="https://img.php.cn/upload/article/000/000/024/2ed616fdd55510daae590e67d898e325-5.png" alt="" style="max-width:90%"></p> <p> ./jps -q</p> <p style="text-align: center;"><img src="https://img.php.cn/upload/article/000/000/024/2ed616fdd55510daae590e67d898e325-6.png" alt="" style="max-width:90%"></p> <p>./jps - m</p> <p style="text-align: center;"><img src="https://img.php.cn/upload/article/000/000/024/5cca488162d1a4710804a5c5e517320b-7.png" alt="" style="max-width:90%"></p> <p></p>./JPS -L j./JPS -V<p style="text-align: center;"><img src="https://img.php.cn/upload/article/000/000/024/5cca488162d1a4710804a5c5e517320b-8.png" alt="" style="max-width:90%"></p> <p></p> 4, JMAP<p style="text-align: center;"><img src="https://img.php.cn/upload/article/000/000/024/d80cdd751a575a3d3b19657daefa47da-9.png" alt="" style="max-width:90%" style="max-width:90%"> 참고 자료: Java 명령 학습 시리즈(3) -JMAP</p> <h3> Java 명령 -JMap 명령은 </h3> <p> jmap을 사용합니다. -heap PID: 힙 사용량 </p> <p>jmap -histo PID: 개체 상태 </p> <p> (jmap -histo:live 이 명령이 실행되면 JVM은 먼저 gc를 트리거한 다음 통계를 수집합니다. </p> <p>프로젝트의 클래스에 중점을 둡니다. [C는 문자열에 사용되는 문자열 배열입니다. [B는 네트워크 계층에서 사용되는 바이트 배열입니다. 둘이 더 크더라도 상관없습니다.[]</p> <p> </p> [S는 짧습니다. []<p> </p> <p>  [나는 정수입니다. []<span style=" font-family: Arial; letter-spacing: 0.5px"></span> <br> 더 많은 관련 튜토리얼을 보려면 <span style=" font-family: Arial; letter-spacing: 0.5px">Java 비디오 튜토리얼</span>, <br>Java 개발 그래픽 튜토리얼<span style=" font-family: Arial; letter-spacing: 0.5px">, </span>부트스트랩 비디오 튜토리얼<br>을 방문하세요.</p>

위 내용은 Java에서 JVM 명령을 사용하여 서버 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제