JVM常用命令和性能调优

一、查看jvm常用命令
jinfo:可以输出并修改运行时的java 进程的opts。 
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 
jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 
jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。 
jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

需要注意:在使用这些工具前,先用JPS命令获取当前的每个JVM进程号,然后选择要查看的JVM。

二、jinfo
jinfo可以查看设置的jvm的信息

3.  性能调优工具
3.1)jps  (Java Virtual Machine Process Status Tool)
主要用来输出JVM中运行的进程状态信息。语法格式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

jps [options] [hostid]

 

# hostid语法如下:

[protocol:][[//]hostname][:port][/servername]

protocol - 如果protocol及hostname都没有指定,那表示的是与当前环境相关的本地协议,如果指定了hostname却没有指定protocol,那么protocol的默认就是rmi。

hostname - 服务器的IP或者名称,没有指定则表示本机。

port - 远程rmi的端口,如果没有指定则默认为1099。

Servername - 注册到RMI注册中心中的jstatd的名称。

 

# 如果不指定hostid就默认为当前主机或服务器。

 

# 命令行参数选项

-q 忽略输出类名、Jar名和传入main方法的参数

-m 输出传入main方法的参数

-l 输出main类或Jar的全限名

-v 输出传入JVM的参数

-V 输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flags=<filename>指定的文件)

-J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。

3.2)stack(Java Stack Trace)
主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:

1

2

3

4

5

6

7

8

9

jstack [option] pid

jstack [option] executable core

jstack [option] [server-id@]remote-hostname-or-ip

 

# 命令行参数选项说明如下:

-l 长列表,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息

-h | -help打印帮助信息

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

3.3)jmap(Java Memory Map)
jmap用来查看堆内存使用状况,一般结合jhat使用。jmap语法格式如下:(如果运行在64位JVM上,可能需要指定-J-d64命令选项参数)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

jmap [option] pid

jmap [option] executable core

jmap [option] [server-id@]remote-hostname-or-ip

 

# 参数说明

executable 产生core dump的java可执行程序

core 将被打印信息的core dump文件

remote-hostname-or-ip 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务

pid 需要被打印配相信息的java进程id,可以用jps查问

 

# 基本参数

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件

-finalizerinfo 打印正等候回收的对象的信息

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来

-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效

-h | -help 打印辅助信息

-J 传递参数给jmap启动的jvm

3.4)jhat(Java Heap Analysis Tool)
jhat用于对JAVA heap进行离线分析的工具,它可以对不同虚拟机中导出的heap信息文件进行分析

1

2

3

4

5

6

7

# jmap -dump:format=b,file=dumpFileName pid

jmap -dump:format=b,file=/tmp/dump.dat 21711

 

jhat -port 9998 /tmp/dump.dat

# 注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存

 

# 在浏览器中输入主机地址:9998查看

另外,可以使用Eclipse插件MAT(Memory Analyzer Tool)对dump文件进行分析。

3.5)jstat(Java Virtual Machine Statistics Monitoring Tool)
Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:

类的加载及卸载情况
-  查看新生代、老生代及持久代的容量及使用情况
-  查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
-  查看新生代中Eden区及Survior区中容量及分配情况等

语法:

1

2

3

4

5

6

7

8

9

10

11

12

13

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

 

generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version。

outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。

 

statOption 根据jstat统计的维度不同,可以使用如下表中的选项进行不同维度的统计,不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项

 

-h n 用于指定每隔几行就输出列头,如果不指定,默认是只在第一行出现列头。

-J javaOption 用于将给定的javaOption传给java应用程序加载器,例如,“-J-Xms48m”将把启动内存设置为48M

-t n 用于在输出内容的第一列显示时间戳,这个时间戳代表的时JVM开始启动到现在的时间

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

interval 间隔时间,单位可以是秒或者毫秒,通过指定s或ms确定,默认单位为毫秒

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

 

3.6)jvisualvm(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)
jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入Jvisualvm即可启动,不过Jvisualvm相比,界面更美观一些,数据更实时。

3.7)jconsole
一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选则进程就可以了。

需要注意:在运行jconsole之前,必须要先设置环境变量DISPLAY,否则会报错误,Linux下设置环境变量如下: 
export DISPLAY=:0.0

3.8)jprofile
JProfiler是一个需要商业授权的全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程序。

它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。

3.9)jca
Java线程分析工具,专业的线程分析工具兼容sun/oracle JDK dump线程堆,图形化显示线程概括信息,非常容易的定位问题。 
jca是一个类工具 启动方法

1

java -jar jca433.jar

3.10)jinfo命令 (Java Configuration Info)
jinfo可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。

3.11)Jdb命令 (The Java Debugger)
用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试。

3.12)Jstatd命令 (Java Statistics Monitoring Daemon)
jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。

jstatd是基于RMI的,所以在运行jstatd的服务器上必须存在RMI注册中心,如果没有通过选项”-p port”指定要连接的端口,jstatd会尝试连接RMI注册中心的默认端口。后面会谈到如何连接到一个默认的RMI内部注册中心,如何禁止默认的RMI内部注册中心的创建,以及如何启动一个外部注册中心。
参数选项

1

2

3

4

-nr 如果RMI注册中心没有找到,不会创建一个内部的RMI注册中心。

-p port RMI注册中心的端口号,默认为1099。

-n rminame 默认为JStatRemoteHost;如果同一台主机上同时运行了多个jstatd服务,rminame可以用于唯一确定一个jstatd服务;这里需要注意一下,如果开启了这个选项,那么监控客户端远程连接时,必须同时指定hostid及vmid,才可以唯一确定要连接的服务,这个可以参看jps章节中列出远程服务器上Java进程的示例。

-J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。

安全性
jstatd服务只能监视具有适当的本地访问权限的JVM,因此jstatd进程与被监控的JVM必须运行在相同的用户权限中。但是有一些特殊的用户权限,如基于UNIX(TM)为系统的root用户,它有权限访问系统中所有JVM的资源,如果jstatd进程运行在这种权限中,那么它可以监视系统中的所有JVM,但是这也带来了额外的安全问题。

示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# 使用内部RMI注册中心(默认端口是1099),启动jstatd

jstatd -J-Djava.security.policy=jstatd.all.policy

 

# 使用外部的RMI注册中心,启动jstatd

rmiregistry&jstatd -J-Djava.security.policy=all.policy

 

# 外部的RMI注册中心来启动jstatd,此注册中心的端口为2020

rmiregistry 2020&jstatd -J-Djava.security.policy=all.policy -p 2020

 

# 外部的RMI注册中心来启动jstatd,此注册中心的端口为2020,并且绑定到RMI注册中心的名为AlternateJstatdServerName

rmiregistry 2020&jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName

 

# 禁止内部RMI注册中心的创建

jstatd -J-Djava.security.policy=all.policy -nr

 

# 开启RMI日记记录,jstatd运行在开启了日志记录功能的RMI注册中

jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true

3.13)httpwatch
网页数据分析工具,对客户端到服务器端的请求,响应数据有效的监控分析。

1、jps:查看本机java进程信息。

2、jstack:打印线程的信息,制作线程dump文件。

3、jmap:打印内存映射,制作dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具

6、jconsole:简易的可视化控制台

7、jvisualvm:功能强大的控制台

https://www.cnblogs.com/kevingrace/p/5616752.html 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi心之所向

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值