Java性能分析工具Async-profiler(火焰图)使用

如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然。别慌,这里有一款低开销、自带火焰图、让你大呼好用的 Java 性能分析工具 - async-profiler。 最近 Arthas 性能分析工具上线了火焰图分析功能,Arthas 使用 async-profiler 生成 CPU/内存火焰图进行性能分析,弥补了之前内存分析的不足。在 Arthas 上使用还是比较方便的,使用方式可以看官方文档。这篇文章介绍 async-profiler 相关内容。 Arthas 火焰图官方文档:alibaba.github.io/arthas/prof… 如果你想了解更多 Arthas 信息,可以参考:Arthas - Java 线上问题定位处理的终极利器 async-profiler 介绍 async-profiler 是一款开源的 Java 性能分析工具,原理是基于 HotSpot 的 API,以微乎其微的性能开销收集程序运行中的堆栈信息、内存分配等信息进行分析。 使用 async-profiler 可以做下面几个方面的分析。 CPU cycles Hardware and Software performance counters like cache misses, branch misses, page faults, context switches etc. Allocations in Java Heap Contented lock attempts, including both Java object monitors and ReentrantLocks 我们常用的是 CPU 性能分析和 Heap 内存分配分析。在进行 CPU 性能分析时,仅需要非常低的性能开销就可以进行分析,这也是这个工具的优点之一。...

2022-02-10 · 4 分钟

Java面向对象

1. 类和对象 面向对象和面向过程的思想对比 : ​ **面向过程 :**是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 ​ **面向对象 :**是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1.1 类和对象的关系 客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合 简单理解:类就是对现实事物的一种描述 类的组成 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸) 行为:指事物能执行的操作,例如:手机事物(打电话,发短信) 类和对象的关系 类:类是对现实生活中一类具有共同属性和行为的事物的抽象 对象:是能够看得到摸的着的真实存在的实体 简单理解:类是对事物的一种描述,对象则为具体存在的事物 1.2 类的定义【应用】 类的组成是由属性和行为两部分组成 **属性:**在类中通过成员变量来体现(类中方法外的变量) **行为:**在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可) 类的定义步骤: ​ ① 定义类 ​ ② 编写类的成员变量 ​ ③ 编写类的成员方法 public class Student { // 属性 : 姓名, 年龄 // 成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外 String name; int age; // 行为 : 学习 // 成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字....

2022-02-08 · 4 分钟

Java Debug&进制&二维数组

1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。 1.2 Debug介绍与操作流程 如何加断点 选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可 如何运行加了断点的程序 在代码区域右键Debug执行 看哪里 看Debugger窗口 看Console窗口 点哪里 点Step Into (F7)这个箭头,也可以直接按F7 如何删除断点 选择要删除的断点,单击鼠标左键即可 如果是多个断点,可以每一个再点击一次。也可以一次性全部删除 2. 进制的介绍与书写格式 2.1 进制的介绍与书写格式 代码 : public class Demo1 { /* 十进制:Java中,数值默认都是10进制,不需要加任何修饰。 二进制:数值前面以0b开头,b大小写都可以。 八进制:数值前面以0开头。 十六进制:数值前面以0x开头,x大小写都可以。 注意: 书写的时候, 虽然加入了进制的标识, 但打印在控制台展示的都是十进制数据. */ public static void main(String[] args) { System....

2022-02-07 · 6 分钟

Java方法

1. 方法概述 1.1 方法的概念 ​ 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用 2. 方法的定义和调用 2.1 无参数方法定义和调用 定义格式: public static void 方法名 ( ) { // 方法体; } 范例: public static void method ( ) { // 方法体; } 调用格式: 方法名(); 范例: method(); 注意: ​ 方法必须先定义,后调用,否则程序将报错 2.2 方法的调用过程 总结:每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失。 2.3 方法练习-奇偶数判断 需求:判断一个数是奇数还是偶数 代码: public class Demo1Method { /* 带参数方法的定义格式: public static void 方法名 ( 参数 ) { … … } public static void 方法名 ( 数据类型 变量名 ) { … … } 带参数方法的调用格式: 方法名 ( 参数 ) ; 方法名 ( 变量名/常量值 ) ; tips: 参数可以是一个, 也可以是多个....

2022-02-07 · 6 分钟

Java数组

1.数组 1.1 数组介绍 ​ 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.2 数组的定义格式 1.2.1 第一种格式 ​ 数据类型[] 数组名 ​ 示例: int[] arr; double[] arr; char[] arr; 1.2.2 第二种格式 ​ 数据类型 数组名[] ​ 示例: int arr[]; double arr[]; char arr[]; 1.3 数组的动态初始化 1.3.1 什么是动态初始化 ​ 数组动态初始化就是只给定数组的长度,由系统给出默认初始化值 1.3.2 动态初始化格式 数据类型[] 数组名 = new 数据类型[数组长度]; int[] arr = new int[3]; 1.3.3 动态初始化格式详解 等号左边: int:数组的数据类型 []:代表这是一个数组 arr:代表数组的名称 等号右边: new:为数组开辟内存空间 int:数组的数据类型 []:代表这是一个数组 5:代表数组的长度 代码 :...

2022-02-07 · 5 分钟

Java循环

1. switch语句 1.1 分支语句switch语句 格式 switch (表达式) { case 1: 语句体1; break; case 2: 语句体2; break; ... default: 语句体n+1; break; } 执行流程: 首先计算出表达式的值 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。 1.2 switch案例-减肥计划 需求:键盘录入星期数,显示今天的减肥活动 周一:跑步 周二:游泳 周三:慢走 周四:动感单车 周五:拳击 周六:爬山 周日:好好吃一顿 示例代码: public static void main(String[] args){ // 1. 键盘录入星期数据,使用变量接收 Scanner sc = new Scanner(System....

2022-01-28 · 6 分钟

Java运算符

1 类型转换 在Java中,一些数据类型之间是可以相互转换的。分为两种情况:自动类型转换和强制类型转换。 1.1 隐式转换(理解) ​ 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。例如: double num = 10; // 将int类型的10直接赋值给double类型 System.out.println(num); // 输出10.0 ​ 类型从小到大关系图: 说明: 整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型。 byte b1 = 10; byte b2 = 20; byte b3 = b1 + b2; // 第三行代码会报错,b1和b2会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。 // 修改为: int num = b1 + b2; // 或者: byte b3 = (byte) (b1 + b2); boolean类型不能与其他基本数据类型相互转换。 1.2 强制转换(理解) ​ 把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。 ​ 强制类型转换格式:目标数据类型 变量名 = (目标数据类型)值或者变量; ​ 例如: double num1 = 5....

2022-01-27 · 7 分钟

Java环境搭建及入门

1. Java概述 1.1 Java语言背景介绍(了解) 语言:人与人交流沟通的表达方式 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford University Network)在1995年推出的计算机语言 Java之父:詹姆斯·高斯林(James Gosling) 2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com java语言的三个版本: ​ JavaSE: Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础 ​ JavaME: Java 语言的(小型版),用于嵌入式消费类电子设备 ​ JavaEE: Java 语言的(企业版),用于 Web 方向的网站开发 1.2 Java语言跨平台原理(理解) Java程序并非是直接运行的,Java编译器将Java源程序编译成与平台无关的字节码文件(class文件),然后由Java虚拟机(JVM)对字节码文件解释执行。所以在不同的操作系统下,只需安装不同的Java虚拟机即可实现java程序的跨平台。 1.3 JRE和JDK(记忆) JVM(Java Virtual Machine),Java虚拟机 JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API) JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具 总结:我们只需安装JDK即可,它包含了java的运行环境和虚拟机。 1.4 JDK的下载和安装(应用) 1.4.1 下载 通过官方网站获取JDK http://www.oracle.com 注意:针对不同的操作系统,需要下载对应版本的JDK。 1.4.2 安装 傻瓜式安装,下一步即可。但默认的安装路径是在C:\Program Files下,为方便统一管理建议修改安装路径,将与开发相关的软件都安装到一个目录下,例如:E:\develop。 注意:安装路径不要包含中文或者空格等特殊字符(使用纯英文目录)。 1.4.3 JDK的安装目录介绍 目录名称 说明 bin 该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。 conf 该路径下存放了JDK的相关配置文件。 include 该路径下存放了一些平台特定的头文件。 jmods 该路径下存放了JDK的各种模块。 legal 该路径下存放了JDK各模块的授权文档。 lib 该路径下存放了JDK工具的一些补充JAR包。 2....

2022-01-26 · 3 分钟

The server selected protocol version TLS10 is not accepted by client preferences [TLS12] 连接数据库报错

由于oracle jdk1.8_301扫描出漏洞,故升级jdk到openjdk 1.8.0_312,升级后出现兼容性问题,访问数据库出现以下错误 The server selected protocol version TLS10 is not accepted by client preferences [TLS12] 查询后为新版的 JDK 不推荐使用旧的 TLSV1.0 的协议,所以默认删除 TLS10 的支持导致,可按照下面方法修复 cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/jre cd lib/security/ vim java.security # 698行,将 TLSv1, TLSv1.1, 3DES_EDE_CBC 删除,删除后为以下内容 jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, anon, NULL, \ include jdk.disabled.namedCurves 再次访问,问题解决

2022-01-20 · 1 分钟