Arthas工具、GC日志、常量池

Arthas

官方文档

Arthas使用场景

  • 反编译线上代码,查看最新更新的代码是否成功部署
  • 检测JVM运行情况



使用

使用和目标进程一样的用户启动

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

接下来会把当前运行的java进程都打印出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5fXrrRO0-1679204783617)(picture/性能调优/image-20230319112120815.png)]

直接输入进程号 比如输入3 再回车

输入dashboard然后按回车,就会显示各个线程占用cpu的情况、JVM内存使用情况、jvm参数
在这里插入图片描述

输入thread可以查看线程详细情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wCDUFmhW-1679204783617)(picture/性能调优/image-20230319120503858.png)]

输入 thread加上线程ID 可以查看线程堆栈

输入 thread -b 可以查看线程死锁

输入 jad加类的全名 可以反编译,这样可以方便我们查看线上代码是否是正确的版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KU781gkg-1679204783618)(picture/性能调优/96602)]



GC日志

添加打印gc日志的参数,./gc-%t.log是文件路径 %t是时间,最多保留10个日志文件,每个日志文件达到100M就触发日志轮替

-Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:+PrintGCTimeStamps -XX:+PrintGCCause  
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M

我们实现来分析JDK8默认的Parallel垃圾收集器

java -jar -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:+PrintGCTimeStamps -XX:+PrintGCCause  
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M microservice-eureka-server.jar

生成的日志文件大概如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mVAjqCix-1679204783618)(picture/性能调优/80226)]

第一个红框中的内容是一些运行参数,下面几行就是触发MinorGC的日志,第二个红框中的是FullGC的日志。

FullGC打印的日志内容主要是

1、对于2.909: 这是从jvm启动开始计算到这次GC经过的时间,前面还有具体的发生时间日期。

2、Full GC(Metadata GC Threshold)指这是一次full gc,括号里是gc的原因, PSYoungGen是年轻代的GC,ParOldGen是老年代的GC,Metaspace是元空间的GC

3、 6160K->0K(141824K),这三个数字分别对应GC之前占用年轻代的大小,GC之后年轻代占用,以及整个年轻代的大小。

4、112K->6056K(95744K),这三个数字分别对应GC之前占用老年代的大小,GC之后老年代占用,以及整个老年代的大小。

5、6272K->6056K(237568K),这三个数字分别对应GC之前占用堆内存的大小,GC之后堆内存占用,以及整个堆内存的大小。

6、20516K->20516K(1069056K),这三个数字分别对应GC之前占用元空间内存的大小,GC之后元空间内存占用,以及整个元空间内存的大小。

7、0.0209707是该时间点GC总耗费时间。

为了避免元空间不足触发fullgc,然后动态调整元空间容量,我们可以在启动时添加下面参数指定元空间容量

-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M 

CMS垃圾收集器日志

-Xloggc:d:/gc-cms-%t.log -Xms50M -Xmx50M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+PrintGCDetails -XX:+PrintGCDateStamps  
 -XX:+PrintGCTimeStamps -XX:+PrintGCCause  -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M 
 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 

大部分还是上面的启动参数,为了更快触发fullGC将堆内存变小 -Xms50M -Xmx50M,并使用parnew和cms垃圾回收器-XX:+UseParNewGC -XX:+UseConcMarkSweepGC,然后在观察日志文件

G1

-Xloggc:d:/gc-g1-%t.log -Xms50M -Xmx50M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+PrintGCDetails -XX:+PrintGCDateStamps  
 -XX:+PrintGCTimeStamps -XX:+PrintGCCause  -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+UseG1GC 

我们还就可以解决日志分析工具来分析gc日志,比如gceasy



JVM参数汇总

# 表示打印出所有参数选项的默认值
java -XX:+PrintFlagsInitial 

# 表示打印出所有参数选项在运行程序时生效的值
java -XX:+PrintFlagsFinal 



常量池

常量池

java文件编译为class文件后,在class文件中就有一块是常量池,用来存放编译期生成的字面量和符号引用

一个class文件的16进制大体结构如下图:

​    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knjhShox-1679204783618)(picture/性能调优/80047)]

对应的含义如下,细节可以查下oracle官方文档

​    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oli6o7X4-1679204783618)(picture/性能调优/80124)]

当然我们一般不会去人工解析这种16进制的字节码文件,我们一般可以通过javap命令生成更可读的JVM字节码指令文件:

javap -v Math.class

​    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPvMmdDM-1679204783618)(picture/性能调优/80062)]

红框标出的就是class常量池信息,常量池中主要存放两大类常量:字面量和符号引用

字面量

就是数值或字符串,出现在等号右边

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值