JVM 双亲委派模型以及垃圾回收机制

news2024/12/16 2:59:50

目录

1. JVM 内存区域划分

2. JVM 中类加载的过程

1) 类加载的基本流程

2) 双亲委派模型

3. JVM 中垃圾回收机制

1) 找到垃圾

a) 引用计数

b) 可达性分析

2) 释放垃圾


1. JVM 内存区域划分

一个运行起来的 Java 进程,其实就是一个 JVM 虚拟机。

而进程是资源分配的基本单位,所以 JVM 就首先会申请一大块内存,然后把这个内存划分成不同的区域,每个区域都有不同的作用。

JVM 内存区域划分成以下四个部分:

1. 方法区 (1.7 及之前) / 元数据区 (1.8 开始)

方法区存储的内容,就是类对象。( .class 文件加载到内存之后,就成了类对象)

2. 堆

这里存储的内容,就是代码中 new 的对象。

堆是占据空间最大的区域。

3. 虚拟机栈(就是平常我们所说的栈)

这里存储的内容,就是代码执行过程中,方法之间的调用关系。

4. 程序计数器

是个比较小的空间,主要用来存放一个 "地址",这个地址,就表示了下一条要执行的指令,在内存中的哪个地方(方法区里)。

每个方法,里面的指令,都是以二进制的形式, 保存到类对象中的。

 刚开始调用方法的时候,程序计数器记录的就是方法的入口的地址。

随着一条一条的执行指令,每执行一条指令,程序计数器的值都会自动更新,去指向下一条指令。

程序计数器和虚拟机栈是每个线程都有一份,而堆和方法区在 JVM 进程中是只有一份的。

在 Java 里,每个线程都有自己私有的栈空间。

2. JVM 中类加载的过程

1) 类加载的基本流程

java 代码会被编译成 .class 文件(包含了一些字节码),java 程序想要运行起来,就需要让 JVM 读取到这些 .class 文件,并把里面的内容,构造成类对象,保存到内存的方法区中。 

官方文档把类加载的过程主要分成了 5 个步骤。

1. 加载:找到 .class 文件,打开文件,读取文件内容。

往往代码中,会给定某个类的 "全限定类名"(比如 java.lang.String,java.util.ArrayList) ,JVM 就会根据这个类名,在一些指定的目录范围内查找。

2. 验证: .class 文件是一个二进制的格式。(某个字节,都是有某些特定含义的),就需要验证你当前读到的这个格式是否符合要求。

3. 准备:给类对象分配内存空间(最终的目标,是要构造出类对象)

这里只是分配空间,还没有初始化,此时这个空间上的内存的数值,就是全 0 的,此时如果尝试打印类的 static 成员,就是全 0 的。

4. 解析:针对类对象中包含的字符串常量进行处理,进行一些初始化操作。

java 代码中用到的字符串常量,在编译之后,也会进入到 .class 文件中。

5. 初始化:针对类对象进行初始化。

把类对象中需要的各个属性都设置好。

还需要初始化号 static 成员

还需要执行静态代码块

以及可能还需要加载一下父类。

总结类加载的基本流程:

1. 加载:找到 .class 文件,打开 .class 文件,读取 .class 文件

2. 验证:验证当前 .class 文件格式是否正确

3. 准备:给类对象分配内存空间

4. 解析:将符号引用替换成直接引用

5. 初始化:初始化类对象

2) 双亲委派模型

属于类加载中第一个步骤 "加载" 中的一个环节,是负责根据全限定类名,来找到 .class 文件的。

类加载器,是 JVM 中的一个模块(专门负责类加载的操作)。

JVM 中,内置了三个类加载器:

1. BootStrap ClassLoader           爷

2. Extension ClassLoader           父

3. Application ClassLoader         子

这个父子关系,不是继承构成的,而是这几个 ClassLoader 里有一个 parent 这样的属性,指向了一个 父 "类加载器"。

程序员也可以手动创建出新的类加载器。

所以说,双亲委派模型,就是一个查找优先级的问题,先找标准库,再找扩展库,最后找第三方库。

3. JVM 中垃圾回收机制

在 Java 中,new 一个对象,就是 "动态内存申请",在 C 语言中,使用 malloc 这种 "动态内存申请" 的函数,使用完之后,就需要手动调用 free 释放内存,如果不释放,就会出现内存泄露这样的问题,而在 Java 中就不用手动释放内存,因为 JVM 自动判定,是否某个对象已经不再使用了,并帮我们进行释放不再使用的对象的内存了。像这种不再使用的对象,就称之为 "垃圾",这种机制,也就叫做 GC 垃圾回收机制。

GC 也有缺陷:

1. 系统开销,需要有一个/一些特定的线程,不停的扫描你内存中的所有的对象,看是否能够回收,此时是需要额外的内存和 CPU 资源的。

2. 效率问题,这样的扫描线程,不一定能够及时的释放内存 (扫描总是有一定周期的),一旦同一时刻,出现大量的对象都需要被回收,GC 产生的负担就会很大,甚至引起整个程序都卡顿 (STW 问题    stop   the   world)

但是 GC 属于大势所趋,Python,PHP,Go.... 都是具有 GC 机制的。

GC 是垃圾回收,GC 回收的目标,其实是 内存中的 对象。

对于 Java 来说,就是 new 出来的这些对象。

栈里的局部变量,是跟随着栈帧的生命周期走的。(方法执行结束,栈帧销毁,内存自然释放)

静态变量,生命周期就是整个程序,这就意味着 静态变量 是无需释放的。

因此真正需要 gc 释放的对象就是 堆 上的对象。

gc 可以理解成两个大的步骤:

1. 找到垃圾

2. 释放垃圾

1) 找到垃圾

在 GC 的圈子中,有两种主流的方案:1. 引用计数     2. 可达性分析 (Java 采用的是这种)

a) 引用计数

new 出来的对象,单独安排一块空间,来保存一个计数器。

b) 可达性分析

可达性分析,本质上是一个时间换空间这样的手段。

有一个/一组线程,周期性的扫描代码中的所有对象。

从一些特定的对象出发,尽可能的进行访问的遍历,把所有能够访问到的对象,都标记成 "可达",反之,经过扫描之后,未被标记成 "可达" 的对象,就是垃圾了。

就跟二叉树的遍历差不多,只不过不是二叉树,而是 N 叉树。

2) 释放垃圾

有三种基本的思路:

1. 标记清除

是一种比较简单粗暴的方式。

2. 复制算法

第二种思路,就是解决,刚刚标记清除出现的内存碎片的办法。

通过复制的方式,把有效的对象,归类到一起,再统一释放剩下的空间。

3. 标记整理

既能够解决内存碎片的问题,又能够处理复制算法中利用率。

类似于顺序表删除元素的搬运操作。

实际上,JVM 采取的释放思路,是上述基础思路的结合体。

分代回收:

分代回收,对象能活过的 GC 扫描轮次越多,就是越老。

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

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

相关文章

微信小程序跳转其他小程序以及跳转网站

一、跳转其他小程序 1.1 知道appid和页面路径 wx.navigateToMiniProgram({appId: appid, // 替换为目标小程序 AppIDpath: pathWithParams, // 小程序路径envVersion: release, // 开发版、体验版或正式版success(res) {console.log("跳转到其他小程序成功!&q…

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档: https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…

深度学习训练参数之学习率介绍

学习率 1. 什么是学习率 学习率是训练神经网络的重要超参数之一,它代表在每一次迭代中梯度向损失函数最优解移动的步长,通常用 η \eta η 表示。它的大小决定网络学习速度的快慢。在网络训练过程中,模型通过样本数据给出预测值&#xff0…

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务,你需要掌握:初始化线性表、销毁线性表、判定是否为空表、求线性…

利用ROS的Camera Calibration工具进行D435相机标定

一、安装ROS Camera Calibration sudo apt-get install ros-melodic-camera-calibration 二、安装realsense-ros 安装ROS Wrapper for Intel RealSense(realsense-ros) 三、启动数据读取节点 ctrlaltt打开终端 cd catkin_ws_ur source devel/setu…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能,这是一项用途广泛的创新工具,专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者,这项功能都能帮助快速生成、优化和编辑文案,提升效率的同时提高内容质量…

C# 网络编程--关于UDP 通信(二)

UDP (User Datagram Protocol) 是一种无连接的传输层协议,主要用于支持数据报文的传输。它的主要特点包括简单、高效、不保证可靠性和顺序。 1.UDP协议基本概念 1.udp基于IP的简单的协议,不可靠的协议 2.优点:简单、 轻量化、 传输速度高、…

Spring Boot 集成 MyBatis 全面讲解

Spring Boot 集成 MyBatis 全面讲解 MyBatis 是一款优秀的持久层框架,与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis,包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介 1. SqlSession …

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后,发起的请求显示[no cookies]jmeter问题复现:这里同样使用postman进行重试,发现是可以正常获取数据的&…

freeswitch(开启支持MCU视频会议,使用mod_av模块)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: 有些场景想使用视频会议MCU融合画面进行开会使用方法: 第一步:下载插件 yum install -y epel-release yum install

IntelliJ IDEA 使用技巧与插件推荐

目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统(VCS) 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…

Centos7环境下安装Flink1.20

目录 介绍1、涉及安装包2、节点3、修改hostname4、将flink安装包上传并解压5、修改配置文件6、修改masters和workers(所有节点)7、集群启停 介绍 Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的…

CTFHub 技能树 Web RCE eval执行(学习记录)

eval执行 源代码 <?php if (isset($_REQUEST[cmd])) {eval($_REQUEST["cmd"]); } else {highlight_file(__FILE__); } ?> PHP代码显示&#xff0c;要求将命令赋值给cmd然后执行 先查看一下根目录文件 /?cmdsystem("ls"); 查看上一级目录找flag文…

人员离岗监测摄像机智能人员睡岗、逃岗监测 Python 语言结合 OpenCV

在安全生产领域&#xff0c;人员的在岗状态直接关系到生产流程的顺利进行和工作环境的安全稳定。人员离岗监测摄像机的出现&#xff0c;为智能人员睡岗、逃岗监测提供了高效精准的解决方案&#xff0c;而其中的核心技术如AI识别睡岗脱岗以及相关的算法盒子和常见的安全生产AI算…

Web day11 SpringBoot原理

目录 1.配置优先级&#xff1a; 2.Bean的管理&#xff1a; bean的作用域&#xff1a; 第三方bean&#xff1a; 方案一&#xff1a; 方案二&#xff1a; SpringBoot原理&#xff1a; 扫描第三方包&#xff1a; 方案1&#xff1a;ComponentScan 组件扫描 方案2&#xff1…

ECharts柱状图-柱图2,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

VMware安装ubuntu22教程

文章目录 软件环境1、打开vmware&#xff0c;选择创建新的虚拟机2、选典型安装&#xff0c;然后点击下一步3、选择稍后安装操作系统&#xff0c;点击下一步4、版本选择Ubuntu 64位&#xff0c;点击下一步5、输入虚拟机名称和规划的安装盘符路径6、最大磁盘大小选择20G&#xff…

利用usb-cam包标定RealSense D435相机(未解决版)

一、 安装usb-cam包和标定数据包 usb_cam 包的主要作用是将 USB 摄像头的视频流转换为 ROS 可用的消息格式。 sudo apt-get install ros-melodic-usb-cam camera_calibration 包是 ROS 中用于相机标定的工具包&#xff0c;主要用于校准相机的内参和外参。 sudo apt-get ins…

Kafka系列教程 - Kafka 生产者 -2

1. 生产者简介 不管是把 Kafka 作为消息队列系统、还是数据存储平台&#xff0c;总是需要一个可以向 Kafka 写入数据的生产者和一个可以从 Kafka 读取数据的消费者&#xff0c;或者是一个兼具两种角色的应用程序。 使用 Kafka 的场景很多&#xff0c;诉求也各有不同&#xff…

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程&#xff0c;说白了&#xff0c;就是期望能通过一个程序判断一张图片是否为某个物体&#xff0c;或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题&#xff0c;因此主要处理 是 与 不是 的问题&#xff0c;比如我的模型是判断一张图片是否为苹果…