高CPU占用
命令top:
- (1)top…:系统运行时间
- (2)Tasks…:系统进程相关
- (3)Cpu…:cpu相关
- (4)Mem:内存相关
- (5)Swap:交换分区相关
- (6)PID…:具体进程信息
(1)系统运行时间:
系统当前时间|系统到目前运行时间|当前系统登录的用户数量|负载均衡|1min|5min|15min
(2)系统进程相关
总进程数|正在运行进程数|挂起进程数|停止进程数|僵尸进程数
(3)cpu相关
用户空间占用CPU百分比|内核空间占用cpu时间|用户空间内改变过优先级的进程占用cpu百分比| 空闲cpu百分比|等待输入输出百分比|cpu服务于硬件终端所耗费cpu时间百分比|cpu服务于软件终端所耗费cpu时间百分比|steal time
(4)内存相关
物理总内存|已使用物理内存|空闲内存量|缓冲区内存总量
(5)交换分区相关
交换区总量|已使用交互区总量|空闲交换区总量|缓冲的交换区总量
(6)具体进程信息
进程iD|进程所有者|优先级|nice值|进程使用的虚拟内存总量|进程使用的未被换出的物理内存|共享内存大小|进程状态|进程占用的cpu百分比|进程使用cpu总时间|命令行
占用cpu高原因:计算密集型应用 / 死循环
命令ps aux|grep pid定位tomcat进程问题
命令ps -mp pid -o THREAD,tid,time 定位到具体的线程或代码
Cpu和耗时
命令:printf ”%x\n” tid 将线程id转为16进制格式
Printf ”%x\n” 15731
命令打印线程的堆栈信息:jstack pid|grep tid -A 30
- top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
- PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
- jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
- pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
jstack
是java虚拟机自带的一种堆栈跟踪工具。
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
线程的几种状态
- NEW,未启动的。不会出现在Dump中。
- RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
- BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了
- WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(),sleep(),join() 等语句里。
- TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait()等语句加上了时间限制 wait(timeout)。
- TERMINATED,已退出的。
Java内存泄漏
Jstat命令:可以查看堆内存各部分使用量以及加载类的数量。
Jstat [-命令选项] [vmid][间隔时间/毫秒][查询次数]
通过jstat观察到业务系统fullgc比较频繁 最后oom
用jmap查看存活对象情况 jmap -histo:live pid 可以看到实例数量
定位到代码