1.jvm监控工具介绍

1.1.jconsole

  JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。

1.2.启动jconsole

  通过JDK/bin目录下的“jconsole.exe”启动Jconsole后,将自动搜索出本机运行的所有虚拟机进程,双击其中一个进程即可开始监控。

  也可以“远程连接服务器,进行远程虚拟机的监控。

  

  补充:根据端口号查看进程

  netstat -ano |findstr 8080
  解释:|findstr 8080 表示过滤出包括8080的数据,相当于关键字查找

1.2.1.概览页面

  进入监控界面后如下图

  

  概述页面显示的是整个虚拟机主要运行数据的概览。

1.2.2.内存监控

  

1.2.3线程监控

  此处的线程监控,可以方便的进行死锁检测,非常重要

  

1.2.4.类加载监控

  

1.2.5.jvm报表

  

1.3.jvisualvm

  提供了和jconsole的功能类似,提供了一大堆的插件。
  插件中,Visual GC(可视化GC)还是比较好用的,可视化GC可以看到内存的具体使用情况。

  启动方式,打开java安装目录,启动 bin/jvisualvm.exe 应用。

2.内存溢出实战模拟

  本节将以实际案例结合上面的jvm监控工具,深入的理解jvm!

2.1.案例一:内存溢出实战模拟

  测试代码:

 package com.wfd360.outofmemory;

 import java.util.ArrayList;

 /**
* VM Args:
* -Xms20m -Xmx20m
*/
public class TestMemory {
static class OOMObject {
public byte[] byt = new byte[1 * 1024 * 1024];
} public static void main(String[] args) throws Exception {
Thread.sleep(10000);
fillHeap(100);
Thread.sleep(10000);
} public static void fillHeap(int num) throws Exception {
ArrayList<OOMObject> list = new ArrayList<OOMObject>();
for (int i = 0; i < num; i++) {
Thread.sleep(500);
list.add(new OOMObject());
System.out.println("num=" + i);
}
System.gc();
} }

  测试jvm参数设置:

  

  测试结果:

  当创建第16个对象时,内存溢出

  

  可视化内存信息观察:

  

  分代回收机制理解:

  https://www.cnblogs.com/newAndHui/p/11106232.html

2.2.案例二:线程的异常等待与异常运行

  测试代码如下:

 package com.wfd360.outofmemory;

 import java.io.BufferedReader;
import java.io.InputStreamReader; public class TestThread {
/**
* 死循环演示
*
*/
public static void createBusyThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("createBusyThread");
while (true)
;
}
}, "testBusyThread");
thread.start();
} /**
* 线程锁等待
*
*/
public static void createLockThread(final Object lock) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("createLockThread");
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}, "testLockThread");
thread.start();
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
createBusyThread();
br.readLine();
Object object = new Object();
createLockThread(object);
}
}

  线程监视图:

  

  线程dump:

  

  总结:通过线程可视化观察,“testLockThread”线程一直处于等待状态,那么我们就可以使用dump,导出堆栈信息,查看具体原因。

2.3.案例三:线程死锁实战演示

  测试代码:

 package com.wfd360.thread;

 public class DeadThread implements Runnable {
//控制锁顺序
private boolean lockFormer;
//对象1
private static Object o1 = new Object();
//对象2
private static Object o2 = new Object(); DeadThread(boolean lockFormer) {
this.lockFormer = lockFormer;
} @Override
public void run() {
if (this.lockFormer) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1ok");
}
}
} else {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("2ok");
}
}
}
} public static void main(String[] args) {
for (int i = 0; i < 200; i++) {
new Thread(new DeadThread(true)).start();
new Thread(new DeadThread(false)).start();
}
}
}

  jvm内存监控观察:

  

  死锁检测:

  

2.3.1.死锁的构成基本条件

1、互斥条件:一份资源每次只能被一个进程或线程使用(在Java中一般体现为,一个对象锁只能被一个线程持有)

2、请求与保持条件:一个进程或线程在等待请求资源被释放时,不释放已占有资源

3、不可剥夺条件:一个进程或线程已经获得的资源不能被其他进程或线程强行剥夺

4、循环等待条件:形成一种循环等待的场景

2.4.案例四:内存快照分析

  测试代码:

 package com.wfd360.outofmemory;

 import java.util.ArrayList;
import java.util.List; /**
* 演示堆内存溢出
* 配置jvm参数
* VM Args:
* -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=f:/test/dump
* 参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析,文件在项目中
*/
public class HeapOOM {
static class OOMObject {
public byte[] byt = new byte[1 * 1024*1024];
} public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}

  jvm参数配置:

  

  测试结果:

  

  这时生产的内存快照在 f:/test/dump 中

  接下来,使用工具分析内存快照:

  1.解压 MemoryAnalyzer-1.5.0.20150527-win32.win32.x86_64.zip

    百度网盘下载链接:https://pan.baidu.com/s/1NYzO2ykruGAURg2SrPJqCQ
    提取码:mtqc
  2.启动 MemoryAnalyzer.exe

    

  3.打开刚才生成的内存快照  f:/test/dump

    

  4.内存快照分析

    

    从内存快照中可以清楚的看到产生内存溢出的原因。

    

    内存占比列表。

    还有其他的功能,大家自己点击查看。

深入理解jvm--性能监控工具的更多相关文章

  1. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...

  2. JVM性能监控工具(一)-jdk命令行工具

    转载:http://blog.csdn.net/top_code/article/details/51456186 当系统出bug需要定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处 ...

  3. 【转载】深入理解JVM性能调优

    性能问题无非就这么几种:CPU.内存.磁盘IO.网络.那我们来逐一介绍以下相关的现象和一些可能出现的问题. 一.CPU过高. 查看CPU最简单的我们使用任务管理器查看,如下图所示,windows下使用 ...

  4. JVM性能监控工具-Jvisualvm

    用法:Jvisualvm是JDK自带的一款性能分析工具 使用方式: 1.配置好JDK环境变量 1.本地JVM监控略 2.远程JVM监控 用JMX对Resin内存状态进行监控 ,可以看到本地所有可监控的 ...

  5. jvm性能监控工具

    jvm可能存在的问题:    OutOfMemoryError:内存不足    内存泄露    线程死锁    锁竞争(Lock Contention)    Java消耗过多的CPU 一.jps(j ...

  6. java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap

    java-core  P487 P515 chapter11,主要讲java的异常,里面很多内容收获良多,之前一直没注意过的. 一,Throwable类获得StackTraceElement ,可进行 ...

  7. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  8. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  9. 深入理解JVM一性能监控工具

    一.前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮 ...

  10. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

随机推荐

  1. jconsole远程连接centos7 服务器上的tomcat来查看服务器状况(无密码版)

    1.修改tomcat  catalina.sh 代码解释:-Dcom.sun.management.jmxremote.port=6969 //连接端口,自定义不要与已有的端口冲突-Dcom.sun. ...

  2. 关于Oracle to_date函数的高级用法

    由于种种原因,在我们的系统中,账套期间(PERIOD_NAME)由于格式设置的原因,数据库层存储的格式如下 Mar-19,而不是常规的2019-03. 我们无法更改数据库,涉及到的点太多. 但是期间数 ...

  3. Java13新特性 -- switch表达式

    引入了yield语句,用于返回值: 和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块. @Test public void testSwitch ...

  4. 006-nginx.conf详解-error_page 使用

    一.概述 nginx指令error_page的作用是当发生错误的时候能够显示一个预定义的uri 1.1.使用步骤 更改nginx.conf在http定义区域加入: proxy_intercept_er ...

  5. 【452】pandas筛选出表中满足另一个表所有条件的数据

    参考:pandas筛选出表中满足另一个表所有条件的数据 参考:pandas:匹配两个dataframe 使用 pd.merge 来实现 on 表示查询的 columns,如果都有 id,那么这是很好的 ...

  6. 使用VEGAS2(Versatile Gene-based Association Study)进行gene based的关联分析研究

    gene-based关联分析研究是SNP-based关联分析研究的一个补充. 目前有很多工具支持gene-based关联分析研究,比如GCTA,VEGAS2等. 下面主要介绍一下怎么用VEGAS2做g ...

  7. GPRS 智能门禁控制器

    本模块居于GPRS 2G网络,信号覆盖广,而且好. 主要用于微信门禁等,提供用户服务端搭建及相关接口. 您可以向门禁发送开门信号,并提醒开门成功的信号反馈. 同时支持发送开门ID号,并反馈成功ID号

  8. Angular2 输入完成后触发函数

    (blur)="keySearch($event)" ,鼠标点击其他地方触发 keySearch(e): void { var dom = $(e.target); var key ...

  9. Windows Server 2008 R2怎样设置自动登陆(登录)

    方法一: 打开电脑“菜单”,右键点击“运行”,在对话框输入“control userpasswords2”,点击“确定”. 弹出的窗口取消勾选“要使用本机用户必须输入用户名和密码”,取消后点击“确定” ...

  10. find命令实例

    按时间查找也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间. 这里的时间是以24小时为单位的. 查找最近30分钟修改的当前目录下的.php文件 find . -n ...