JVM深入虚拟机系列4-----性能监控工具,Java堆分析

一. 性能监控工具

二.Java堆分析

1.系统性能监控

  1. uptime
    在这里插入图片描述
  • 系统时间
  • 运行时间
    例子中为7分钟
  • 连接数
    每一个终端算一个连接
  • 1,5,15分钟内的系统平均负载
    运行队列中的平均进程数

2.top

在这里插入图片描述
3. vmstat

  • 可以统计系统的CPU,内存,swap,io等情况
    在这里插入图片描述
  • CPU占用率很高,上下文切换频繁,说明系统有线程正在频繁切换
  1. pidstat
  • 细致观察进程
  • 需要安装
    - sudo apt-get install sysstat
  • 监控CPU
  • 监控IO
  • 监控内存
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. windows下的系统性能监控
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    pslist
  • 命令行工具
  • 可用于自动化数据收集
  • 显示java程序的运行情况
    在这里插入图片描述
    在这里插入图片描述

2.Java自带的工具

在这里插入图片描述
1.jps

  • 列出java进程,类似于ps命令
  • 参数-q可以指定jps只输出进程ID ,不输出类的短名称
  • 参数-m可以用于输出传递给Java进程(主函数)的参数
  • 参数-l可以用于输出主函数的完整路径
  • 参数-v可以显示传递给JVM的参数
jps
6260 Jps
7988 Main
400
----------------
jps -q
7988
7152
----------------
jps -m
7988 Main --log-config-file D:\tools\squirrel-sql-3.2.1\log4j.properties --squir
rel-home D:\tools\squirrel-sql-3.2.1
7456 Jps -m
----------------
jps -m -l
7244 sun.tools.jps.Jps -m -l
7988 net.sourceforge.squirrel_sql.client.Main --log-config-file D:\tools\squirre
l-sql-3.2.1\log4j.properties --squirrel-home D:\tools\squirrel-sql-3.2.1

----------------
jps -m -l -v
6992 sun.tools.jps.Jps -m -l -v -Denv.class.path=.;D:\tools\jdk6.0\lib\dt.jar;D:
\tools\jdk6.0\lib\tools.jar;D:\tools\jdk6.0\lib -Dapplication.home=D:\tools\jdk6
.0 -Xms8m
7988 net.sourceforge.squirrel_sql.client.Main --log-config-file D:\tools\squirre
l-sql-3.2.1\log4j.properties --squirrel-home D:\tools\squirrel-sql-3.2.1 -Xmx256
m -Dsun.java2d.noddraw=true

  1. jinfo
  • 可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数
  • -flag :打印指定JVM的参数值
  • -flag [+|-]:设置指定JVM参数的布尔值
  • -flag =:设置指定JVM参数的值
显示了新生代对象晋升到老年代对象的最大年龄
jinfo -flag MaxTenuringThreshold 2972
-XX:MaxTenuringThreshold=15
---------------------
显示是否打印GC详细信息
jinfo -flag PrintGCDetails  2972
-XX:-PrintGCDetails
---------------------
运行时修改参数,控制是否输出GC日志
jinfo -flag PrintGCDetails  2972
-XX:-PrintGCDetails

jinfo -flag +PrintGCDetails  2972

jinfo -flag PrintGCDetails  2972
-XX:+PrintGCDetails

---------------------
  1. jmap
  • 生成Java应用程序的堆快照和对象的统计信息
  • jmap -histo 2972 >c:\s.txt
num     #instances         #bytes  class name
----------------------------------------------
   1:          4983        6057848  [I
   2:         20929        2473080  <constMethodKlass>
……………….
1932:             1              8  sun.java2d.pipe.AlphaColorPipe
1933:             1              8  sun.reflect.GeneratedMethodAccessor64
Total        230478       22043360

  1. Dump堆
  • jmap -dump:format=b,(表示二进制),file=c:\heap.hprof 2972
    将2972这个Java进程的堆全部dump出来到C:\heap.hprof …
Dumping heap to C:\heap.hprof ...
Heap dump file created
  1. jstack
  • 打印线程dump
  • -l 打印锁信息
  • -m 打印java和native的帧信息
  • -F 强制dump,当jstack没有响应时使用

在这里插入图片描述
7. JConsole

  • 图形化监控工具
  • 可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
8. Visual VM

  • Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.实战分析

运行一程序ThreadBlockMain,期望输出Hello,World ,结果在程序运行后,程序卡死,没有预期输出。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.内存溢出(OOM)的原因

在JVM中,有哪些内存区间?
在这里插入图片描述

  1. 堆溢出
public static void main(String args[]){
    ArrayList<byte[]> list=new ArrayList<byte[]>();
    for(int i=0;i<1024;i++){
        list.add(new byte[1024*1024]);
    }
}
  • 占用大量堆空间,直接溢出
  • Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
    at geym.jvm.ch8.oom.SimpleHeapOOM.main(SimpleHeapOOM.java:14)

解决方法:增大堆空间,及时释放内存

2.永久区

生成大量的类
public static void main(String[] args) {
    for(int i=0;i<100000;i++){
        CglibBean bean = new CglibBean("geym.jvm.ch3.perm.bean"+i,new HashMap());
    }
}


Caused by: java.lang.OutOfMemoryError: PermGen space
[Full GC[Tenured: 2523K->2523K(10944K), 0.0125610 secs] 2523K->2523K(15936K), 
[Perm : 4095K->4095K(4096K)], 0.0125868 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
Heap
 def new generation   total 4992K, used 89K [0x28280000, 0x287e0000, 0x2d7d0000)
  eden space 4480K,   2% used [0x28280000, 0x282966d0, 0x286e0000)
  from space 512K,   0% used [0x286e0000, 0x286e0000, 0x28760000)
  to   space 512K,   0% used [0x28760000, 0x28760000, 0x287e0000)
 tenured generation   total 10944K, used 2523K [0x2d7d0000, 0x2e280000, 0x38280000)
   the space 10944K,  23% used [0x2d7d0000, 0x2da46cf0, 0x2da46e00, 0x2e280000)
 compacting perm gen  total 4096K, used 4095K [0x38280000, 0x38680000, 0x38680000)
   the space 4096K,  99% used [0x38280000, 0x3867fff0, 0x38680000, 0x38680000)
    ro space 10240K,  44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
    rw space 12288K,  52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)

解决方法:增大Perm区,允许Class回收

3.Java栈溢出

  • 这里的栈溢出指,在创建线程的时候,需要为线程分配栈空间,这个栈空间是向操作系统请求的,如果操作系统无法给出足够的空间,就会抛出OOM
    在这里插入图片描述
-Xmx1g -Xss1m

public static class SleepThread implements Runnable{
    public void run(){
        try {
            Thread.sleep(10000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public static void main(String args[]){
    for(int i=0;i<1000;i++){
        new Thread(new SleepThread(),"Thread"+i).start();
        System.out.println("Thread"+i+" created");
    }
}

Exception in thread "main" java.lang.OutOfMemoryError: 
unable to create new native thread

解决方法:减少堆内存,减少线程栈大小

4. 直接内存溢出

  • ByteBuffer.allocateDirect()无法从操作系统获得足够的空间
    在这里插入图片描述

在这里插入图片描述

2. MAT使用基础

  • Memory Analyzer(MAT:一种内存分析工具)
  • 基于Eclipse的软件
  • http://www.eclipse.org/mat/
    在这里插入图片描述
    在这里插入图片描述
    此图我也没看懂…
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    例:
    • 有类point(点),两个int属性(x,y).
    • 有类Line(线),连个point属性(两点成线)
      在这里插入图片描述
      在这里插入图片描述

dump出该程序的堆内存之后发现:

  • 可以看到,所有的Point实例浅堆和深堆的大小都是16字节。而dLine对象,浅堆为16字节,深堆也是16字节,这是因为dLine对象内的两个点f和g没有被设置为null,因此,即使dLine被回收,f和g也不会被释放。对象cLine内的引用对象d和e由于仅在cLine内还存在引用,因此只要cLine被释放,d和e必然也作为垃圾被回收,即d和e在cLine的保留集内,因此cLine的深堆为16*2+16=48字节。
    对于aLine和bLine对象,由于两者均持有对方的一个点,因此,当aLine被回收时,公共点a在bLine中依然有引用存在,故不会被回收,点a不在aLine对象的保留集中,因此aLine的深堆大小为16+16=32字节。对象bLine与aLine完全一致。

      																   浅堆		  深堆
    

在这里插入图片描述

3.使用Visual VM分析堆

类的柱状图 ,显示对象数量,总大小等
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.Tomcat OOM分析案例

  • Tomcat OOM
    • Tomcat 在接收大量请求时发生OOM,获取堆Dump文件,进行分析。
  • 使用MAT打开堆
  • 分析目的:
    • 找出OOM的原因
    • 推测系统OOM时的状态
    • 给出解决这个OOM的方法
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

解决方法:

  1. OOM由于保存session过多引起,可以考虑增加堆大小
  2. 如果应用允许,缩短session的过期时间,使得session可以及时过期,并回收
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值