文档章节

JVM的监控与优化

萧十一郎君
 萧十一郎君
发布于 2014/09/24 14:29
字数 1793
阅读 734
收藏 13

    本文围绕JVM阐述两个方面的内容:监控和优化。监控过程是优化的前提,优化是监控之后采取的措施。JVM的监控主要介绍相关监控工具、定义监控内容;JVM的优化主要包括内存分配和垃圾回收机制设置。

一、JVM的监控

    1、JVM监控工具

        俗话说,“工欲善其事必先利其器”。要对JVM进行监控,首先要选择一款得心应手的监控工具。下面分别介绍JDK自带的监控工具、系统监控工具和商业化的监控工具,相信总有一款是你喜欢的!

        (1)JDK自带工具:jinfo、jmap、jstack、jstat、JConsole、VisualVM

  • jinfo

    查看该命令使用帮助:jinfo -h。该命令可以获取指定java进程的配置信息,包括Java系统属性和JVM配置参数。如图1

    图1 jinfo命令显示部分内容

  • jmap

    查看该命令使用帮助:jmap -h。该命名主要查看指定java进程的内存分配和使用情况。还可以使用jmap -histo pid > a.log,将物理内存使用情况信息导入到文本文件a.log,一段时间后,使用文本工具对比,可以知道GC回收了哪些对象。下面演示简单的查看进程内存分配和使用情况,如下图:

    图2 jmap命令显示部分信息

    Java进程31449的JVM配置为:

    -server -Xmx2048m -Xms2048m -Xss512k -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=7 -XX:+UseConcMarkSweepGC

    -XX:CMSInitiatingOccupancyFraction=70,结合上图可以知道:NewSize = Eden + 2*Survivor (From Space + To Space)。新生代使用了并行垃圾回收机制,老生代使用了并发垃圾回收机制。这里有一个疑问:NewRatio = 2,那么NewSize的大小应该是整个堆栈的1/3,上图的NewSize为什么只有332.75M呢?

  • jstack

    查看该命令使用帮助:jstack -h。该命令主要观察JVM中当前所有线程的运行情况和运行状态。

    图3 jstack命令显示部分信息

    从上图可以知道当前进程中没有发生死锁的线程。

  • jstat

    查看该命令使用帮助:jstat -h。该命令利用JVM内建的指令对java应用程序的资源和性能进行实时监控,包括各种堆和非堆的大小,内存使用情况和GC情况,classloader,compiler等。下面使用jstat对java程序的内存使用和GC情况进行监控:jstat -gcutil pid 1000,每隔1s输出一次实时信息。

    图4 jstat命令显示部分信息

    上图中S0和S1分别表示两个Survivor空间,E表示Eden区,O表示Old区,P表示方法区,即Permsize;YGC和YGCT表示Young GC的次数和消耗时间;FGC和FGCT表示Full GC的次数和消耗时间,GCT表示GC总消耗时间。

  • JConsole

    JConsole是jdk1.5以后加入的图形化监控工具,由于通常的Linux服务器不支持图形化界面,一般采用在Windows机器上远程监控服务端程序。具体使用方式可以参考:使用JConsole监控远程Linux上的JVM

  • VisualVM

    VisualVM是jdk1.6加入的图形化监控工具,能够实时动态的监控java应用程序的CPU占用、内存使用、线程运行情况等。具体使用请参考:使用visualvm监控远程JVM

        (2)Linux系统自带监控工具:topdstat等,这些工具简便好用,实为监控调优之必备良工。

        (3)商业付费软件:JProfiler。该工具的使用就不赘述了,请参考:JProfiler学习笔记

    2、JVM监控内容

        工具选定之后,就要确定监控对象。我们知道,性能无非就是这几种:CPU、内存、磁盘IO、网络。如果程序性能异常,监控这几个参数一般都可以发现问题。

  • CPU

    CPU的监控可以采用top、dstat、jconsole或visualvm等工具。下面使用dstat工具监控:

    图5 dstat监控部分信息

    上图第一部分total-cpu-usage是cpu的使用信息。usr表示用户程序占用cpu比例,sys表示系统用户占用cpu比例,idl表示cpu空闲比例。

  • 内存

    内存除了观察使用率之外,还要关注GC情况。这些信息可以使用jmap和jstat两个命令获得。如果发现内存使用量不断增加,而且gc频率很高,这时需要谨慎查找程序中的内存增长点,可能存在内存泄露问题,可以采用visualvm工具辅助查找无法回收的对象。

  • 磁盘IO

    磁盘使用情况可以使用dstat命令获得。

  • 网络

    网络使用情况可以使用dstat命令获得。

二、JVM的优化

    1、内存分配(可以通过JVM参数:-Xms 和 -Xmx 指定)

  •  新生代:包含Eden区和Survivor区,空间大小可以通过JVM参数:-Xmn或者-XX:NewRatio指定。

    • Eden:新创建的对象向Eden区申请内存空间

    • Survivor:一个起缓冲作用的内存区域,包含两块同样大小的内存空间,两块空间交替使用,完成新生代对象到老生代的转移。两块空间分别为:from space 和 to space。Survivor的空间大小可以通过JVM参数:SurvivorRatio指定。

      • from space

      • to space

  • 老生代:新生代中的对象经过了指定的回收次数,仍无法被gc回收释放其内存,则被转移到老生代。空间大小 = 堆大小 - 新生代大小。-XX:MaxTenuringThreshold可以指定对象回收次数,如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。

  • 持久代:应用程序初始化时加载类信息,方法名,常量等数据到持久代,空间大小可以通过JVM参数:-XX:PermSize指定,-XX:MaxPermSize指定该空间的最大值。

    2、垃圾回收机制

        JVM内存采用分代形式管理,则相应的内存垃圾回收机制也采用分代管理,不同的内存区采用不同的回收机制。根据垃圾回收运行方式分为三类:串行GC、并行GC和并发GC。

  • 新生代

    • Serial:串行,单线程回收垃圾

    • Parallel Scavenge:并行回收,多线程回收垃圾

    • ParNew:并行,与年老代的CMS配合使用

  • 老生代

    • Serial MSC:串行

    • Parallel MSC:并行

    • CMS:并发

    垃圾回收机制的指定方式:

    a. client, server模式默认GC策略


新生代 年老代和持久代
client 串行GC 串行GC
server 并行回收GC Parallel Mark Sweep GC

    b.GC组合方式

    



参考:

JDK内置工具使用

深入理解JVM——性能监控工具

JVM垃圾回收机制


欢迎转载,请注明出处:http://my.oschina.net/xiaohui249/blog/318184

© 著作权归作者所有

萧十一郎君

萧十一郎君

粉丝 63
博文 34
码字总数 19501
作品 0
昌平
程序员
私信 提问
透视宝Java深度监控 有奖体验

应用程序一出错,你就抓狂。 Java作为应用最广泛的程序设计语言之一,怎可少得了一个监控。 透视宝Java监控全面开放试用,不用你就亏了! 活动详情 1、免费申请入口:http://cloudwise.mikecr...

cloudwiseAPM
2015/10/21
1K
6
深入理解JVM学习笔记(一、总览)

1、JVM历史 2、JVM内存结构 3、JVM垃圾回收机制 4、JVM性能监控工具 5、JVM性能调优案例时间 6、JVM类文件结构 7、JVM类加载机制 8、JVM字节码执行引擎 9、JVM虚拟机编译及其运行时优化 10、...

jintaohahahaha
2018/05/28
0
0
[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱?

[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱? 曾经的我经常害怕处理与JVM相关的异常,对JVM的配置参数也一无所知,那时候我天真地认为,JVM的出现本身就是想让程序员屏蔽实现细节,...

原创小博客
2018/07/19
0
0
OSC 第 70 期高手问答 — 实战 Java 虚拟机

OSCHINA 本期高手问答(4月22 日- 4月28日)我们请来了 @葛一鸣(葛一鸣)为大家解答关于 Java 虚拟机的运行原理和程序调优方面的问题。如: 如何定位程序中最消耗资源的代码? 如果处理内存...

叶秀兰
2015/04/22
7.7K
70
JVM参数OmitStackTraceInFastThrow导致的异常栈信息不见了

问题描述 某天收到生产环境error日志告警(对error.log监控,超过一定大小就会给开发人员发送告警短信)。但是tail查看最新的异常信息只有这些,好忧伤: 后来有个同事从error.log前面开始看...

哲别0
2018/06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 整合redis

springboot整合redis官方是有文档的: 英文看不懂可以翻译,代码应该看得懂, 这个是自动注入的。当然也可以xml注入,手动配置。 整合步骤: pom文件: <!-- spring boot web --> ...

jason_kiss
5分钟前
0
0
手机耗电问题,大部分是没有正确使用这个“锁”

当安卓设备闲置时,设备很快会进入休眠状态,以达到省电和减少CPU占用的目的。但有些应用在手机灭屏甚至系统休眠时,依然频繁占用CPU处理事件或唤醒屏幕提示用户消息,这类行为会导致手机耗电...

安卓绿色联盟
6分钟前
0
0
UI 设计中的渐变

>**简评:**渐变是通过两种或多种不同的色彩来绘制一个元素,同时在颜色的交界处进行衰减变化的一种设计。从拟物到扁平再到渐变,人们慢慢发现它能创造出从未有过的一种色彩感觉 —— 独特、...

极光推送
12分钟前
0
0
powerdesigner name 转注释vb脚本

Option Explicit ValidationMode = True InteractiveMode = im_BatchDim mdl ' the current model' get the current active model Set mdl = ......

zhu97
16分钟前
0
0
V2Ray的安装与使用

1 1. bash <(curl -s -L https://git.io/v2ray.sh)yum update -y && yum install curl -y安装好 curl 之后就能安装脚本了输入快捷管理命令v2ray后,开始进行v2ray服务端配置...

吕湘颖
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部