Skywalking 采集 JVM 可观测最佳实践¶

本文详细介绍了JVM内存的各个组成部分,包括程序计数器、虚拟机栈、本地方法栈、方法区、堆和直接内存,以及线程的状态转换。同时,讲解了如何使用Skywalking进行JVM指标数据采集,以便在观测云中实现对JVM的可观测性。文章还列举了重要的性能指标,如CPU使用率、堆内存使用情况和线程状态统计等。

简介

JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是 Java Virtual Machine 的简称。Java 是一门抽象程度特别高的语言,提供了自动内存管理等一系列特性,所以就有了 JVM 这个抽象层,JVM 运行在操作系统之上,用来执行 java 字节码,这样 Java 就可以实现跨平台了。下面简要介绍一下 JVM 内存结构和线程,然后使用 Skywalking 采集 JVM 指标数据并通过观测云进行可观测。

JVM 内存结构

Java 编译器只面向 JVM,生成 JVM 能理解的字节码文件,JVM 中的类加载器加载字节码,加载完成交给 JVM 执行引擎执行。在整个类的加载过程中,JVM 会用一段空间来存储数据和相关信息,这段空间就是我们常说的 JVM 内存。根据 JVM 规范,JVM 内存共分为:

  • 程序计数器

用于记录下一条 JVM 指令的执行地址。

  • 虚拟机栈

每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存,用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用到执行完成,对应一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。可通过 -Xss 设置虚拟机栈内存大小。

  • 本地方法栈

功能和特点类似于虚拟机栈,不同的是,本地方法栈为本地方法服务。

  • 方法区

方法区是一个 JVM 规范,永久代与元空间都是其中一种实现方式,在 JDK8 之后,原来的永久代数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和字符串常量池等放入堆中。

堆区由所有线程共享,主要是存放对象实例和数组。可以位于物理上不连续的空间,但是逻辑上要连续。
堆内存分为年轻代(Young Generation)、老年代(Old Generation)。年轻代又分为 Eden 和 Survivor 区。Survivor 区由 FromSpace 和 ToSpace 组成。Eden 区占大容量,Survivor 两个区占小容量,默认比例是8:1:1。
如果在 Java 堆中没有内存完成实例分配,并且堆也无法再扩展时,Java 虚拟机将会抛出 OutOfMemoryError 异常。

  • 运行时常量池

运行时常量池是方法区的一部分,是一张表,虚拟机指令根据这种表找到要执行的类名、方法名、参数类型等信息。

  • 直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域。不会受到 Java 堆大小的限制,受到本机总内存大小限制。直接内存也用 -XX:MaxDirectMemorySize 指定,直接内存申请空间耗费更高的性能,直接内存 IO 读写的性能要优于普通的堆内存,耗尽内存抛出 OutOfMemoryError 异常。

Thre

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值