原生java调优工具

jps

主要用来输出JVM中运行的进程状态信息.语法格式如下

jps [options] [hostid] //如果不指定hostid就默认为当前主机或服务器。

-q 不输出类名、Jar名和传入main方法的参数
 
-m 输出传入main方法的参数
 
-l 输出main类或Jar的全限名
 
-v 输出传入JVM的参数

jmap

jmap导出堆内存,然后使用jhat来进行分析

jmap -heap pid //查看内存使用情况,但是已经不能用了,代替为 jhsdb jmap --heap --pid pid
jmap -histo:live pid //查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
jmap -clstats 22928 //显示Java堆中元空间的类加载器的统计信息
jmap -finalizerinfo 22928 //显示在F-Queue中等待Finalizer线程执行finalize方法的对象

jstat

可以轻易的让你看到当前运行中的系统,他的JVM内的Eden、Survivor、老年代的内存使用情况,还有Young GC和Full gC的执行次数以及耗时。通过这些指标,我们可以轻松的分析出当前系统的运行情况,判断当前系统的内存使用压力以及GC压力,还有就是内存分配是否合
理。

jstat -gc PID
运行这个命令之后会看到如下列,给大家解释一下:
S0C:这是From Survivor区的大小
S1C:这是To Survivor区的大小
S0U:这是From Survivor区当前使用的内存大小
S1U:这是To Survivor区当前使用的内存大小
EC:这是Eden区的大小
EU:这是Eden区当前使用的内存大小
OC:这是老年代的大小
OU:这是老年代当前使用的内存大小
MC:这是方法区(永久代、元数据区)的大小
MU:这是方法区(永久代、元数据区)的当前使用的内存大小
YGC:这是系统运行迄今为止的Young GC次数
YGCT:这是Young GC的耗时
FGC:这是系统运行迄今为止的Full GC次数
FGCT:这是Full GC的耗时
GCT:这是所有GC的总耗时

其他的jstat命令

除了上面的jstat -gc命令是最常用的以外,他还有一些命令可以看到更多详细的信息,如下所示:
jstat -gccapacity PID:堆内存分析
jstat -gcnew PID:年轻代GC分析,这里的TT和MTT可以看到对象在年轻代存活的年龄和存活的最大年龄
jstat -gcnewcapacity PID:年轻代内存分析
jstat -gcold PID:老年代GC分析
jstat -gcoldcapacity PID:老年代内存分析
jstat -gcmetacapacity PID:元数据区内存分析
jstat -gc PID 1000 10
这行命令,他的意思就是每隔1秒钟更新出来最新的一行jstat统计信息,一共执行10次jstat统计
通过这个命令,你可以非常灵活的对线上机器通过固定频率输出统计信息,观察每隔一段时间的jvm中的Eden区对象
占用变化。
比如给大家举个例子,执行这个命令之后,第一秒先显示出来Eden区使用了200MB内存,第二秒显示出来的那行统计
信息里,发信Eden区使用了205MB内存,第三秒显示出来的那行统计信息里,发现Eden区使用了209MB内存,以此
类推。
此时你可以轻易的推断出来,这个系统大概每秒钟会新增5MB左右的对象。

而且这里大家可以根据自己系统的情况灵活多变的使用,比如你们系统负载很低,不一定每秒都有请求,那么可以把
上面的1秒钟调整为1分钟,甚至10分钟,去看你们系统每隔1分钟或者10分钟大概增长多少对象。
还有就是一般系统都有高峰和日常两种状态,比如系统高峰期用的人很多,此时你就应该在系统高峰期去用上述命令
看看高峰期的对象增长速率。然后你再得在非高峰的日常时间段内看看对象的增长速率。
按照上述思路,基本上你可以对线上系统的高峰和日常两个时间段内的对象增长速率有很清晰的了解。

hprof

能够展现CPU使用率,统计堆内存使用情况。

jinfo

查看虚拟机配置参数信思,也可用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了 jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值, 甚至可以在运行时修改部分参 数,并使之立即生效。 但是,并非所有参数都支持动态修改。参数只有被标记 manageable的flag可以被实时修改。其实,这个修改能力是 极其有限的。

jinfo -sysprops pid //查看该进程的全部配置信息,类似于ystem.getProperties()参数进行获取到的,其实就是环境变量
jinfo -flags pid  //查看曾经赋过值的参数值
jinfo -flag <具体参数> pid //查看具体参数的值

jconsole

针对线程

jstack

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

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

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
在Linux中可以通过top获取进程pid,再通过top -HP pid找出最耗CPU的线程pid,通过 printf ‘%x’ pid将pid转换为16进制,最后通过jstack pid | grep pid16进制,定位到代码。

jhsdb

https://www.1024sky.cn/blog/article/3782

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值