이 기사에서는 Java에서 JVM 명령을 사용하여 서버 문제를 해결하는 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
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,
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
X: COMMAND
NI
= (좋은 값) 좋은 값입니다. 음수 값은 높은 우선 순위를 나타내고, 양수 값은 낮은 우선 순위를 나타냅니다O: VIRT
= (가상 이미지(kb)) 프로세스에서 사용하는 총 가상 메모리 양, 유닛 kb . VIRT=SWAP+RES
Q: RES
= (상주 크기(kb)) 프로세스에서 사용하고 스왑 아웃
SHR
= (공유 메모리 크기(kb)) 공유 메모리 크기, 단위 kb
W: S
= ( 프로세스 상태) 프로세스 상태입니다. D=무중단 절전 상태, R=실행 중, S=절전, T=추적/중지, Z=좀비 프로세스
K: %CPU
= (CPU 사용량) 마지막 업데이트 현재 CPU 시간 사용량 백분율
%MEM
= (메모리 사용량(RES)) 프로세스에서 사용하는 물리적 메모리의 백분율M: TIME+ = (CPU 시간, 100분의 1) 프로세스에서 사용한 총 CPU 시간, 단위 1/100초
PPID
= (상위 프로세스 Pid) 상위 프로세스 Id RUSER
= (실제 사용자 이름) UID
= (사용자 ID) 프로세스 소유자의 사용자 ID GROUP
= (그룹 이름) 프로세스 소유자의 그룹 이름 TTY
= (Tty 제어) 프로세스를 시작한 터미널의 이름 . 터미널에서 시작되지 않은 프로세스는 다음과 같이 표시됩니다. P
= (마지막으로 사용한 CPU(SMP)) 마지막으로 사용한 CPU는 다중 CPU 환경에서만 의미가 있습니다. SWAP
= (스왑된 크기(kb)) 스왑 아웃된 프로세스에서 사용하는 가상 메모리의 크기(kb) TIME
= (CPU 시간) 프로세스에서 사용한 총 CPU 시간(초) CODE
= (코드 크기(kb)) 실행 코드가 차지하는 물리적 메모리 크기 , kb DATA
= (데이터+스택 크기(kb)) 실행 코드 이외의 부분(데이터 세그먼트 + 스택)이 차지하는 물리적 메모리 크기, 단위 kb nFLT code> = (페이지 폴트 수) 페이지 폴트 수 <br>v: <code>nDRT
= (더티 페이지 수) 이후 수정된 페이지 수 마지막으로 작성된 시간 WCHAN
= (Sleeping in Function) 프로세스가 절전 모드인 경우 절전 모드의 시스템 함수 이름이 표시됩니다. 플래그 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
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!