Java飞行记录器

news2024/11/25 4:45:46

目录

  • JFR和JMC
  • 启动飞行记录
  • 用JFR对比不同GC器
  • 运行结果
  • 记录结果
    • GC配置
    • GC Summary
    • 垃圾收集

JFR和JMC

JFR全称为Java Flight Recorder,即Java飞行记录器
JMC全称为JDK Mission Control,即JDK任务控制
先贴一段官网的简介:

Java Flight Recorder and JDK Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis.
Java飞行记录器和JDK任务控制一起创建了一个完整的工具链,以持续收集低级别和详细的运行时信息,从而支持事后事件分析。

Java Flight Recorder is a profiling and event collection framework built into the Oracle JDK.
It allows Java administrators and developers to gather detailed low level information about how the Java Virtual Machine (JVM) and the Java application are behaving.
Java飞行记录器是一个内置在Oracle JDK中的分析和事件收集框架。
它允许Java管理员和开发人员收集关于Java虚拟机(JVM)和Java应用程序如何行为的详细底层信息。

JDK Mission Control (JMC) is a production-time profiling and diagnostics tool.
It includes tools to monitor and manage your Java application with a very small performance overhead, and is suitable for monitoring applications running in production.
JDK Mission Control is an advanced set of tools that enables efficient and detailed analysis of the extensive of data collected by Java Flight Recorder.
The tool chain enables developers and administrators to collect and analyze data from Java applications running locally or deployed in production environments.
JDK任务控制(JMC)是一个生产时间分析和诊断工具。
它包括用于监控和管理Java应用程序的工具,并且适用于监控在生产中运行的应用程序。
JDK任务控制是一套先进的工具,能够对Java飞行记录器收集的大量数据进行高效和详细的分析。
该工具链使开发人员和管理员能够从本地运行或部署在生产环境中的Java应用程序中收集和分析数据。

可见,JFR用来记录和收集Java运行时的数据和事件;JMC是分析和诊断工具,可用来打开和分析JFR文件

启动飞行记录

  1. 官网下载JMC8.3.1
  2. 启动一个Java程序
  3. 打开jmc.exe,选择一个Java程序->右键->启动飞行记录
    在这里插入图片描述
    可选择记录时间,默认是1分钟
    在这里插入图片描述
    可以看到正在记录,并有倒计时
    在这里插入图片描述
  4. 记录完成后,会生成.jfr后缀文件,可用JMC打开

用JFR对比不同GC器

代码如下:

public class Test {
    public static void main(String[] args) {
        // 记录线程编号
        AtomicInteger threadNo = new AtomicInteger(1);
        // 主线程池
        ScheduledExecutorService gcExecutor = Executors.newScheduledThreadPool(5);
        // 监控主线程池的线程池,用来停止主线程池
        ExecutorService monitorExecutor = Executors.newSingleThreadExecutor();
        long start = System.currentTimeMillis();

        monitorExecutor.execute(() -> {
            // 主线程池运行70秒
            while (System.currentTimeMillis() - start < 70 * 1000) {
                try {
                    TimeUnit.MILLISECONDS.sleep(100L);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            // 停止主线程池
            gcExecutor.shutdownNow();
        });
        monitorExecutor.shutdown();

        for (int i = 0; i < 1_000_000; i++) {
            gcExecutor.execute(() -> {
                Thread.currentThread().setName("-gc-thread-" + threadNo.getAndIncrement());
                System.out.println(Thread.currentThread().getName() + "\tstart");
                // 疯狂创建对象,触发GC
                for (int k = 0; k < 1_000_000; k++) {
                    if (gcExecutor.isTerminated()) {
                        return;
                    }
                    new GcObj(k);
                }
                System.out.println(Thread.currentThread().getName() + "\tfinish");
            });
        }

        while (!gcExecutor.isTerminated()) {
        }
        System.out.println(System.currentTimeMillis() - start + "ms");
    }

    @AllArgsConstructor
    private static class GcObj {
        private final int i;
    }
}

分别用下面3种组合运行程序,启动飞行记录:

  • JDK:1.8.0_371,GC:CMS
  • JDK:17.0.7,GC:G1,-XX:+UseG1GC
  • JDK:17.0.7,GC:ZGC,-XX:+UseZGC

运行结果

在这里插入图片描述
可见,CMS在70秒内只处理了3W+个线程,而G1和ZGC则可以处理56W+个线程,CMS在GC的STW上消耗了大量时间

记录结果

GC配置

在这里插入图片描述

GC Summary

在这里插入图片描述
可见,CMS的GC时间=STW时间,G1和ZGC的STW时间远小于GC时间,也验证了存在与应用程序并行的GC阶段,效率大大提高

垃圾收集

在这里插入图片描述
Allocation Failure
Ergonomics
G1 Evacuation Pause
G1 Humongous Allocation
Warmup

作者:曼特宁

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

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

相关文章

基于鸿蒙系统的智能衣柜管理系统设计与实现_kaic

摘 要 随着城市的扩大与科学技术的发展&#xff0c;人们逐渐开始关注衣柜功能的改进&#xff0c;存储效果的优化和智能使用的升级。个性化、功能化、智能化的衣柜将出现在人们的家庭生活中&#xff0c;并且起到重要作用。 为了满足当前人们对智能衣柜的需求&#xff0c;本设计…

面试真的被问麻了......

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

Java -并发(多线程)-Interview面试题收集

1、多线程并发 1&#xff09;多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 锁升级原理&#xff1a;在锁对象的对象头里面有一个 threadid 字段&#xff0c;在第一次访问的时候 threadid 为空&#xff0c;jvm 让其持有偏向锁&#xff0c;并将 threadid…

Mabatis Plus 之ID生成策略控制(Auto、Input、assign_id、assign_uuid)

文章目录 知识点1&#xff1a;TableId1 环境构建2 代码演示AUTO策略步骤1:设置生成策略为AUTO步骤2:删除测试数据并修改自增值步骤3:运行新增方法 INPUT策略步骤1:设置生成策略为INPUT步骤2:添加数据手动设置ID步骤3:运行新增方法 ASSIGN_ID策略步骤1:设置生成策略为ASSIGN_ID步…

HTTPS的工作流程

hi,大家好,好久不见,今天为大家带来HTTPS协议的工作流程 认识HTTPS 加密是什么 HTTPS的工作流程 1.认识HTTPS HTTPS也是应用层协议,让我们再来回忆一下TCP/IP五层协议模型 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP协议在传输的时候是以…

2023河海大学838计算机学硕考研高分经验分享

大家好&#xff0c;我是陪你考研每一天的大巴学长。 大巴学长为大家邀请到了2023年838计算机学硕初试第二名的高分学长&#xff0c;为大家分享一下他的考研经验&#xff0c;经验里详细介绍了各科的复习方法&#xff0c;很有参考意义。 希望对大家有所借鉴和帮助&#xff0c;在…

C++13-STL模板-01向量(vector)

C13-STL模板 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 大纲要求 【 3 】算法模板库中的函数&#xff1a;min、max、swap、sort 【 4 】栈 (stack)、队列 (queue)、链表 (list)、 向量&#xff08;vector&#xff09;等容器 1.函数模板 泛…

HNU数据结构与算法分析-作业1-算法分析

1. (简答题) 1.&#xff08;教材3.4&#xff09;&#xff08;a&#xff09;假设某一个算法的时间代价为 &#xff0c;对于输入规模n&#xff0c;在某台计算机上实现并完成该算法的时间为t秒。现在另有一台计算机&#xff0c;运行速度为第一台的64倍&#xff0c;那么t秒内新机器…

FreeRTOS(5)----互斥量

一&#xff0c;互斥信号量 互斥信号量是一个具有优先级继承的二值信号量&#xff0c;在同步的应用中二值信号量最合适。互斥信号量适合互斥访问的那些应用。在互斥访问中互斥信号量相当于一个钥匙&#xff0c;当一个任务使用这个资源&#xff0c;资源就会被上锁&#xff0c;防…

[CTF/网络安全] 攻防世界 robots 解题详析

[CTF/网络安全] 攻防世界 robots 解题详析 robots.txt姿势总结 题目描述&#xff1a;X老师上课讲了Robots协议&#xff0c;小宁同学却上课打了瞌睡&#xff0c;赶紧来教教小宁Robots协议是什么吧。 进入靶机&#xff0c;页面空白。 查看页面源代码&#xff1a; 再次结合题目Rob…

Java常用工具之StringUtils类

目录 一、字符串判空二、分隔字符串三、判断是否为纯数字四、将集合拼接成字符串五、其他方法 字符串&#xff08;String&#xff09;在我们的日常工作中&#xff0c;用得非常非常非常多。 在我们的代码中经常需要对字符串判空&#xff0c;截取字符串、转换大小写、分隔字符串、…

chatgpt赋能Python-python3_取模

Python3 取模&#xff1a;介绍与使用 在Python3中&#xff0c;取模运算是比较常用的运算符。本文将介绍Python中的取模运算符&#xff0c;并分享多种使用取模运算符的方法。 什么是取模运算符 在数学上&#xff0c;取模运算是将一个整数除以另一个整数&#xff0c;然后返回相…

后端传到前端的JSON数据大写变小写--2023

问题复现&#xff1a;1. 首先我先说一下&#xff0c;我用了lombok&#xff0c;事实证明和这个也有关系 前端这里写的也是按照驼峰命名来写的 控制台打印出来的数据 后台打印出来的数据 解决方法&#xff1a; 1. 重写get/set方法 因为我在实体类上标注了Data注解 重写get/se…

电动力学专题:闵氏几何(伪欧几何)

相对性原理和光速不变 物理定律在所有的惯性参考系里都是平等的&#xff0c;不存在一个特殊的惯性系。真空中的光速在所有的惯性系里都是一样的。 洛伦兹变换 距离度量&#xff1a;闵氏(Mins geometry) 狭义相对论下&#xff0c;不随惯性系变化的量闵式距离&#xff08;时空间…

HNU数据结构与算法分析-作业2-线性结构

1. (简答题) 4.1 假设一个线性表包含下列元素&#xff1a; <|2,23,15,5,9> 使用Shaffer编写的教材《数据结构与算法分析》的List ADT编写一些C语句&#xff0c;删除值为15的元素。 &#xff08;要求&#xff1a;采用C或C语言描述算法&#xff09; 4.6 使用Shaffer编写…

[CTF/网络安全] 攻防世界 cookie 解题详析

[CTF/网络安全] 攻防世界 cookie 解题详析 HTTP响应的查看方法method 1method 2 总结 题目描述&#xff1a;X老师告诉小宁他在cookie里放了些东西&#xff0c;小宁疑惑地想&#xff1a;这是夹心饼干的意思吗&#xff1f; 根据提示&#xff0c;获取页面Cookie中的数据即可 页面提…

学生成绩信息管理系统

系列文章 任务2 学生成绩信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试score.txtbk.txt界面展示显示所有学生信息添加学生信息删…

【数据结构】数据结构中的栈

文章目录 前言什么是栈栈的实现栈的初始化入栈出栈栈的判空栈内有效数据个数返回栈顶数据栈的销毁 前言 该篇文章来了解数据结构中的栈&#xff0c;栈与队列都为一种线性存储结构&#xff0c;同时栈与队列在逻辑结构上&#xff0c;都只能在头或者尾进行对数据的操作&#xff1…

25 KVM管理虚拟机-虚拟机安全启动

文章目录 25 KVM管理虚拟机-虚拟机安全启动25.1 总体介绍25.1.1 概述25.1.2 功能说明25.1.3 约束限制 25.2 安全启动实践25.2.1 虚拟机配置25.2.2 证书导入25.2.3 安全启动观测 25 KVM管理虚拟机-虚拟机安全启动 25.1 总体介绍 25.1.1 概述 安全启动&#xff08;Secure Boot…

基于JAVA的高校宿舍管理系统的设计与实现(论文+源码)_kaic

目 录 1 绪论 1.1 研究背景 1.2 研究目的和意义 1.3 课题任务 1.4 本文结构 2 开发工具及技术介绍 2.1 开发工具介绍 2.2 开发技术介绍 3 系统分析 3.1 可行性分析 3.2 需求分析 4 系统设计 4.1 系统结构设计 4.2 系统功能模块设计 4.3 业务时序设计 4.4 住宿流程设计 4.5 数…