【JVM】Java命令以及JVM调优

本文详细介绍了Java的命令行工具,包括jps、jinfo、jstat、jmap和jstack的使用,以及JVM调优的基本原则、目的和步骤。通过实例展示了如何排查高CPU和内存问题,帮助开发者诊断和解决Java应用的性能问题。
摘要由CSDN通过智能技术生成

目录

一、Java命令

1、jps:显示所有java进程pid

 2、jinfo:实时查看和调整虚拟机参数

 3、jstat:监控虚拟机各种运行状态信息

 4、jmap:生成堆转储快照

5、jhat:Java堆分析工具

6、jstack:堆栈跟踪工具

二、JVM调优

1、JVM调优原则

2、优化目的

3、调优的一般步骤

三、java出现的实际问题:OOM问题

例题一:某服务器CPU使用率达到99%,排查是哪个程序的哪个线程导致的高CPU。

例题二、某java应用大量消耗内存,导致OutOfMemoryError


一、Java命令

作为一个合格的开发人员,不仅要能写好代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括线上问题的排查。由于在生产环境中,一般没办法debug,所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。

本文介绍常用的Java命令,这些命令都是被存放在JDK安装目录的bin目录中,以下来介绍相关命令以及具体使用方式。

1、jps:显示所有java进程pid

jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单查看当前java进程的一些简单情况。

jps类似linux/unix平台上的ps命令,但是jps只查找所有的Java应用程序,包括即使没有使用java执行体的程序(例如:定制的启动器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。

学习一个命令,首先查看帮助:

jps -help

  • 参数介绍

-q 只显示pid,不显示class名称,jar文件名和传递给main方法的参数

-m 输出传递给main方法的参数,在嵌入式jvm上可能是null

-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名

-v 输出传递给JVM的参数

  • 常用命令

jps:显示当前用户的所有java进程的PID

jps -v 3331:显示虚拟机参数

jps -m 3331:显示传递给main()函数的参数

jps -l 3331:显示主类的全路径

 2、jinfo:实时查看和调整虚拟机参数

配置信息包括JAVA系统参数和命令行参数,如果运行在64位虚拟机上运行,需要指定-J-d64参数,如:jinfo -J-d64 -sysprops pid

由于打印jvm常用信息可以使用Jps命令,并且在后续的java版本中可能不再支持(注:jdk8中已经不支持该命令

查看帮助:jinfo -help

  • 常用命令

Jinfo -flag CMSIniniatingOccupancyFration 1444:查询

CMSIniniatingOccupancyFration参数值

 3、jstat:监控虚拟机各种运行状态信息

jstat(JVM Statistic Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

查看帮助:jstat -help

 

利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
  • 参数解释

Option -选项,我们一般使用 -gcutil 查看gc情况

vmid -VM的进程号,即当前运行的java进程号

interval -间隔时间,单位为秒或毫秒

count -打印次数,如果缺省则打印无数次

 注意:参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次

假设需要每250毫秒查询一次进程5828垃圾收集状况,一共查询5次,命令行如下:

jstat -gc 5828 250 5
  • option:

选项option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集呵呵运行期编译状况,具体选项及作用如下:

-class 监视类装载、卸载数量、总空间及类装载所耗费的时间

-gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量

-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间

-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比

-gccause与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

-gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间

-gcold 监视老年代GC的状况

-gcoldcapacity 监视内容与 -gcold基本相同,输出主要关注使用到的最大和最小空间

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

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

-printcompilation 输出已经被JIT编译的方法

  •  常用指令
jstat -class<pid>:显示加载class的数量,及所占空间等信息

Loaded   装载的类的数量

Bytes      装载类所占用的字节数

Unloaded   卸载类的数量

Time         装载和卸载类所花费的时间

jstat -compiler <pid>:显示VM实时编译的数量等信息

Compiled   编译任务执行数量

Failed         编译任务执行失败数量

Invalid         编译任务执行失效数量

Time            编译任务消耗时间

FailedType  最后一个编译失败任务的类型

FailedMethod 最后一个编译失败任务所在的类及方法

jstat  -gc <pid>:可以显示gc的信息,查看gc的次数,及时间

S0C    年轻代中第一个survivor(幸存区)的容量(字节)

S1C     年轻代中第二个surviror(幸存区)的容量(字节)

S0U      年轻代中第一个survivor目前已使用空间(字节)

S1U      年轻代中第二个survivor目前已使用空间(字节)

EC        年轻代中Eden的容量(字节)

EU        年轻代中Eden目前已使用空间(字节)

OC        Old代目前的容量(字节)

OU        Old代目前已使用空间(字节)

PC         Perm(持久代)的容量(字节)

PU         Perm(持久代)目前已使用空间(字节)

YGC       从应用程序启动到采样时年轻代中gc次数

YGCT     从应用程序启动到采样时年轻代中gc所用时间(s)

FGC        从应用程序启动到采样时old代(全gc)gc所用时间(s)

FGCT      从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT        从应用程序启动到采样时gc用的总时间(s)

 

jstat 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值