经验,数据和工具是解决问题的三个要素,所以我们要学会使用工具,学会分析数据,快速定位问题所在!

jdk中很多的命令协助监控工作:

1 查看运行的进程:

jps -m or -l or -v 

虚拟机监控方案 虚拟机监控是什么_Java

正在运行的进程信息,获取进程的id

jps -l

虚拟机监控方案 虚拟机监控是什么_数据_02

 

2 监控各个部分的运行情况

jstat –gc 2764 250 20  监控2764进程的垃圾回收情况

虚拟机监控方案 虚拟机监控是什么_Java_03

 

垃圾收集运行情况

jstat -gc 9128

虚拟机监控方案 虚拟机监控是什么_死锁_04

jstat -gcutil 9128

虚拟机监控方案 虚拟机监控是什么_Java_05

 

Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。

虚拟机监控方案 虚拟机监控是什么_数据_06

 

查看堆的大小

jinfo -flag MaxHeapSize 9128

虚拟机监控方案 虚拟机监控是什么_数据_07

进程运行的系统环境信息

jinfo -sysprops 9128

虚拟机监控方案 虚拟机监控是什么_虚拟机监控方案_08

java 内存映像工具

jmap

虚拟机监控方案 虚拟机监控是什么_Java_09

查看堆里面的对象情况

jmap -dump:format=b,file=d:\hill 9128

虚拟机监控方案 虚拟机监控是什么_死锁_10

查看堆的使用情况

jmap -heap 9128

虚拟机监控方案 虚拟机监控是什么_Java_11

jhat 协助jmap,查看堆转出来的分析报告文件

虚拟机监控方案 虚拟机监控是什么_死锁_12

通过http://localhost:7000访问

 如果有其它工具可以分析,否则不建议使用jhat。首先,一般不会直接在生产环境直接分析dump文件,因为分析dump文件是一件耗时耗资源的事情,条件允许的话首选图形分析工具(后面会介绍);其次是jhat的分析功能过于简陋。

jstack生成vm中的线程快照

快照是线程在vm中的堆栈信息,通过这个工具,我们可以查找线程死循环,死锁,因等待长时间的io操作而产生的长时间等待等。

虚拟机监控方案 虚拟机监控是什么_Java_13

 

jstack 

 jstatck -l 9128

JIT是讲.class字节码翻译成本机的机器代码(就是0和1),至于为什么这么做,肯定是提高效率,更多JIT知识可自行学习。

通过这些命令,我们可以知道堆的使用情况和占用情况,垃圾回收的情况,在总体上了解系统运行的情况,还可以监控线程运行的情况,有没有死锁,占用是不是很长时间等等,同过这些可以调整代码。

怎么选择垃圾回收器,匹配自己的项目?

项目运行使用的堆大小以及使用的垃圾回收器类型

 

虚拟机监控方案 虚拟机监控是什么_虚拟机监控方案_14

 

分析线程的运行情况?

1 线程block,快速定位位置

虚拟机监控方案 虚拟机监控是什么_数据_15

 在37行有死锁

 2 线程wait状态,等待唤醒

虚拟机监控方案 虚拟机监控是什么_死锁_16

在47行一直等待

 

3 一个一直运行的线程,runnable状态

 

虚拟机监控方案 虚拟机监控是什么_数据_17

 在62行一直没有运行完

4 如何生成dump这种快照文件,分析系统

 

系统调优分析

系统调优,大部分情况下考虑到如何利用高性能的硬件设备,提高吞吐量,提高相应速度;

1 场景一:

4个cpu,16g内存,比以前的硬件有很大提高,给人的感觉就是,如果把硬件换了,性能肯定可以有很大提高;先换jdk64位,可以支撑更大的内存(32为最大是2g),设置堆为12g,但最后的效果是性能很差,甚至出现了很长的gc停顿时间,是什么原因造成的呢?

full gc时间太长;网站应用中需要把大文件读入内存,对于大对象,直接进入old区,没有用到minor gc,不断读入old区域;

 放弃64位的jdk,使用32位,适应集群部署

方案:

在这台高性能硬件上,部署多个虚拟机,每个虚拟机上启动一个服务器,独立部署,把这几个虚机做逻辑集群

使用apache做负载均衡器

使用CMS垃圾收集器

有些共用的数据,比如连接池,应该统一分配,比如jndi,统一分配资源

有些缓存数据,不要放在每一个虚拟机,使用集中式缓存;