您的位置:首页 > 运维架构

JVM性能监控工具使用

2015-11-19 13:30 579 查看
一.基础知识

JVM:java虚拟机

栈:解决程序的运行,如何执行,如何处理数据,负责处理java程序运行中的进程和程序处理逻辑,只能存储基本的数据类型和对堆中对象的引用。

堆:解决数据存储,怎么放,放在哪里

 

在java中,栈的理解:

 

栈内存私有,不能被其他线程访问,大小通过-Xss设置,空间不足时会出现Java.lang.StackOverflowError异常

堆内存所有线程共享

 



 

 

二。JVM堆内存结构

 

初始分配的内存-Xms和最大分配的内存-Xmx相等:

堆内存剩余<40%,JVM自动增大堆内存,直到最大

堆内存剩余>70%,JVM自动减少堆内存,直到最小

 

以避免每次GC后调整堆的大小,设置-Xms和-Xmx相等

 

1.堆内存划分

young:年轻代,Eden +S0 +S1,-Xmn

eden:伊甸园区,属于young,存放新生的对象

survivor space:属于young,存放区,有两个,存放每次eden区GC后存活的对象

old:老年代,存放生命周期长的存活对象

2.非堆内存

permannent:永久区,存放静态数据,代码

 

 

3.JVM内存申请

 



 

 三。垃圾回收器

1.功能

分配内存

内存不被错误回收

回收垃圾对象

2.串行,并行收集器

串行收集器:适用单/多处理器机器,只处理单线程

并行收集器:适用多处理器机器

四。JVM性能监控分析调优

1.jps

类似于Linux下的ps,列出正在运行的虚拟机进程。



 -m:输出传入main方法的参数

- l:输出main类或Jar的全限名

2.jmap

生成堆转储快照,查询finalize执行队列,Java堆,永久代的信息,属于时时数据

jmap -heap 进程ID



jmap -histo 进程ID

查看堆内存中的对象数量,大小,如果发生内存泄露,用这个方法可以快速定位



可以清楚的看到<constMethodKlass>占用率最大,调用次数最多

jmap -dump 进程ID

将内存的详细使用情况输出到文件,可以用MAT或者jhat查看

live:表示只dump堆中存活的对象

format=b:表示默认

file:文件名



jhat

分析java堆复制文件,启动一个允许堆中的对象在Web浏览器中进行分析的Web服务器



-J-Xmx:指定堆的大小,防止使用jhat命令是产生内存溢出

-port:端口号

当Server is ready 时,通过访问http://IP地址:Port来查看



jstat:

监控基于HotSpot的JVM,查看新生代,老生代,持久代的容量和使用情况,垃圾收集情况,垃圾回收次数,占用的时间



-gcutil:查看垃圾收集情况

9237:进程ID

3000:3S

每个3s打印一次,共打印6次堆内存的使用情况

jstack:

打印出给定的java进程ID,core file或远程调试服务的java栈信息。

此命令至少用三次,如果每次都指向同一个问题,才能确定问题。

jstack -l 进程ID

-l:打印关于锁的附加信息,显示进程中的所有的线程的信息。



java.lang.Thread.State表示此线程的状态,线程常见的状态如下:

死锁,Deadlock(重点关注)

等待资源,Waiting on condition(重点关注)

等待获取监视器,Waiting on monitor entry(重点关注)

阻塞,Blocked(重点关注)

执行中,Runnable

暂停,Suspended

对象等待中,Object.wait() 或 TIMED_WAITING

停止,Parked

jconsole:

图形化的性能的监控工具,监控内容:桟内存,线程,CPU,类,VM信息

linux下配置jconsole监控tomcat
第一:在tomcat的bin目录下的catalina.sh,用vi编辑,在“Execute The Requested Command”前面粘上下面的内容 
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=210.51.165.172
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.ssl=false  
-Dcom.sun.management.jmxremote.authenticate=false"  
第二步:在/etc/sysconfig的iptables中加入下面的内容 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 9999 -j ACCEPT 
第三步:在/etc下面的hosts将127.0.0.1改为210.51.165.172
第四部:重启tomcat

下面说说如何分析,如何使用这六个标签

概述: Displays overview information about the Java VM and monitored values.

内存: 显示内存使用信息

线程: 显示线程使用信息

类: 显示类装载信息

*VM摘要:*显示java VM信息

MBeans: 显示 MBeans.

概述:

概述很简单没啥说的,自己看看吧,不过值得一提的是对着图点击右键可以保存数据到CSV文件,以后可以使用其他工具来分析这些数据。



内存:

这个比较有价值,参看堆内存,非堆内存,内存池的状况总体内存的分配和使用情况以及不同的GC进行垃圾回收的次数和时间。可以手动进行GC查看内存变化。

在分析JAVA内存问题进行调优时候非常有用,你要学习JVM内存模型,之后会发现这里的每个值都具有意义。

 GC的算法和参数对性能有显著的影响,注意垃圾回收次数、时间、以及partial GC和full GC,调整你所使用的不同GC和以及各个GC下的参数,然后在这个视图下观察,以得到好的性能。



线程:

左下角显示所有的活动线程(如果线程过多,可以在下面的过滤栏中输入字符串过滤出你想要观察的线程)。点击某个显示会显示这个线程的名称、状态、阻塞和等待的次数、堆栈的信息。
统计图显示的是线程数目的峰值(红色)和当前活动的线程(蓝色)。

另外下面有个按钮“检测到死锁”,有时候会有用处。



类:



VM概要:



MBean:



Visual VM:
启动Visual VM并连接应用程序,启动jvisualvm.exe,远程JMX连接,配置方式和Jconsle相同。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息