jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优
转载:http://blog.csdn.net/jerry024/article/details/8507589
转载: https://blog.csdn.net/zhaozheng7758/article/details/8623530
通过jstat、jmap对java程序进行性能调优
第一次写技术博客,本文记录了我对服务器cpu占用率100%问题的排查过程和最终结果,算是一篇学习日志。
本人属于学习中的菜鸟码农,如有什么理解上的偏差的,还请各路大神指正。
关键词:
jstat , jmap, heap, GC, smartupload, 内存泄漏
1. 背景
硬件供应商多次反映,在tomcat启动一段时间后,经常出现cpu占用率100%,且重启前一直保持在100%的情况。在重启后cpu占用率回落,但是一段时间后再次出现问题。
下图为cpu占用率100%时使用top命令的截图,可以看到java进程的cpu占用率几经几乎达到了400%(服务器为4核cpu)
<1>
2.问题定位
2.1问题猜测
对于cpu占用率100%的情况,产生以下两种猜测:
a. 程序长时间占用系统IO,导致CPU占用率100%
b.程序存在严重内存泄露,导致jvm频繁执行full GC,从而使cpu占用率提高,造成服务器假死
2.2jvm的内存管理和垃圾回收机制
java对内存的管理主要分为两种:栈(stack)和堆(heap) 方法区,程序计数器等不做讨论
stack: 在每个线程启动时由jvm自动分配固定大小的地址,stack内主要保存操作符,值对象(int,float等基础数据类型),和引用对象的指针由于stack固定大小,且主要操作为push和pop,并不涉及到垃圾回收等问题,因此不做展开。
heap:堆在线程执行过程中自动分配大小,大小可以随时改变,主要用于保存对象(Object),对象在结束生命周期结束之后便会由JVM的垃圾回收机制自动进行回收堆可分为3大部分年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。
年轻代:年轻代又可分为3个小区:Eden,两个等大的Survior区(from 和 to)。其中Eden主要存放新建的对象,当Eden区无法再存放更多的对象时,jvm会发起年轻代GC(Minor GC),释放Eden中的对象,Minor GC的特点是发生频率高,执行速度也极快,对系统效率的影响并不是很大。当Eden区中的对象经过一次Minor GC仍然没有被释放时,这部分对象将被移入Survior区(对象可能进入from区,也可能进入to区,有具体算法,此处不做展开)。当Survior区中的对象经历过数次的Minor GC之后仍然存活,将被移入年老代。
年老代:年老代中用来存放从年轻代过来的长时间使用的对象,大部分的JVM内存溢出错误均发生在这个区域。当年老代被过度占用,无法存放下更多的数据时,jvm会发起一次年老代GC(Major GC\Full GC),该类型GC会释放年老代中的资源,虽然该GC触发频率很低,但是对硬件资源的消耗较高,且Full GC过程中会暂停该线程的执行。如果系统中存在内存泄露,频繁的触发Full GC,将会严重的占用服务器资源,造成应用的假死,这也是我之前猜测b的依据。
持久代:持久代中用于存放jvm的反射类等,如class等,此区域对GC的影响不大,也不大会发生内存溢出的情况。
下图是引用网上的一张图片,更形象的描述了heap区的构成
<2>
2.3jstat、jmap实战
ok,在弄清楚jvm的GC机制之后,就有了努力的方向了,为了弄清楚GC具体的工作情况,就要使用到jstat命令了。
jstat(Java Virtual Machine Statistics Monitoring Tool)是jdk自带的监控工具,位置在%JAVA_HOME%/bin 下,命令使用方法为
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
下图是我对系统中tomcat进程的监控情况
<3>
<4>
命令中 -gcutil表示统计GC情况,5125为tomcat的pid,10000表示没10s统计一次,5表示一共统计5次
结果中s0为from区,s1为to区,E为Eden区,O为Old区,P为Permanent区,YGC为yong GC次数,YGCT为yong GC执行的总时间,FGC为Full GC次数,FGCT为Full GC总时间,GCT为GC总时间。
上面图<3>为cpu占用率高时的截图,图<4>为正常情况下截图。
很明显的看到GC次数相差不大的情况下,GC耗时存在很大的差距,推测此时系统中可能存在内存泄漏的情况。
为了确定jvm中具体有哪些生存的对象,就需要用到jdk自带的另一个监控工具,jmap了
jmap(Memory Map)用于监控系统内存中存活的对象。
使用命令: jmap -histo:live 5125>> /opt/jmap.txt
其中5125为pid ,由于数据较多,将数据保存在txt文件中进行分析,下图列出了对内存占用排名前几的对象
<5>
一眼看去,String对象稳居第一,好吧,项目中对String的处理确实有不少问题,但是,排名第三的这是什么东西?!
在代码中一查,这个对象只在一个上传文件中的Servlet中被用到了一次,很明显的内存泄漏!
3.问题解决

jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优的更多相关文章
- 浅谈Spark应用程序的性能调优
浅谈Spark应用程序的性能调优 :http://geek.csdn.net/news/detail/51819 下面列出的这些API会导致Shuffle操作,是数据倾斜可能发生的关键点所在 1. g ...
- 用jmap分析java程序
之前的随笔提到用jstack分析java线程情况,也是在这个项目中,当线程的问题解决之后,发现程序的内存一直增长,于是用jmap工具分析了一下java程序占用内存的情况. 命令很简单,直接 jmap ...
- 几个与JVM相关的JDK工具:jps, jstat, jmap
在项目中遇到OOM(Out of Memory)的问题,为了分析内存和JVM的垃圾回收器GC问题,一并把JVM相关的一些工具也研究了一下: jps:Java进程查看工具,实际上它和Unix/Linux ...
- 成为Java GC专家(5)—Java性能调优原则
并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...
- 【JAVA进阶架构师指南】之五:JVM性能调优
前言 首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了. 好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...
- 如何合理的规划一次jvm性能调优
https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...
- 如何合理的规划jvm性能调优
JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...
- JVM性能调优详解
前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备.这篇文章带领大家学习JVM性能调优的知识. 性能调优 性能调优包含多个层次,比如:架构调优.代码 ...
- 【总结】性能调优:JVM内存调优相关文章
[总结]性能调优:JVM内存诊断工具 [总结]性能调优:CPU消耗分析 [总结]性能调优:消耗分析 JVM性能调优
随机推荐
- CPN tools 帮助文档资料和实例
1.替代变迁 包含有替代变迁的页面叫做父页,当CPN网使用替代变迁的时候,替代变迁所表达的逻辑必须在某一个位置得到实现,实现替代变迁逻辑页面叫做子页或者子网. 将替代变迁相邻的库所叫做槽库所,也即是在 ...
- ted演讲小总结(持续更新_12月15日)
目录 2019年12月1日 星期日 2019年12月2日 星期一 2019年12月3日 星期二 2019年12月8日 星期日 2019年12月15日 星期日(这个演讲相对来说不好理解,因为这类逻辑暂时 ...
- 「NOI2012」骑行川藏
「NOI2012」骑行川藏 题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨. 川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的 ...
- Spring Task定时任务的配置和使用详解
spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.or ...
- cookies localStorage和sessionStorage的区别
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地 ...
- java 第九次作业
一.题目:利用接口和接口回调,实现简单工厂模式,当输入不同的字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积. 二.代码 /* 5个形状类分别调用Shape接口: 柱体类中, ...
- shellshock溢出攻击
实验背景 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,需要亲手重现攻击来理解该漏洞,并回答一些问题. 什么 ...
- C++异常处理(一)----基本语法
实验环境 win7 下的vs2017,基本原则:throw抛出的数据类型,和cathc语句的数据类型要一致 异常的引发和异常的处理可以分布在不同函数中,所以c++的异常是跨栈的 异常是由“地地道道“的 ...
- java 利用反射调用静态方法的示例
内容简介 主要介绍使用反射的机制来调用执行类中的静态方法. 静态方法 public class GisUtil { private final static Logger logger = Logge ...
- 使用bufio包和函数式变成实现类似python生成器效果
package main import ( "bufio" "fmt" "io" "strings" ) type in ...