经验,数据和工具是解决问题的三个要素,所以我们要学会使用工具,学会分析数据,快速定位问题所在!
jdk中很多的命令协助监控工作:
1 查看运行的进程:
jps -m or -l or -v
正在运行的进程信息,获取进程的id
jps -l
2 监控各个部分的运行情况
jstat –gc 2764 250 20 监控2764进程的垃圾回收情况
垃圾收集运行情况
jstat -gc 9128
jstat -gcutil 9128
Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。
查看堆的大小
jinfo -flag MaxHeapSize 9128
进程运行的系统环境信息
jinfo -sysprops 9128
java 内存映像工具
jmap
查看堆里面的对象情况
jmap -dump:format=b,file=d:\hill 9128
查看堆的使用情况
jmap -heap 9128
jhat 协助jmap,查看堆转出来的分析报告文件
通过http://localhost:7000访问
如果有其它工具可以分析,否则不建议使用jhat。首先,一般不会直接在生产环境直接分析dump文件,因为分析dump文件是一件耗时耗资源的事情,条件允许的话首选图形分析工具(后面会介绍);其次是jhat的分析功能过于简陋。
jstack生成vm中的线程快照
快照是线程在vm中的堆栈信息,通过这个工具,我们可以查找线程死循环,死锁,因等待长时间的io操作而产生的长时间等待等。
jstack
jstatck -l 9128
JIT是讲.class字节码翻译成本机的机器代码(就是0和1),至于为什么这么做,肯定是提高效率,更多JIT知识可自行学习。
通过这些命令,我们可以知道堆的使用情况和占用情况,垃圾回收的情况,在总体上了解系统运行的情况,还可以监控线程运行的情况,有没有死锁,占用是不是很长时间等等,同过这些可以调整代码。
怎么选择垃圾回收器,匹配自己的项目?
项目运行使用的堆大小以及使用的垃圾回收器类型
分析线程的运行情况?
1 线程block,快速定位位置
在37行有死锁
2 线程wait状态,等待唤醒
在47行一直等待
3 一个一直运行的线程,runnable状态
在62行一直没有运行完
4 如何生成dump这种快照文件,分析系统
系统调优分析
系统调优,大部分情况下考虑到如何利用高性能的硬件设备,提高吞吐量,提高相应速度;
1 场景一:
4个cpu,16g内存,比以前的硬件有很大提高,给人的感觉就是,如果把硬件换了,性能肯定可以有很大提高;先换jdk64位,可以支撑更大的内存(32为最大是2g),设置堆为12g,但最后的效果是性能很差,甚至出现了很长的gc停顿时间,是什么原因造成的呢?
full gc时间太长;网站应用中需要把大文件读入内存,对于大对象,直接进入old区,没有用到minor gc,不断读入old区域;
放弃64位的jdk,使用32位,适应集群部署
方案:
在这台高性能硬件上,部署多个虚拟机,每个虚拟机上启动一个服务器,独立部署,把这几个虚机做逻辑集群
使用apache做负载均衡器
使用CMS垃圾收集器
有些共用的数据,比如连接池,应该统一分配,比如jndi,统一分配资源
有些缓存数据,不要放在每一个虚拟机,使用集中式缓存;