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.案例一:内存溢出实战模拟
测试代码:
1 package com.wfd360.outofmemory; 2 3 import java.util.ArrayList; 4 5 /** 6 * VM Args: 7 * -Xms20m -Xmx20m 8 */ 9 public class TestMemory { 10 static class OOMObject { 11 public byte[] byt = new byte[1 * 1024 * 1024]; 12 } 13 14 public static void main(String[] args) throws Exception { 15 Thread.sleep(10000); 16 fillHeap(100); 17 Thread.sleep(10000); 18 } 19 20 public static void fillHeap(int num) throws Exception { 21 ArrayList<OOMObject> list = new ArrayList<OOMObject>(); 22 for (int i = 0; i < num; i++) { 23 Thread.sleep(500); 24 list.add(new OOMObject()); 25 System.out.println("num=" + i); 26 } 27 System.gc(); 28 } 29 30 31 }