首页 > 其他分享 >Arthas JVM 调优工具

Arthas JVM 调优工具

时间:2023-05-04 16:35:59浏览次数:51  
标签:INFO java jvm -- Arthas 调优 内存 JVM arthas

阿里巴巴开源的一个 JVM 调优工具 —— arthas(阿尔萨斯)。

一、安装

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

如果下载速度太慢,可以用gitee上的源

curl -O https://arthas.gitee.io/arthas-boot.jar

二、启动

java -jar arthas-boot.jar 

arthas 在启动时会检测本机运行的 jvm 进程,然后让用户选择需要绑定的进程,后面的操作都是针对选定的进程的。

[INFO] Download arthas success.
[INFO] arthas home: C:\Users\MH\.arthas\lib\3.6.8\arthas
[INFO] Try to attach process 21752
[INFO] Found java home from System Env JAVA_HOME: D:\Java\JDK1.8_64
[INFO] Attach process 21752 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.6.8
main_class
pid        21752
time       2023-05-04 15:33:32

出现此页面 arthas 启动成功。

三、使用 Arthas 解决问题

3.1 CPU占用过高

## 列出线程详细信息
[arthas@21752]$ thread
Threads Total: 156, NEW: 0, RUNNABLE: 12, BLOCKED: 0, WAITING: 108, TIMED_WAITING: 21, TERMINATED: 0, Internal threads:
 15
ID         NAME                              GROUP                 PRIORITY   STATE      %CPU        TIME       INTERRUPTE DAEMON     
16         http-nio-8080-exec-2              main                  5          RUNNABLE   99          0:25       false      true       
29         Attach Listener                   system                9          RUNNABLE   0           0:0        false      true 
 
## 通过 thread + ID 输出该线程的栈信息定位问题
[arthas@2467]$ thread 16
"http-nio-8080-exec-2" Id=16 RUNNABLE
    at com.spareyaya.jvm.service.EndlessLoopService.service(EndlessLoopService.java:19)
    at com.spareyaya.jvm.controller.JVMController.endlessLoop(JVMController.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

3.2 死锁

## thread -b 检查死锁
[arthas@2997]$ thread -b
"Thread-3" Id=29 BLOCKED on java.lang.Object@3f20bf9 owned by "Thread-4" Id=30
    at com.spareyaya.jvm.service.DeadLockService.service1(DeadLockService.java:27)
    -  blocked on java.lang.Object@3f20bf9
    -  locked java.lang.Object@2fea801a <---- but blocks 1 other threads!
    at com.spareyaya.jvm.controller.JVMController.lambda$deadLock$0(JVMController.java:37)
    at com.spareyaya.jvm.controller.JVMController$$Lambda$456/748979989.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)

3.3 内存泄漏

用 dashboard 命令来动态查看内存情况,如果内存使用率在不断上升,而且 gc 后也不下降,后面还发现 gc 越来越频繁,很可能就是内存泄漏了。

这个时候我们可以直接用 heapdump 命令把内存快照 dump 出来,作用和 jmap 工具一样,然后把得到的 dump 文件使用 MAT 堆内存分析工具 MemoryAnalyzer.exe 分析

[arthas@23581]$ heapdump --live /root/jvm.hprof
Dumping heap to /root/jvm.hprof...
Heap dump file created

四、MAT工具使用

启动后可以通过顶部菜单的 File->Open Heap Dump... 来打开一个快照文件,也可以在welcome 界面中点击 Open a Heap Dump。如果你的快照文件特别大,需要调整jvm参数,在 windows 下修改 MemoryAnalyzer.ini 文件,把 -Xmx 参数的值设置成适合的值(默认是1024M)。

在Overview选择卡中,可以选择需要分析的内容。比如 Leak Suspects 分析可能的内存泄漏,Histogram 查看每个类的实例统计。

标签:INFO,java,jvm,--,Arthas,调优,内存,JVM,arthas
From: https://www.cnblogs.com/qqkkOvO/p/17371645.html

相关文章

  • 通常SQL调优过程
    观察,至少跑1天,看看生产的慢SQL情况。开启慢查询日志,设置阙值,比如超过5秒钟的就是慢SQL,并将它抓取出来。explain+慢SQL分析。showprofile。运维经理orDBA,进行SQL数据库服务器的参数调优。总结:1、慢查询的开启并捕获2、explain+慢SQL分析3、showprofile查询SQL在M......
  • jvm基础
     jvm中两个线程:1、守护线程:jvm自己使用的线程,比如垃圾回收(GC)就是一个守护线程2、普通线程:一般的java程序线程,只要JVM中有普通线程在执行,那么JVM就不会停止 结束生命周期在如下几种情况下,Java虚拟机将结束生命周期1、执行了System.exit()方法2、程序正常执行结......
  • 六、JVM-本地方法接口(基础篇)
    一、本地方法简单地讲,一个NativeMethod是一个Java调用非Java代码的接囗一个NativeMethod是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern告知C++编译器去调用一个C的函数。“Anat......
  • 三、JVM-运行时数据区概述及线程(基础篇)
    一、前言本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载->链接(验证->准备->解析->)->初始化这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后......
  • efcore性能调优
    性能调优——EFCore调优按下硬件、网络不提,我们单表从程序层面对系统的性能进行优化,翻来覆去无外乎三个方面缓存异步sql本片文章,我们针对.netcoreweb项目的efcore框架进行性能优化。1.EFCore框架已经本地缓存机制memorycache,所以我们访问一个接口,二次访......
  • JVM系列——java文件到JVM中的整个过程
    关注“Java后端技术栈“回复“面试”获取最新资料今天来聊聊从java文件到class文件,最后class文件是怎么到JVM中的。首先是编写一个HelloWorld.java类,然后通过这一系列的编译操作,最终成了HelloWorld.class文件。然后把HelloWorld.class文件加载到JVM中的整个过程:1,装载。查找和导入cl......
  • JVM系列——运行时数据区
    关注“Java后端技术栈”回复“面试”获取最新资料官网地址:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html摘要:对运行时数据区的介绍是:TheJavaVirtualMachinedefinesvariousrun-timedataareasthatareusedduringexecutionofaprogram.Someofthes......
  • 从原理聊JVM(三):详解现代垃圾回收器Shenandoah和ZGC
    作者:京东科技康志兴ShenandoahShenandoah一词来自于印第安语,十九世纪四十年代有一首著名的航海歌曲在水手中广为流传,讲述一位年轻富商爱上印第安酋长Shenandoah的女儿的故事。后来美国有一条位于Virginia州西部的小河以此命名,所以Shenandoah的中文译名为“情人渡”。Shenan......
  • 从原理聊 JVM(一):染色标记和垃圾回收算法
    1JVM运行时内存划分1.1运行时数据区域• 方法区属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。JDK1.8之前,Hotspot虚拟机对方法区的实现叫做永久代,1......
  • JVM笔记
    VM全称为Java虚拟机(JavaVirtualMachine),是Java程序的运行环境。它是一个抽象的计算机,能够在不同的操作系统上运行Java字节码(由Java源代码编译而来),实现了Java的一次编译、随处运行的特性。JVM除了提供基本的内存管理和垃圾回收功能外,还提供了类加载、字节码执行、异常处理、线程同......