您的位置:首页 > 编程语言 > Java开发

JVM虚拟机性能监测与故障处理工具简单介绍

2016-04-19 18:00 573 查看

JVM虚拟机性能监测与故障处理工具简单介绍

概述

前面两篇虚拟机相关的笔记,主要针对内存分配与回收技术介绍,这篇文章介绍几个常用有效的虚拟机监控工具。这些工具都放在都存在于jdk/bin下面,工具源码在jdk/lib/tools.jar

JDK命令工具

jps(进程状况工具):jdk很多小工具名字都参照了unix系统。该名字与unix的ps命令比较相似,功能也差不多,主要查询jvm中运行的进程。并且列出进程名与唯一的ID。

jstat(统计信息监视工具):比如查看内存分配情况,垃圾回收等信息。

jinfo(java配置信息工具):实时查看和调整虚拟机的各项参数,以及可以显示虚拟机默认的参数设置。-v,-flag, -flag name=value都是常用参数。

jmap(java内存映像工具):1.生成堆转储快照(dump文件);2.查询java堆与方法区的详细信息,如空间使用率,当前使用的收集器等等。-dump,-heap,-histo(显示对象统计信息,包括类,实例数量,合计容量)。

JDK可视化工具

JConsole(java监视与管理控制台):在jdk/bin 下面启动该工具,选择一个应用进程之后,可以看到监控的内容包括:内存,线程,类,CPU占用率,VM概要,MBean。

VisualVM(多合一的故障处理工具):这是一款功能比较丰富的监视和故障处理了工具,plugins式扩展插件的安装,可以做到以下工作:

1.显示虚拟机进程的配置,环境信息(jps,jinfo)

2.监视应用程序的CPU,GC,堆,方法区以及线程的信息(jstat,jstack)

3.dump以及分析堆转储快照(jmap,jhat).

4.离线程序快照的分析。

MAT:eclipse插件最新插件下载地址为:MAT - http://archive.eclipse.org/mat/1.4/update-site/

系统性能问题调优场景及考虑点

场景1:高性能机器部署反而效率降低

如果硬件内存比较大,将jvm的对设置比较大的时候,系统效果不理想,可能不定期出现长时间的失去响应。

分析场景:(1)可能采用的是关注吞吐量的收集器。导致停顿时间太长。(2)因为换了大内存,每次回收G级别的内存,需要耗费很多时间。(3)可能有大量的大对象,这些大对象在老年代,没有在Minor GC的时候清理掉,导致内存消耗较大。

大内存需要考虑点:(1)内存回收导致的长时间停顿。(2)64位JDK性能普遍低于32位JDK。(3)大内存的情况下,要保证程序足够稳定,因为十几G的dump文件没有办法做分析的。

场景2:堆外内存导致溢出

很多时候,设置堆内存的时候过大,系统运行的时候通过jstat监控发现所有的内存分配都没有问题,结果还抛出了内存溢出情况。这时候就要考虑除了堆内存溢出,还有可能是直接内存溢出抛出的异常的情况。

从实践角度出发,出了java堆内存和方法区内存外,还有以下区域会占用较多的内存:(1)direct memory 直接内存。特别在出现nio读写操作的时候,此内存很容易出现溢出,所以要有足够的预留空间。(2)线程栈溢出,-Xss调整,如果太小可能导致无法分配栈帧或者无法建立新的线程(3)Socket缓存区,每个Socket都有Receive和Send两个缓存区,分别大约37KB与25KB.如果连接数大,这部分内存已很客观,如果溢出抛出IOException.

不恰当的数据结构导致内存占用过大,辟如业务上有时候需要定时加载大数据文件到内存创建索引,这时候产生100万条HashMap

小结

(1)写代码的时候,要少使用大对象,特别是朝生夕死的大对象。(2)减少full gc 的次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息