`
xubindehao
  • 浏览: 244734 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

转载:性能调优

阅读更多

性能测试过程中,我们该如何监控java虚拟机内存的使用情况,用以判断JVM 是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到 java应用程序。
在项目实践过程中,我们探索和使用了一款新工具--Jstat。
    先秀一下。Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
那,该怎么用呢?
    语法结构如下:jstat [Options] vmid [interval] [count]
    Options — 选项,我们一般使用 -gcutil 查看gc情况
    vmid    — VM的进程号,即当前运行的java进程号
    interval– 间隔时间,单位为秒或者毫秒
    count   — 打印次数,如果缺省则打印无数次
    下面给出一个实际的例子:

 

 

注:由于JVM内存设置较大,图中百分比变化不太明显

 

    图中参数含义如下:

    S0 — Heap上的 Survivor space 0 区已使用空间的百分比
    S1 — Heap上的 Survivor space 1 区已使用空间的百分比
    E   — Heap上的 Eden space 区已使用空间的百分比
    O   — Heap上的 Old space 区已使用空间的百分比
    P   — Perm space 区已使用空间的百分比
    YGC — 从应用程序启动到采样时发生 Young GC 的次数
    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC — 从应用程序启动到采样时发生 Full GC 的次数
    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

    上图的示例,红框中,我们可以看到,5次young gc之后,垃圾内存被从Eden space区(E)放入了Old space区(O),并引起了百分比的变化,导致Survivor space使用的百分比从19.69%(S0)降到10.34%(S1)。有效释放了内存空间。绿框中,我们可以看到,一次full gc之后,Old space区(O)的内存被回收,从36.81%降到35.01%。

    图中同时打印了young gc和full gc的总次数、总耗时。而,每次young gc消耗的时间,可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次young gc,消耗的时间为52.281-52.252=0.029秒。

    常驻内存区(P)的使用率,始终停留在37.6%左右,说明常驻内存没有突变,比较正常。

如果young gc和full gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。 但也不能说明一定没有内存泄露。

 

    以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有其它功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出 来的,比较少用,在此就不做介绍。

 

    为了更全面的监控JVM内存使用情况,我们需要引入更强大的工具来进一步分析–JConsole。敬请关注。

--------

一、概述

    SUN 的JDK中的几个工具,非常好用。秉承着有免费,不用商用的原则。以下简单介绍一下这几种工具。(注:本文章下的所有工具都存在JDK5.0以上版本的工 具集里,同javac一样,不须特意安装) 。
   
    我一共找到以下四个工具:重点看看jconsole和jmap。

Java代码 复制代码
  1. jps   
  2. :与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。   
  3.   
  4. jstat   
  5. :一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。   
  6.   
  7. jmap   
  8. :打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。   
  9.   
  10. jconsole   
  11. :一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。  
jps
:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 

jstat
:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 

jmap
:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 

jconsole
:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

 

二、 使用介绍:
   
    1、jstat :我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独 占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。
    使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。

可惜没有linux下的ps好用,名称不好用。但是在第四个工具jconsole的界面里面会有具体JAR包的名称。
   
    2、jstat :对VM内存使用量进行监控。
    jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介 绍各个参数的意义。
    jstat -class pid:显示加载class的数量,及所占空间等信息。
    jstat -compiler pid:显示VM实时编译的数量等信息。
    jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
    jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使 用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
    jstat -gcnew pid:new对象的信息。
    jstat -gcnewcapacity pid:new对象的信息及其占用量。
    jstat -gcold pid:old对象的信息。
    jstat -gcoldcapacity pid:old对象的信息及其占用量。
    jstat -gcpermcapacity pid: perm对象的信息及其占用量。
    jstat -util pid:统计gc信息统计。
    jstat -printcompilation pid:当前VM执行的信息。
    除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
   
   3、jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid>a.log可以将其保存到文本中去(windows下也可以使用),在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。 jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。
   
    4、jconsole 是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。由于是GUI程序,这里就不详细介绍了,不会的地方可以 参考SUN的官方文档。
    使用方法:命令行里打 jconsole,选则进程就可以了。
   
    友好提示:windows查看进程号,由于任务管理器默认的情况下是不显示进程id号的,所以可以通过如下方法加上。ctrl+alt+del打开任务管 理器,选择‘进程’选项卡,点‘查看’->''选择列''->加上''PID'',就可以了。当然还有其他很好的选项。

 

三、参考资料:

    article:http://elf8848.iteye.com/blog/442806


    jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html


    jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html


    jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html


    jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

分享到:
评论

相关推荐

    转载的供大家分享

    【标签】:Java调优,企业级应用,内存溢出,性能优化 【内容】: 企业级Java EE应用程序在不同部署环境下可能面临相似的问题。作为Java EE问题解决专家,作者通过分析和诊断发现,这些问题往往遵循一定的解决模式...

    性能测试种类_转载网友

    其目的是建立一个可度量的参考标准,用以在其他测试场景或调优过程中进行对比。基准测试通常作为性能测试的起始点,如果基准测试的结果未达预期,则可能没有必要进行后续的测试。 2. 日常压力测试:在基准测试通过...

    《JVM从入门到入魔》笔记.pdf

    3:JVM内存调优:JVM参数【标准参数、-X参数、-XX参数等】+常用命令【jps、jinfo、jstat、jstack、jmap】+常用工具【jconsole、jvisualvm、Arthas、MAT】+性能优化及总结+高并发场景分析+JVM性能优化指南。

    osf-openstack-training-master.zip

    OpenStack平台性能调优 KVM性能调优 Host OS性能调优 ###OpenStack使用 命令行操作 ###Dashboard操作 ###nova源码架构介绍 源码的获取 开发环境的搭建 nova模块调用介绍 nova源码模块功能介绍 ###添加Nova-api...

    【转载】浅谈基于索引的SQL语句优化方法

    总之,基于索引的SQL语句优化是数据库性能调优的重要组成部分。通过理解索引的工作原理,选择合适的索引类型,合理创建和使用索引,并结合SQL语句优化技巧,我们可以显著提升数据库的查询速度,进而优化整个系统的...

    转载软件测试试题

    1. **性能监控工具**:使用系统自带的性能监视器或者第三方工具(如Process Monitor、Task Manager等)收集CPU、内存、磁盘I/O等方面的使用情况。 2. **代码审查**:分析源代码查找可能存在的性能瓶颈。 3. **硬件...

    [转载]hotspot源码(JDK7)

    《深入解析JDK7 Hotspot源码》 Hotspot是Oracle JDK中的一个关键组件,它是一个高性能的Java虚拟机(JVM)。...无论是Java开发人员还是性能调优专家,对Hotspot源码的探索都是提升专业技能的重要途径。

    Java 最常见 200+ 面试题全解析:面试必备.pdf

    19. JVM:涵盖Java虚拟机的内存模型、垃圾回收机制、类加载机制、性能调优等高级概念。 除了上述模块,文章还强调了对于面试题的深入解析和代码案例的提供,这对于面试者理解知识点、整理思路和表达能力的培养是至...

    《转载》ora-00020超出最大进程数

    在Oracle数据库系统中,"ORA-00020 超出最大进程数"是一个常见的错误,通常出现在用户尝试创建新的会话或进程时,但数据库...对于IT专业人士来说,了解并掌握这些知识对于提升故障排除能力和系统性能调优能力至关重要。

    转载的文章《DataGuard交流讲义.pdf》

    **吴海存**,作为 Oracle Cloud 团队的一名内部支持 DBA,负责 RAC、DG、性能调优、备份/恢复、打补丁和升级、Exadata/Exalogic 的维护及调优等工作。拥有以下认证: - Oracle 11g OCM - Oracle 10g OCM - Oracle ...

    sqlserver数据库优化总结的资料

    9. **性能监控和调优工具**:SQL Server Profiler用于跟踪数据库活动,识别性能问题的源头。动态管理视图(DMVs)和性能计数器提供了丰富的数据库内部状态信息。 10. **数据库设计**:良好的数据库设计是优化的基础...

    Derby 命令(转载)

    至于"工具"标签,Derby的命令行工具集是其强大之处,它们不仅限于基本的数据库管理,还可以用于性能调优、故障排查和自动化脚本编写。例如,你可以通过编写Java程序或shell脚本来批量导入数据、定期备份数据库,甚至...

    Java面试资料大集合

    - **性能调优**:JVM参数调整,GC日志分析。 7. **设计模式** - **常见的23种设计模式**:单例、工厂、建造者、观察者、装饰器等,理解其应用场景。 8. **框架与库** - **Spring框架**:依赖注入(DI)、AOP、...

    java编程事项(转载收集整理版)

    11. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)以及JVM调优,有助于提升程序性能。 12. **Java 8及以后的特性**:从Java 8开始,引入了Lambda表达式、Stream API和...

    ofbiz学习资料

    最佳实践通常包括但不限于模块设计原则、数据模型规范化、事务处理策略、性能调优方法等。 学习Ofbiz时,你需要了解以下几个重要知识点: - **Ofbiz架构**:Ofbiz基于服务导向架构(SOA),由多个服务组件构成,如...

    TensorFlow for Machine Intelligence

    - 调优与部署:讲解如何调整模型参数来优化性能,以及如何将模型部署到生产环境。 除了理论讲解和代码示例,本书还可能提供了大量的实例和练习,供读者亲自实践以加深理解。通过对本书的学习,读者将能深入掌握...

    Java面试题

    9. **JVM优化**:了解JVM内存模型(堆、栈、方法区等),垃圾回收机制(GC),以及如何通过JMX、JConsole等工具进行性能监控和调优。 10. **数据库操作**:掌握JDBC基本操作,事务处理,以及SQL语句优化。了解ORM...

    2009年最新版 win2003 IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置教程第1/8页

    安全和性能调优 尽管本教程提供了一个基础的安装和配置流程,但作者也强调,对于正式的生产环境,还需要进一步进行安全设置和性能调整。具体而言,这可能包括: - 安全设置:比如修改默认的管理员密码、删除测试...

Global site tag (gtag.js) - Google Analytics