JVM 基础

目录

导图

总览

Java虚拟机运行时数据区

初识JVM

Java虚拟机的组成

字节码文件详解

正确打开字节码

字节码文件的组成

基础信息

常量池

方法

字节码常用工具的使用

类的生命周期

简介

加载阶段

连接阶段

验证

准备

解析

初始化阶段

类加载器

类加载器的分类

启动类加载器

默认加载器

双亲委派

机制

[打破双亲委派机制 *](#打破双亲委派机制 *)

自定义类加载器

线程上线文类加载器

Osgi框架的类加载器(了解)

JDK9之后的类加载器

总结

运行时数据区

程序计数器

局部变量表

操作数栈

栈内存溢出

堆内存

方法区

实现

字符串常量池

直接内存

总结

自动垃圾回收

介绍

方法区的回收

堆回收

引用计数法和可达性分析法

五种对象引用

软引用

弱引用

虚引用和终结器引用

垃圾回收算法

评价标准

标记回收算法

复制算法

标记整理算法

分代垃圾回收算法-GC算法*

垃圾回收器

预热

[Serial 垃圾回收器](#Serial 垃圾回收器)

[年轻代 PaNew 垃圾回收器](#年轻代 PaNew 垃圾回收器)

[老年代 CMS 垃圾回收器](#老年代 CMS 垃圾回收器)

[年轻代 Parallel Scavenge 垃圾回收器-JDK8默认](#年轻代 Parallel Scavenge 垃圾回收器-JDK8默认)

[老年代 Parallel Old 回收器-JDK8默认](#老年代 Parallel Old 回收器-JDK8默认)

[G1 垃圾回收器-JDK9默认](#G1 垃圾回收器-JDK9默认)



导图

总览

初识JVM

然后将字节码交给计算机执行

Java虚拟机的组成

字节码文件详解

正确打开字节码

jclasslib工具的Github地址 : https://github.com/ingokegel/jclasslib

字节码文件的组成

基础信息

常量池

方法

字节码常用工具的使用

Arthas功能很强大,具体功能和命令可到官网查看
Arthas(阿尔萨斯)官网文档: https://arthas.aliyun.com/doc/

类的生命周期

简介

加载阶段

在代码使用反射获取对象信息就是在方法区中拿的

方法区中的 InstanceKlass 是C++编写的,无法Java语音调用,在堆区中转成Java类型的;

每个类在方法区和堆区中都分别对应一个 InstanceKlass 对象和 java.lang.Class 对象;

InstanceKlass保存类的元数据,java.lang.Class 对象是根据InstanceKlass生成的,是一个简化版的 InstanceKlass(去除了一些对开发者无用的元数据)

连接阶段

验证
准备
解析

初始化阶段

静态块在类被加载时执行,并且只执行一次,输出D

main方法执行第一行,输出A

初始化类Test1,先执行其他代码块后执行构造方法,输出CB

又初始化类Test1,先执行其他代码块后执行构造方法,输出CB

类加载器

类加载器的分类

启动类加载器
默认加载器

双亲委派

机制

其实就是自底向上查找是否加载过,自顶向下加载

打破双亲委派机制 *
自定义类加载器

线程上线文类加载器

DriverManager 是JDK提供的

Osgi框架的类加载器(了解)

JDK9之后的类加载器

总结

运行时数据区

程序计数器

随着线程被销毁,线程不共享的内存也会被释放


字节码指令写字节码文件中,当文件被加载之后字节码指令就会被保存在内存中,而程序计数器就算记录下一次执行的字节码指令所在的内存地址

局部变量表

操作数栈

栈内存溢出

一般建议使用 -Xss 的方式设置

堆内存

方法区

实现

InstanceKlass 对象中的常量池和方法其实会额外开辟一个内存来存储,InstanceKlass对象只是存放了引用

字符串常量池


a + b 底层是 StringBuilder ,结果对象存放在堆中,所有上述代码结果是 false

而 "1" + "2" 在编译阶段会直接将其替换为 "12" , 而 "12" 在常量池冲存放,所有运行结果我 true

直接内存

当 jvm正在回收堆中对象的时候,如果用户正在使用我们的系统,可能会出现卡顿的情况

总结

**1、程序计数器:**每个线程会通过程序计数器记录当前要执行的的字节码指令的地址,程序计数器 可以控制程序指令的进行实现分支、跳转、异常等逻辑(不会出现内存泄漏)。

**2、虚拟机栈:**虚拟机栈采用栈的数据结构来管理 方法调用中的基本数据(局部变量、操作数等), 每一个方法的调用使用一个栈帧来保存。

**3、堆:**堆中存放的是创建出来的对象,这也是最容易产生内存溢出的位置。

**4、方法区:**方法区中主要存放的是类的元信息,同时还保存了常量池,JDK8是使用了元空间, 保存在直接内存。

自动垃圾回收

介绍

方法区的回收

堆回收

引用计数法和可达性分析法

五种对象引用

软引用
弱引用
虚引用和终结器引用

垃圾回收算法

评价标准
标记回收算法
复制算法
标记整理算法
分代垃圾回收算法-GC算法*

这个年轻代的GC用的是复制算法,这个S0和S1统称Survivor区

垃圾回收器

预热
Serial 垃圾回收器

年轻代 PaNew 垃圾回收器
老年代 CMS 垃圾回收器

只有在初始标记和重新标记中用户线程会停下来,且时间非常短

年轻代 Parallel Scavenge 垃圾回收器-JDK8默认
老年代 Parallel Old 回收器-JDK8默认
G1 垃圾回收器-JDK9默认


G1 垃圾回收器在 jdk8 相对成熟,但仍有不足之处,在 jdk9 中得到完善

相关推荐
终端行者15 小时前
K8s中部署Minio集群 如何部署minio集群
云原生·容器·kubernetes·1024程序员节
布朗克16816 小时前
MySQL 及 SQL 注入详细说明
数据库·sql·mysql·1024程序员节
wkj00116 小时前
安装了conda和uv如何创建一个项目?
chrome·conda·uv·1024程序员节
菜鸟una16 小时前
【微信小程序 + 消息订阅 + 授权】 微信小程序实现消息订阅流程介绍,代码示例(仅前端)
前端·vue.js·微信小程序·小程序·typescript·taro·1024程序员节
papership17 小时前
【入门级-算法-5、数值处理算法:高精度的减法】
算法·1024程序员节
好好研究18 小时前
JAVAEE知识整理之AJAX、JSON
ajax·java-ee·json·1024程序员节
隔壁程序员老王19 小时前
基于 Python 的坦克大战小程序,使用 Pygame 库开发
python·小程序·pygame·1024程序员节
F_D_Z19 小时前
SkyDiffusion:用 BEV 视角打开街景→航拍图像合成新范式
diffusion·sota·1024程序员节·bev·skydiffusion·视角变换·多图融合
技术小丁20 小时前
uni-app 广告弹窗最佳实践:不扰民、可控制频次、含完整源码
前端·uni-app·1024程序员节
AhriProGramming20 小时前
Python学习快速上手文章推荐(持续更新)
开发语言·python·学习·1024程序员节