zoukankan      html  css  js  c++  java
  • 常见的监控JVM的几个Linux命令和使用

    jps

    [root@xxx bin]# jps -l 2007
    bash: jps: command not found

    [root@xxx bin]# /opt/jdk1.8.0_181/bin/jps -q 116471
    RMI Registry not available at 116471:1099
    Exception creating connection to: 116471; nested exception is:
    java.net.SocketException: Invalid argument or cannot assign requested address

    一、监控管理工具

    以下三个命令常用于监视JVM虚拟机性能及资源消耗情况:

    1、jps-Java Virtual Machine Process Status Tool

    使用说明: 该命令用于列出目标系统上正在运行的虚拟机进程(每个java程序会独占一个java虚拟机实例)。所列信息包括进程ID及虚拟机执行主类名称,对于非root账户,只能显示当前用户启动的虚拟机进程。值得注意的是,java程序启动后,默认会在/tmp/hsperfdata_${user_name}目录下以该进程ID为文件名的文件,并将jvm运行相关信息存储其中,其中user_name是当前用户名。出现无法查看时,可能是磁盘读写、目录权限;临时文件丢失;java进程信息文件存储地址呗设置(-Djava.io.tmpdir)等问题。

     

    命令格式:

    jps [opions] [hostid]

    options: 命令行选项;hostid:RMI注册表中注册的主机名,默认是localhost

     

    参数详解:

    选项

    描述

    -q

    只显示进程ID

    -m

    显示传递给main方法的参数

    -l

    显示执行主类全名,jar则为其所在全路径

    -v

    显示传递给JVM的命令行参数



    2、jstat-Java Virtual Machine Statistics Monitoring Tool

    使用说明: 该命令用于输出给定java进程的统计信息。在只有控制台的环境中(比如生产环境),该命令十分奏效。我们主要通过它可以显示系统中垃圾回收、类装载、运行期编译状况等数据。

     

    命令格式:

    jstat [generalOpion] [outputOptions] vmid [interval][s|ms] [count]]

    generalOptions: 常规命令行选项,如-version,-options;

    outputOptions:输出选项;

    vmid:进程ID;

    interval[s|ms]:采样间隔,默认是毫秒;

    count:采样次数;

     

    参数详解:

    选项

    描述

    -class

    类装载器的行为统计

    -gc

    垃圾回收堆的行为统计

    -gccapacity

    各个垃圾回收代(young,old,perm)和它们的相应空间统计

    -gcutil

    垃圾回收统计概述

    -gccause

    同-gcutil,但会额外输出导致上一次GC产生原因

    -gcnew

    监视新生代GC状况

    -gcnewcapacity

    同-gcnew,但主要关注使用到的最大和最小空间

    -gcold

    监视老年代GC状况

    -gcoldcapacity

    同-gccold,输出主要关注使用到的最大和最小空间

    -gcpermacapacity

    输出永久代使用到的最大和最小空间

    -compiler

    输出JIT编译器编译过的方法、耗时等信息

    -printcompilation

    输出已经被JIT编译的方法

    备注:

    1)JIT 即时编译技术,能够加速java程序的执行速度,JIT编译器将字节码编译成本机机器码

    2)JVM堆结构

     

    Sun JVM分代垃圾回收器把堆空间分成3块:

    Young Gen:年轻代,包括1个Eden区和2个Suvivor区,新创建的对象(大部分为短周期的对象)将进入这个区,虚拟机会频繁地对这个区进行垃圾回收。

    Old Gen:年老代,当对象在Young Gen呆地足够久(经过几次的垃圾回收仍然存在)或Young Gen空间不足时,对象将进入Old Gen,由于一般是生命周期比较长的对象,因此虚拟机对这块内存的回收频度会比较低,一旦回收,使用的将是一个耗时的Full GC,另外,一旦堆空间不足时,虚拟机也会尝试去回收这个区。

    Perm Gen:持久代,一些常量定义和类、方法声明及其bytecode都会放在这个区

     

    3、jstatd-Virtual Machine jstat Daemon

    使用说明: 此命令将开启一个RMI服务器程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口。启动它之前需要首先为其制定安全策略,创建策略稳健,并命名为jstatd.all.policy,启动时,命令为jstatd -J-Djava.security.policy=jstatd.all.policy。策略稳健内容如下:

    grant codebase ”file{java.home}/../lib/tools.jar” {
    permission java.security.AllPermission;
    };

     

    命令格式:

    jstatd [options]

    options: 命令行选项;

     

    参数详解:

    选项

    描述

    -nr

    当一个存在的RIM Registry没有找到时,补仓是创建一个内部的RMI Registry

    -p

    port端口号,默认为1099

    -n

    RMI Registray中注册的远程RMI对象名称

    -J

    JVM参数

     

    二、故障诊断工具

    以下三个命令常用于完成特定故障诊断任务:

    1、jinfo-Configuration Info

    使用说明: 该命令作用是实时查看或调整JVM运行环境参数。如果想知道显式指定的虚拟机参数,可以采用jps -v,但是如果想知道默认的相关虚拟机参数值,只能借助该命令来做。

     

    命令格式:

    jinfo [option] pid

    options: 命令行选项;pid:java进程ID;

     

    参数详解:

    选项

    描述

    -flag <name>

    打印指定VM参数值

    -flag [+|-]<name>

    更改VM参数生效与否

    -flag <name>=<value>

    设置VM参数为指定值

    -h

    打印帮助信息

    -help

    同-h

     

    2、jmap-Memory Map

    使用说明: 该命令用于生成堆转存快照,使用jmap可以查看heap空间的概要情况,粗略的掌握heap的使用情况。也可以生成heapdump文件,再使用jhat通过web浏览器具体分析内容中的对象和数据。

     

    命令格式:

    jmap [option] vmid

    options: 命令行选项;pid:java进程ID;

     

    参数详解:

    选项

    描述

    -dump

    生成堆转存快照

    -finalizerinfo

    显示等待finalize方法的对象

    -heap

    显示堆详细信息

    -histo

    显示堆中对象统计信息

    -permstat

    以classloader为统计口径显示永久代内存状态

    -F

    当虚拟机进程对-dump选项无响应时,可使用这个选项强制生成

     

    3、jstack-Stack Trace

    使用说明: 该命令用于生成JVM当前时刻的线程快照。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可知道没有响应的线程到底在后台做些什么事情,或者等待什么资源。

     

    命令格式:

    jstack [option] vmid

    options: 命令行选项;pid:java进程ID;

     

    参数详解:

    选项

    描述

    -F

    强制输出线程堆栈

    -m

    如调用本地方法的话,可显示C/C++堆栈

    -l

    出堆栈外,显示关于锁的附加信息

     

    在生产环境中,jstack命令帮助解决内存泄露引起的垃圾回收线程占用高CPU,以及服务线程阻塞在某个远程接口处导致无响应等问题。列出子线程的cpu占用率等情况,再对照jstack命令得到的线程号,就可以知道cpu占用高的线程执行到了那里:

    ps -eL -o pid,%cpu,lwp|grep -i 16907

  • 相关阅读:
    Android Studio自动排版的两种方法
    面向对象语言为什么要有访问权限控制
    2017年蓝桥杯省赛A组c++第7题(正则问题)
    2017年蓝桥杯省赛A组c++第1题(走迷宫)
    2017年蓝桥杯省赛A组c++第6题(字符串匹配算法填空)
    2017年蓝桥杯省赛A组c++第5题(递归算法填空)
    2016年蓝桥杯省赛A组c++第9题(逆序串问题)
    2016年蓝桥杯省赛A组c++第7题(图论)
    2016年蓝桥杯省赛A组c++第3题(图论)
    Java的四种内部类(含代码实例)
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/11357954.html
Copyright © 2011-2022 走看看