ArthasGC日志GCeasy详解

news2024/9/21 20:49:20

Arthas详解

Arthas是阿里巴巴在2018年9月开源的Java诊断工具,支持JDK6+,采用命令行交互模式,可以方便定位和诊断线上程序运行问题.Arthas官方文档十分详细.详见:官方文档

Arthas使用场景

在这里插入图片描述

Arthas使用

# github下载arthas
wget https://alibaba.github.io/arthas/arthas-boot.jar
# 或者 Gitee 下载
wget https://arthas.gitee.io/arthas-boot.jar

运行以下代码

package com.fanqiechaodan;

import java.util.HashSet;

/**
 * @author fanqiechaodan
 * @Classname ArthasDemo
 * @Description
 */
public class ArthasDemo {

    private static HashSet<String> HASH_SET = new HashSet<>();

    public static void main(String[] args) {
        // 模拟CPU过高
        cpuHigh();
        // 模拟线程死锁
        deadThread();
        // 不断的向HashSet增加数据
        addHashSetThread();
    }

    private static void addHashSetThread() {
        new Thread(()->{
            int count = 0;
            while (true){
                try {
                    HASH_SET.add("count:"+count);
                    Thread.sleep(1000);
                    count++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private static void deadThread() {
        Object lock1 = new Object();
        Object lock2 = new Object();
        new Thread(()->{
            synchronized (lock1){
                try {
                    System.out.println("thread1 start");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println("thread1 end");
                }
            }
        }).start();

        new Thread(()->{
            synchronized (lock2){
                try {
                    System.out.println("thread2 start");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("thread2 end");
                }
            }
        }).start();
    }

    private static void cpuHigh() {
        new Thread(()->{
            while (true){

            }
        }).start();
    }
}

运行Arthas

java -jar arthas-boot.jar

在这里插入图片描述

选择进程序号1,进入进程信息操作

在这里插入图片描述

输入dashboard可以查看整个进程的运行情况,线程,内存,GC,运行环境等信息:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

输入ognl查看静态字段的值

在这里插入图片描述

ongl还可以修改静态变量

在这里插入图片描述

更多命令可以用help命令查看,或者查看文档

GC日志详解

对于Java应用我们可以通过一些配置把程序运行过程中的GC日志全部打印出来,然后分析GC日志得到关键性指标,分析GC原因,调优JVM参数.

ParallelGC

打印GC日志方法,在JVM参数里增加参数,%t代表时间

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

Tomcat则直接加在JAVA_OPTS变量里.

在这里插入图片描述

CommandLine flags是项目的配置参数,这里不仅配置了打印GC日志,还有相关的JVM参数.

2024-05-06T20:17:01.133+0800: 9.079: [Full GC (Metadata GC Threshold) [PSYoungGen: 17029K->0K(611840K)] [ParOldGen: 96K->16294K(1398272K)] 17125K->16294K(2010112K), [Metaspace: 20743K->20743K(1067008K)], 0.0536606 secs] [Times: user=0.20 sys=0.01, real=0.05 secs] 

是在这个GC时间点发生GC之后相关GC情况

  • 9.079:这是从JVM启动开始计算到这次GC经过的时间,前面还有具体的发生时间日期
  • Full GC (Metadata GC Threshold): 指这是一次Full GC,括号里是GC的原因,PSYoungGen是年轻代的GC,ParOldGen是老年代的GC,Metaspace是元空间的GC
  • 17029K->0K(611840K): 这三个数字分别对应GC之前占用年轻代的大小,GC之后年轻代占用,以及整个年轻代的大小
  • 96K->16294K(1398272K): 这三个数字分别对应GC之前占用老年代的大小,GC之后老年代占用,以及整个老年代的大小
  • 20743K->20743K(1067008K): 这三个数字分别对应GC之前占用元空间内存的大小,GC之后元空间内存占用,以及整个元空间内存大小
  • 0.0536606 secs:是该时间点GC总耗费时间

从日志可以发现几次Full GC都是由于元空间不够导致的,所以我们可以将元空间调大点

-Xloggc:./GC-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+UseParallelGC -Xmx2048m -Xms2048m -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M

调整完我们再看下GC日志已经没有因为元空间不够导致的Full GC了

在这里插入图片描述

对于CMS和G1收集器的日志可能会有点不一样,也可以尝试打印对应的GC日志分析下.

package com.fanqiechaodan;

import java.util.ArrayList;
import java.util.List;

/**
 * @author fanqiechaodan
 * @Classname G1CMSDemo
 * @Description
 */
public class HeapDemo {

    /**
     * 100KB
     */
    byte[] BYTE = new byte[1024*100];

    public static void main(String[] args) throws InterruptedException {
        List<HeapDemo> heapDemoList = new ArrayList<>();
        while (true){
            heapDemoList.add(new HeapDemo());
            Thread.sleep(10);
        }
    }
}

CMS

-Xloggc:./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

在这里插入图片描述

这里的日志记录的就更为详细,每个CMS的阶段(初始标记,并发标记,重新标记,并发重置)都有涉及.

G1

-Xloggc:./G1-GC-%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  

在这里插入图片描述

GCeasy详解

以上的参数,能够帮我们查看分析GC的垃圾收集情况,但是如果GC日志很多很多,成千上万行.就算一目十行,看完了脑子也还是一片空白.所以我们可以借助一些东西来帮助我们分析.这里推荐GCeasy.可以上传GC文件,然后会利用可视化界面来展示GC情况.具体下图所示.

在这里插入图片描述

上图我们可以看到年轻代,老年代以及永久代的内存分配和最大使用情况

在这里插入图片描述

上图我们可以看到堆内存在GC之前和之后的变化.以及其他的信息

在这里插入图片描述

这个工具还提供基于机器学习的JVM只能优化建议.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony实战开发-如何使用Web组件加载页面

页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 加载网络页面…

计算机组成结构—高速缓冲存储器(Cache)

目录 一、Cache的基本工作原理 1.Cache工作原理 2.命中率 3.Cache的基本结构 4.Cache的改进 二、Cache和主存之间的映射方式 1.直接映射 2.全相联映射 3.组相联映射 三、Cache中主存块的替换算法 四、Cache的写策略 概为了解决 CPU 和主存之间速度不匹配的问题&#x…

(读书笔记-大模型) LLM Powered Autonomous Agents

目录 智能体系统的概念 规划组件 记忆组件 工具组件 案例研究 智能体系统的概念 在大语言模型&#xff08;LLM&#xff09;赋能的自主智能体系统中&#xff0c;LLM 充当了智能体的大脑&#xff0c;其三个关键组件分别如下&#xff1a; 首先是规划&#xff0c;它又分为以下…

成语:势如破竹、迎刃而解;明以前唯一同时入选文庙、武庙的牛人

千古流芳、身后能够进入文庙或武庙&#xff0c;是古人最高的荣誉&#xff0c;也是读书人和武将终极的追求&#xff0c;所谓的青史留名&#xff0c;享受万代祭祀、千秋敬仰&#xff0c;甚至都可以称之为圣人&#xff0c;但历史上&#xff0c;却有两人文武兼备、同时入选了文庙与…

RESTFul风格设计和实战

四、RESTFul风格设计和实战 4.1 RESTFul风格概述 4.1.1 RESTFul风格简介 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量级的通信协议&#x…

多目标转化依赖DBMTL与AIT区别

DBMTL&#xff1a;通过前序目标输出作为后序目标输入刻画概率转移关系&#xff0c;概率关系的刻画是通过MLP来刻画的&#xff1b;目标之间如果存在内在联系&#xff0c;稀疏目标能利用非稀疏目标中的信息&#xff0c;得到特殊收益&#xff1b; DBMTL与ESMM区别&#xff1a;直接…

Socket学习记录

本次学习Socket的编程开发&#xff0c;该技术在一些通讯软件&#xff0c;比如说微信&#xff0c;QQ等有广泛应用。 网络结构 这些都是计算机网络中的内容&#xff0c;我们在这里简单回顾一下&#xff1a; UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission Contr…

04-18 周四 为LLM_inference项目配置GitHub CI过程记录

04-18 周四 为LLM_inference项目配置GitHub CI过程记录 时间版本修改人描述2024年4月18日10:30:13V0.1宋全恒新建文档 简介和相关文档 04-15 周一 GitHub仓库CI服务器配置过程文档actions-runner 是托管与GitHub上的仓库&#xff0c;下载最新的客户端程序即可。self hosted r…

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

考研数学|基础跟张宇,强化直接1000题还是先做660?

跟宇哥用1000题的&#xff0c;我愿称之为卷王之王&#xff01;660对基础阶段是绝佳的查漏补缺&#xff0c;必做&#xff01; 自我介绍一下&#xff1a;我21年一战数学83&#xff0c;总分没过线&#xff0c;22年二战143&#xff0c;逆袭上岸211&#xff01;660是我的心头好&…

Python测试框架Pytest的参数化详解

上篇博文介绍过&#xff0c;Pytest是目前比较成熟功能齐全的测试框架&#xff0c;使用率肯定也不断攀升。 在实际工作中&#xff0c;许多测试用例都是类似的重复&#xff0c;一个个写最后代码会显得很冗余。这里&#xff0c;我们来了解一下pytest.mark.parametrize装饰器&…

【intro】图卷积神经网络(GCN)-续

本文为【intro】图卷积神经网络&#xff08;GCN&#xff09;-CSDN博客后续&#xff08;因为经验告诉我超过2w字编辑器就会卡……&#xff09; 第一部分还是进一步再看看GCN 图卷积神经网络GCN_哔哩哔哩_bilibili 回顾 图神经网络的基本原理就是把图中的节点编码映射成一个低…

4.堆_树(汇总版)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关定义 1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树 2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 3.二叉树的顺序结构及实现 3.1 二叉树的顺序结构--堆 3.2 堆的实现 3.2.1打印 3.2.2 …

怎么通过Java语言实现远程控制无人售货柜

怎么通过Java语言实现远程控制无人售货柜呢&#xff1f; 本文描述了使用Java语言调用HTTP接口&#xff0c;实现控制无人售货柜&#xff0c;独立控制售货柜、格子柜的柜门。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi控…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

2024.05.06作业

自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 #include "yuanshen.h"yuanshen::yuanshen(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(1600,910);this->setFixedSize(1600,910);//窗口标题this-…

vue3中标签的ref属性

组合API-ref属性 在vue2.x中&#xff0c;可以通过给元素添加refxxx属性&#xff0c;然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的&#xff0c;因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取。 目标&#xff1a;掌握使用re…

java基础之Netty(主要用来开发像微信,qq等聊天软件)

一、Netty的定义 Netty是一个基于Java NIO的网络编程框架&#xff0c;提供了一套高效的、事件驱动的异步网络通信机制。简化了网络应用程序的开发过程&#xff0c;提供了可靠的、高性能的网络传输 二、Netty的特点是什么 异步和事件驱动&#xff1a;Netty使用异步的、非阻塞…

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

【C++】命名空间namespace

为什么要有namespace&#xff1f; namespace是用来解决命名冲突&#xff08;名字污染&#xff09;的问题的。看看下面的代码&#xff1a; #include <cstdlib>int rand 10;int main() {return 0; }可以看到&#xff0c;这段代码什么都没干&#xff0c;就定义了一个全局…