• VisualVM远程监控两种配置方法介绍 2013


      开发软件时,我的主要目标之一是:要么防止将缺陷引入代码库,要么限制缺陷的生存期;换言之,要尽早找到缺陷。很显然,越是了解如何编写更好的代码以及如何有效测试软件,就越能及早地捕捉到缺陷。我也很想要一张能发现潜在缺陷的安全之网。
     
        在本系列 八月份 的那期文章中,我得出了这样的结论:将检验工具集成到构建过程(例如,使用 Ant 或 Maven)中,能够建立起一种寻找潜在缺陷的方法。尽管这种方法使一致性成为可能并超越了 IDE,但它也有一点反作用。必须在本地构建软件或等待 Continuous Integration 构建的运行。如果使用 Eclipse 插件,就可以在通过 Continuous Integration 构建或集成前 发现一些这样的冲突。这就促成了我称为渐进编程的编程方式,在这种方式下,允许在编码过程中进行一定程度的质量检验 ?D?D 再也不能比这个更早了!
     
        本文涵盖了我所认为的 “五大” 代码分析领域:
     
    * 编码标准
    * 代码重复
    * 代码覆盖率
    * 依赖项分析
    * 复杂度监控 
     
        可以用接下来的几个灵活的 Eclipse 插件来揭示这些分析领域:
     
    * CheckStyle:用于编码标准
    * PMD 的 CPD:帮助发现代码重复
    * Coverlipse:测量代码覆盖率
    * JDepend:提供依赖项分析
    * Eclipse Metric 插件:有效地查出复杂度 
     
    **********************************************************************
     
     
    今天介绍一下Java程序远程监控工具。Java从最开始推出,核心特点就是对象自动收集机制,让程序员不需要像C++时代要进行配对对象书写。
     
    但是,时至今日,我们依然能够看到很多Java程序运行一段时间之后,抛出StackOverFlow和OutOfMemory等错误信息。这种时候,没有经验的开发人员只能盲目的面对所谓的“永不溢出”的JVM。应该说,在Java环境上进行内存管理和性能调优,更需要深厚的开发功底和知识体系。
     
    Java虚拟机JVM调优的工具很多,本篇介绍一下一个开源性能监控工具VisualVM的远程配置功能。其中包括一些Linux版本Java和JBoss安装过程,也都一并加入,供将来有需要的朋友待查。
     
    1、VisualVM简介
     
    VisualVM是一个以监控、显示本地或者远程服务器JVM工作情况,进行性能调优的工具。借助VisualVM,我们可以实现对JVM内存各个子池、CPU、垃圾收集器等方面进行监控,从而发现程序代码中潜在的泄露点和配置问题。
     
    VisualVM是一个Java编写的绿色软件,属于开源范畴,官方地址为:visualvm.java.net。VisualVM是使用插件Plugin的方式提供功能,默认提供了一些基本检测功能。如果需要进行拓展,可以使用下载插件的功能进行。
     
    2、Java Linux版安装
     
    首先说说Java Linux版的安装过程。我们需要从Oracle官方网站上找到Java Linux版本(区分32bit/64bit)。一般可以选择rpm包安装,上传到Linux服务器上。
     
    注意,实际工作中,建议创建一个专门的用户来进行java管理过程。实验中,笔者选择root帐号,是有一些不合适的。
     
     
    [root@bspdev upload]# ls -l
    total 123656
    -rwxr-xr-x 1 activemq activemq 126484866 Oct 25  2012 jdk-7u9-linux-i586.rpm
    -rw-r--r-- 1 oracle   oinstall      1004 Sep 17  2012 pfile.ora
     
     
    直接运行rpm –ivh jdk-7u9-linux-i586.rpm,就可以实现安装过程。过程自动化程度很高。之后,需要进行一些环境变量配置过程,主要是JAVA_HOME、PATH和CLASS_PATH的设置。
     
     
    [root@bspdev jdk1.7.0_09]# pwd
    /usr/java/jdk1.7.0_09
    [root@bspdev jdk1.7.0_09]# cd lib
    [root@bspdev lib]# ls -l
    total 26636
    -rw-r--r-- 1 root root   396920 Sep 25  2012 ant-javafx.jar
    -rw-r--r-- 1 root root 16615601 Sep 25  2012 ct.sym
    -rw-r--r-- 1 root root   141738 Sep 25  2012 dt.jar
    -rw-r--r-- 1 root root    18432 Sep 25  2012 ir.idl
    -rw-r--r-- 1 root root   435849 Sep 25  2012 javafx-doclet.jar
    -rw-r--r-- 1 root root    34383 Sep 25  2012 javafx-mx.jar
    -rw-r--r-- 1 root root   409213 Sep 25  2012 jconsole.jar
    -rwxr-xr-x 1 root root     7656 Sep 25  2012 jexec
    -rw-r--r-- 1 root root      640 Sep 25  2012 orb.idl
    -rw-r--r-- 1 root root  2566854 Sep 25  2012 sa-jdi.jar
    -rw-r--r-- 1 root root  6570456 Sep 25  2012 tools.jar
    drwxr-xr-x 6 root root     4096 Oct 25  2012 visualvm
     
     
    修改.bash_profile文件。
     
     
    [root@bspdev ~]# ls -al | grep .bash_profile
    -rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
    [root@bspdev ~]# vi .bash_profile 
     
    # .bash_profile
     
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
     
    # User specific environment and startup programs
     
    PATH=$PATH:$HOME/bin
     
    JAVA_HOME=/usr/java/jdk1.7.0_09
    PATH=$PATH:$JAVA_HOME/bin
    CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
     
    export JAVA_HOME
    export CLASSPATH
    export PATH
    unset USERNAME
    ~
     
     
    证明Java正常安装运行。
     
     
    [root@bspdev upload]# java -version
    java version "1.7.0_09"
    Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
    Java HotSpot(TM) Client VM (build 23.5-b02, mixed mode, sharing)
     
     
    3、JBoss安装
     
    JBoss安装是比较简单的过程。就是解压之后,配置对应目录。
     
     
    [root@bspdev jboss-eap-6.1]# pwd
    /jboss-eap-6.1
     
    --环境变量
     
    JBOSS_HOME=/jboss-eap-6.1
    PATH=$PATH:$JBOSS_HOME/bin
     
     
    从6.1开始,Jboss开始两种启动模式:Standalone模式和Domain模式。启动脚本也从原来的run.sh变成standalone.sh和domain.sh。
     
     
    [root@bspdev bin]# ./standalone.sh -b 192.168.137.88
    =========================================================================
      JBoss Bootstrap Environment
      JBOSS_HOME: /jboss-eap-6.1
      JAVA: /usr/java/jdk1.7.0_09/bin/java
     
      JAVA_OPTS:  -server -Xms1303m -Xmx1303m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
     
    =========================================================================
     
    05:42:52,747 INFO  [org.jboss.modules] (main) JBoss Modules version 1.2.0.Final-redhat-1
    05:42:53,164 INFO  [org.jboss.msc] (main) JBoss MSC version 1.0.4.GA-redhat-1
    05:42:53,354 INFO  [org.jboss.as] (MSC service thread 1-2) JBAS015899: JBoss EAP 6.1.0.GA (AS 7.2.0.Final-redhat-8) starting
    (篇幅原因,省略部分……)
    05:42:58,430 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss EAP 6.1.0.GA (AS 7.2.0.Final-redhat-8) started in 6445ms - Started 123 of 177 services (53 services are passive or on-demand)
     
     
     
    4、Jstatd RMI远程监控方法
     
    VisualVM在监控本地JVM的时候是很方便的。只要应用程序运行起来,我们就可以从VisualVM里面监控出来。
     
    远程服务器上的JVM监控就需要一些额外的配置了。目前VisualVM支持两种监控方法:Jstatd方法和基于JMX的方法。我们先介绍Jstatd方法。
     
    Jstatd方法是利用后台的RMI守护进程来实现对远程JVM的监控。首先创建一个监控策略文件。
     
     
     
    [root@bspdev jboss-eap-6.1]# ls -l | grep jst
    drwxr-xr-x 2 root root   4096 Jul  5 05:54 jstatd
     
    --策略文件内容
    [root@bspdev jstatd]# cat jstatd.all.policy 
    grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.security.AllPermission;   
    };
     
     
    调用jstatd命令启动进程。
     
     
    [root@bspdev jstatd]# hostname -i
    192.168.137.88
     
    [root@bspdev jstatd]# jstatd -J-Djava.security.policy=jstatd.all.policy
     
     
    此时,在监控程序VisualVM添加一个远程主机之后,自动显示出监控进程情况。
     
     
     
    在Jstatd监控方式下,Sampler、MBeans、JConsole是不能启用的。
     
    5、JMX方式
     
    JMX方式是我们监控应用服务器(JBoss)常用的方法。很遗憾的是笔者只实验成功了JBoss 4.4.2版本的功能。JBoss 6.1还不能成功。
     
    连接JMX方法首先需要在Java端进行一些配置。
     
     
    [root@bspdev jdk1.7.0_09]# cd $JAVA_HOME/jre/lib/management
    [root@bspdev management]# pwd
    /usr/java/jdk1.7.0_09/jre/lib/management
    [root@bspdev management]# ls -l
    total 28
    -rw-r--r-- 1 root root  3998 Sep 25  2012 jmxremote.access
    -rw-r--r-- 1 root root  2856 Sep 25  2012 jmxremote.password.template
    -rw-r--r-- 1 root root 14097 Sep 25  2012 management.properties
    -rw-r--r-- 1 root root  3376 Sep 25  2012 snmp.acl.template
     
     
    首先利用password.template文件创建jmxremote.password文件,并且设置相应的读写权限。
     
     
    [root@bspdev management]# cp jmxremote.password.template jmxremote.password
    [root@bspdev management]# ls -l
    total 32
    -rw-r--r-- 1 root root  3998 Sep 25  2012 jmxremote.access
    -rw-r--r-- 1 root root  2856 Jul  5 06:09 jmxremote.password
    -rw-r--r-- 1 root root  2856 Sep 25  2012 jmxremote.password.template
    -rw-r--r-- 1 root root 14097 Sep 25  2012 management.properties
    -rw-r--r-- 1 root root  3376 Sep 25  2012 snmp.acl.template
    [root@bspdev management]#
     
     
    将jmxremote.password中的权限部分注释标记去除。
     
     
     
    # password "QED".  The "controlRole" role has password "R&D".
    #
    # monitorRole  QED
    # controlRole   R&D
     
    修改为:
     
    monitorRole  QED
    controlRole   R&D
     
    "jmxremote.password" 64L, 2852C written
     
     
    同时,在JBoss启动文件run.sh的定义环境变量部分,加入如下内容。
     
     
    if [ "x$JAVA_OPTS" = "x" ]; then
       JAVA_OPTS=" -Dcom.sun.management.jmxremote.port=9988                              
    -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    else
       JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9988                    
    -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    fi
     
     
    下面,就可以增加JMX的9988端口的连接。显示如下界面进行监控。
     
     
     
    使用JMX监控的功能不支持Visual GC。对JBoss的支持性比较好。
     
    5、结论
     
    VisualVM是一种比较方便的性能监控工具,加之一定的JVM调优经验和知识,可以帮助我们实现性能优化。
  • 相关阅读:
    不停机还能替换代码?6年的 Java程序员表示不可思议
    redis 分布式锁的 5个坑,真是又大又深
    一口气说出 4种 LBS “附近的人” 实现方式,面试官笑了
    真没想到,Springboot能这样做全局日期格式化,有点香!
    springboot + aop + Lua分布式限流的最佳实践
    不可思议的hexo,五分钟教你免费搭一个高逼格技术博客
    Redis开发运维的陷阱及避坑指南
    Jar包一键重启的Shell脚本及新服务器部署的一些经验
    与Redis的初次相识,Redis安装、启动与配置
    SpringBoot项目中应用Jedis和一些常见配置
  • 原文地址:https://www.cnblogs.com/huapox/p/3516352.html
Copyright © 2020-2023  润新知