项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度也会变大。因此监控是非常重要的一个环节,有了监控,我们才能更好的定位系统中的问题,从而排查。监控的工具有很多种, 但是java自带的命令行监控工具,是必须要掌握的。

jps

查看系统中jvm进程, 其它的命令通常先使用jps查看进程号,然后在根据线程号获取jvm进程信息

image.png

jps -m 查看jvm进程并且带有参数查看

jps -v 查看传递到jvm的参数

jstat

显示JVM的性能统计信息,

常见用法:jstat - [-t] [-h] [ []]

例如:查看JIT编译信息,GC信息和JVM中的class信息。

image.png

解释下-gc选项中列的含义:-gc查看垃圾收集器中的信息, 主要包含jvm的运行时数据区统计。

后缀为C的代表当前区的容量,后缀为U的代表已经使用了多少容量,后缀为T的代表耗时

S0C 存活区0的容量(KB)

S1C 存活区1的容量(KB)

S0U 存活区0使用的空间 (KB).

S1U 存活区1的利用空间 (KB).

EC Eden区的容量(KB).

EU Eden区利用的容量(KB).

OC 老年代容量(KB).

OU 老年代使用容量(KB).

PC 当前永久带的容量(KB).

PU 永久带使用容量(KB).

YGC 发生了多少次Young GC

YGCT Young GC的时间

FGC Full GC的次数

FGCT Full GC的收集时间

GCT 总共的GC时间.

jstack

查看线程堆栈信息,在发生死锁的时候可以利用这个命令查找死锁或者在发生死循环的时候利用此命令排查。

jstack vmpid 会打印线程的堆栈信息。通过堆栈可以查看具体线程正在执行那些代码,厦门演示两个使用jstack排查死锁与死循环的命令。

死锁代码:

public class DeadLock {

private static Object o1 = new Object();

private static Object o2 = new Object();

private static CountDownLatch countDownLatch = new CountDownLatch(2);

public static void main(String[] args) throws InterruptedException {

new Thread(){

@Override

public void run() {

synchronized (o1){

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("线程1 获得锁1");

synchronized (o2){

System.out.println("线程1 获得锁2");

countDownLatch.countDown();

}

}

}

}.start();

new Thread(){

@Override

public void run() {

synchronized (o2){

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("线程2 获得锁2");

synchronized (o1){

System.out.println("线程2 获得锁1");

countDownLatch.countDown();

}

}

}

}.start();

countDownLatch.await();

System.out.println("执行完毕");

}

}

死锁之后:

可以看到jstack已经帮我们找到了死锁。

image.png

image.png

死循环需要配合Top命令一起使用,死循环会导致CPU不断的飙升,这时候使用top命令,查看cpu占用率较高的命令:

image.png

使用top -H -p 24278 查看进程中具体是那一条线程的CPU利用率高

image.png

可以看到是24279的线程,在top中使用的是10进制,在jstack中打印的线程是16进制,因此做一次转换。

24279 => 5ed7

然后查看线程:

image.png

然后我们可以知道具体那一行的指令在一直运行。

jinfo查看JVM启动时候设置的参数值

jinfo可以查看当前JVM线程配置的系统属性,以及运行时设置的参数值。

直接使用jinfo

前半段是系统的属性

image.png

后半段是jvm的参数

image.png

我们也可以直接使用jinfo查看具体的某个参数值:

image.png

jmap分析堆

在发生OME的时候,会用jmap分析堆中具体是什么问题,才能更好的解决问题。jmap一般和mat配合使用。

一般在java开发的项目启动时候,最好加上下面命令,在内存溢出的时候可以通过日志查看信息。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/dump

当然在项目运行的时候也可以使用jmap -heap jvmpid查看对象内存的映射。

演示内存溢出

堆内存溢出代码

public class DealCycle {

public static LinkedList linkedList = new LinkedList<>();

public static void main(String[] args) {

int i = 0;

while (true){

linkedList.add(i);

}

}

}

运行:

image.png

大家可以去网站上下载java mat的二进制压缩包,学习一下

image.png

image.png

如果每次都等到内存溢出才导出文件时间就有些晚了,可以使用jmap直接导出

image.png

最后

这篇文章主要介绍了java自带的命令行工具,通过这些命令行工具,我们可以很好的得知当前jvm的运行状态。

java内存溢出排查jstack_Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)相关推荐

  1. java jamp cmd,Java命令行监控工具jmap,jstack...

    原标题:Java命令行监控工具jmap,jstack... Java命令行监控工具(jmap,jstack,jstat,jinfo,jps) 项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度 ...

  2. 【Java内存溢出排查】gc监测以及内存突增问题排查

    前情提要 文档:[Java内存溢出排查]测试环境服务器挂... 链接:http://note.youdao.com/noteshare?id=783e7ec89950f4167867ef3ef3347 ...

  3. Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件

    1.Java内存泄露和内存溢出对比 1.1 Java 内存泄露 内存泄露是指一个不再被程序使用的对象或变量还在内存中占用空间. 1.1.1判断内存空间是否符合垃圾回收的标准 在Java语言中,判断一个 ...

  4. java内存溢出排查top_process-parse-shell

    process-parse-shell 介绍 cpu 和 内存异常排查分析shell脚本和步骤 比如用于排查高cpu(top,jstack)和内存溢出等情况 安装教程 使用说明 cpu排查分析 #下载 ...

  5. Java内存溢出排查(必看)

    Java OOM毫无疑问是开发人员常见并且及其痛恨的问题,但是任何服务的开发都没法避免OOM.因此,OOM的排查及定位是每个Java工程师都必备的技能. 所遇到的问题 在使用scala开发的一个web ...

  6. linux下Java内存溢出排查

    1.查询gc情况(每1秒钟打印一次gc情况) jstat -gcutil pid 1000:1 查询结果含义: S0:幸存区1占用率 S1:幸存区2占用率 E:Eden区占用率 O:老年区占用率 M: ...

  7. java 内存溢出 jstack,Java——命令jps、jstat、jmap、jstack、jhat、jinfo

    JAVA_HOME/bin/ 目录下jdk提供了很多自带工具,下面以tomcat下的web项目为例.如果感觉输出内容太多可以使用 xxx | head -n 20 显示输出内容的头20行. jps j ...

  8. Java内存溢出问题排查分析

    目录 前言 一.MAT(Memory Analyzer Tool) 二.软件初识 三.捕获dump文件 1.主动方式 2.被动方式 四.分析dump文件 总结 前言 项目运行过程中,我们可能会遇到Ja ...

  9. Java 内存溢出(一)原因、复现、排查

    目录 一.内存溢出原因 二.内存溢出实例 1.堆溢出 2.虚拟机栈和本地方法栈溢出 3.方法区和运行时常量池溢出 4.本机直接内存溢出 三.内存溢出排查 内存溢出: 是指应用系统中存在无法回收的内存或 ...

最新文章

  1. 开放-封闭原则(The Open-Closed Principle,OCP)
  2. SQL批量修改字段值
  3. Java基础语法十二 泛型程序设计
  4. OpenGL 实例化属性的实例
  5. Spring Web Flow 2.0 入门详解
  6. 上传问题分析2--文件重名
  7. Mac常用开源软件与下载链接一览
  8. 甘特图看起来很生硬?教你使用智能颜色装饰你的甘特图!(一)
  9. DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
  10. 在eclipse中配置server和database
  11. 比赛现场打分管理平台的前后台安装配置和使用疑难问题汇编
  12. jdk11下载与安装教程(win10)超详细
  13. orbslam2+azure kinect DK稠密重建
  14. HTML打造动漫人物,19个搭配很酷的卡通人物网站设计欣赏
  15. hdu5761 Rower Bo(物理题or瞎猜)
  16. 5个小组,只有一个女黑客,他们居然要模仿妲己?
  17. 基于51单片机的电梯控制器
  18. acer台式电脑怎么重装系统_acer电脑U盘重装操作系统图文教程
  19. 模型量化(3):ONNX 模型的静态量化和动态量化
  20. EMC | 静电放电抗扰度试验与整改

热门文章

  1. CSS导航条菜单:带小三角形
  2. hadoop(9)--MapReduce入门WordCount
  3. 【10大专利看iPhone未来】全息图、虚拟卷轴,移动AR……苹果还有哪些黑科技?...
  4. Hive 正则匹配函数 regexp_extract
  5. .难忘的大学时光·~~~~~
  6. 在桌面应用程序与Web应用程序之间该如何选择
  7. MySQL事务效率测试
  8. ASP.NET Web API中的参数绑定总结
  9. 关于JAVA编译时找不到自定义包的问题
  10. Ubuntu13.10:[3]如何开启SSH SERVER服务