当前位置: 首页 > news >正文

JVM及其垃圾回收机制(GC)

目录

一.JVM内存区域划分

二.JVM类加载机制

类加载过程

类加载的时机

双亲委派模型

三.JVM垃圾回收机制(GC)

GC工作过程

1.找到垃圾/判断垃圾

(1)引用计数【python/PHP】

(2)可达性分析【Java】

2.对象释放

(1)标记清除算法

(2)复制算法

(3)标记整理算法

(4)分代回收算法


JVM即Java虚拟机

一.JVM内存区域划分

JVM是一个应用程序,要从操作系统里申请内存。在启动的时候,会申请到一个很大的内存区域。JMV要根据需要,把整个空间分成几个部分,每个部分各自有不同的功能作用。

此处的栈,不是数据结构中的栈(后进先出),这里的栈是JVM的一个特定空间。对于JVM虚拟机,用来存储native方法之间的调用关系;对于本地方法栈,存储的是native方法之间的调用关系。

栈空间的内部包含多个元素,每个元素表示一个方法。每个元素称为一个“栈帧”,一个栈帧中包含这个方法的入口地址、参数、返回地址、局部变量.....

方法区:一个进程里只有一块,多个线程共用这一块

:每个线程有一份,每个进程有N个

:每个进程有N个

每个线程用自己的栈,多个线程用同一个堆。

基本原则:

1.局部变量在栈上

2.普通成员变量在堆上

3.静态成员变量在方法区(元数据区)

二.JVM类加载机制

类加载就是.class文件,从文件(硬盘)被加载到内存中(元数据区)的过程。

类加载过程

记忆:

加载:找到.class文件,读取文件内容

验证:根据jvm虚拟机规范,检查.class文件的格式是否符合要求

准备:给类对象分配内存空间(此时内存初始化全成0)

解析:对字符串常量进行初始化,把符号引用转换成直接引用。

初始化:调用构造方法,对类对象里的内容进行初始化。加载父类,执行静态代码块。

类加载的时机

不是Java程序一运行就把所有的类加载了,而是正真用到才加载。

1.构造类的实例

2.调用这个类的静态方法/使用静态属性

3.加载一个子类就需要先加载其父类

双亲委派模型

描述的是这个加载,找.class文件的基本过程

JVM默认提供了三个类加载器

首先加载一个类的时候,是先从ApplicationClassLoader开始,一层一层往上委托给自己的父亲。当没有父亲/父亲加载完,没有上级的类,才由本层进行加载。当轮到BootstrapClassLoader进行加载时,它会负责搜索自己负责的标准库相关的类,如果找到就加载。如果没有找到就继续由子类加载器加载。

这个顺序最主要的目的就是为了保证Bootstrap能够先加载,Application能够后加载。这样的机制可以保证当用户在自己的代码中创建了一个和标准库相同名字的类的时候,不会让jvm已有的代码混乱。

三.JVM垃圾回收机制(GC)

垃圾:不再使用的内存

垃圾回收机制:把不用的内存自动释放

GC主要针对堆进行释放的。GC是以“对象”为基本单位,进行回收的。

GC回收的是整个对象都不再使用的情况。

GC工作过程

1.找到垃圾/判断垃圾

判断对象是否有“引用”指向它。Java中是通过引用来使用对象的。如果一个对象没有引用指向了,就不会再被使用了。

(1)引用计数【python/PHP】

给每个对象分配了一个计数器,每次创建一个引用指向该对象,计数器+1;每次引用被销毁,计数器减-1。

局限:

1)内存空间浪费多,每个对象都需要分配一个计数器。(当对象本身很小时,多一个计数器的空间,会使空间的利用率大大降低)

2)存在循环引用的问题。(当两个对象相互指向时,此时销毁一个对象,两个对象的计数器都-1,但实际上销毁一个对象,另外的一个对象也会不存在)

(2)可达性分析【Java】

前提:Java中的对象都是通过引用来指向访问的。Java中的对象通过链式/树形结构,整体串起来(类比定义一个二叉树)

可达性分析,就是把所有这些对象被组织的结构视为是树,从根节点出发,遍历树,所有能被访问到的对象,标记为“可达”(不能访问到的就标记为“不可达”)

jvm通过上述遍历,把不可达的作为垃圾进行回收。

2.对象释放

(1)标记清除算法

简单粗暴,把标记的垃圾清除掉。但是被释放的空闲空间是零散的,不是连续的。

而申请内存时要求的是连续的空间。(总的空闲空间很大,但是每个具体的空间都很小,可能导致在申请较大一点的内存的时候就申请失败了)

(2)复制算法

复制算法解决的就是上述标记清除算法带来的“内存碎片”问题

缺点:

1.空间利用率低

2.如果垃圾比较少,有效对象多,复制成本就比较大

(3)标记整理算法

保证了空间利用率,同时也解决了内存碎片。但是效率并不高,搬运空间大时,效率会降低。

上述的三种算法,都有各自的缺点。所以把垃圾回收分成不同的场景,让三种算法对应不同的需求,扬长避短。为此提出了分代回收算法。

(4)分代回收算法

根据生命周期的长短,分别使用不同的算法。给对象引入“年龄”这个概念(年龄:熬过GC的轮次,经历一轮可达性分析的遍历,判断是否是垃圾)

年龄越大,这个对象存在的时间越久。

伊甸区到幸存区:复制算法

幸存区之后,也要周期性的接受GC的考验。如果变成垃圾就要被释放,如果不是垃圾就被拷贝到另外一个幸存区。俩个幸存区同一个时刻只用一个,两者之间来回拷贝。幸存区的体积不大,空间浪费也就不大。

两个幸存区之间:复制算法

如果对象在俩个幸存区之间已经来回拷贝许多次,这个时候就要进入老年代。老年代也要周期性扫描,,但是频率会更低。

老年代对象是垃圾时,使用标记整理的方式进行释放。

相关文章:

JVM及其垃圾回收机制(GC)

目录 一.JVM内存区域划分 二.JVM类加载机制 类加载过程 类加载的时机 双亲委派模型 三.JVM垃圾回收机制(GC) GC工作过程 1.找到垃圾/判断垃圾 (1)引用计数【python/PHP】 (2)可达性分析【Java】 2.对象释放…...

友元的三种实现

友元的三种实现 全局函数做友元类做友元成员函数做友元 #include <iostream> #include <string> using namespace std;//友元的三种实现 // //* 全局函数做友元 //* 类做友元 //* 成员函数做友元class Building {//告诉编译器 goodGay全局函数 是 Building类的好…...

聊聊logback的DuplicateMessageFilter

序 本文主要研究一下logback的DuplicateMessageFilter TurboFilter ch/qos/logback/classic/turbo/TurboFilter.java public abstract class TurboFilter extends ContextAwareBase implements LifeCycle {private String name;boolean start false;/*** Make a decision …...

WordPress 文档主题模板Red Line -v0.2.2

此主题作为框架&#xff0c;做承载第三方页面之用&#xff0c;例如飞书文档等&#xff0c; 您可以将视频图片等资源放第三方文档上&#xff0c;通过使用此主题做目录用。 此主题使用前后端分离开发&#xff0c;也使用了一些技术尽量不影响正常的SEO&#xff0c;还望注意。 源码…...

网络和Linux网络_1(网络基础)网络概念+协议概念+网络通信原理

目录 1. 网络简介 1.1 独立模式和互联网络模式 1.2 局域网LAN和广域网WAN 2. 协议和协议分层 2.1 协议的作用 2.2 协议分层 2.3 OSI七层模型 3.2 TCP/IP四层(五层)模型 3. 网络通信原理 3.1 协议报头 3.2 局域网和解包分用 3.3 广域网和跨网络 4. 网络中的地址 4…...

AI生成PPT工具——Gamma,结合GPT生成不错的效果

AI生成PPT工具——Gamma&#xff0c;结合GPT生成不错的效果 先告诉GPT我现在要参加一个比赛&#xff0c;请他帮忙梳理一下内容。当然整个过程需要不断调整&#xff0c;GPT生成的内容也不是一次就是最好的 不断调整之后让其列出提纲即可&#xff0c;如下&#xff1a; 紧接着我们…...

DcatAdmin使用模版文件时模板标签不生效

伪源码 PHP代码如下 public function 方法名(){return view(view_dir.view_name,[key1>value1]); }模版代码如下 <tr><td>键名</td> </tr> <tr><td>{{ $key1 }}</td> </tr>现象&#xff1a; 页面htmlt元素正常展示&…...

【算法】算法题-20231114

这里写目录标题 一、LCR 181. 字符串中的单词反转二、557. 反转字符串中的单词 III三、344. 反转字符串四、给定一个已按照升序排列的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。五、力扣第49题&#xff1a;字母异位词分组 一、LCR 181. 字符串中的单词反转 …...

时序数据库 TDengine + 高级分析软件 Seeq,助力企业挖掘时序数据潜力

作为一款制造业和工业互联网&#xff08;IIOT&#xff09;高级分析软件&#xff0c;Seeq 支持在工艺制造组织中使用机器学习创新的新功能。这些功能使组织能够将自己或第三方机器学习算法部署到前线流程工程师和主题专家使用的高级分析应用程序&#xff0c;从而使单个数据科学家…...

【Rust 日报】2023-11-12 socketioxide

gosub.io正在尝试用Rust构建一个Web浏览器 一个html5的分词器/解析器&#xff0c;正在成为浏览器的项目。 GoSub是Gateway to Optimized Searching and Unlimited Browsing的简称&#xff0c;目前还处于极早期阶段。 GitHub: https://github.com/gosub-browser socketioxide 0.…...

Redis快速入门(基础篇)

简介&#xff1a; 是一个高性能的 key-value数据库。 存在内存中 与其他 key-value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类…...

(三)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…...

SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)

SpringBoot整合mongodb 实现步骤&#xff1a; pom文件导坐标 <!--mongo--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency&g…...

matlab 二自由度操纵稳定性汽车模型

1、内容简介 略 19-可以交流、咨询、答疑 二自由度操纵稳定性汽车模型 二自由度、操纵稳定性、操纵动力学 2、内容说明 1 模型假设 忽略转向系的影响&#xff0c;以前、后轮转角作为输入&#xff1b;汽车只进行平行于地面的平面运动&#xff0c;而忽略悬架的作用&#xf…...

超越任务调度的极致:初探分布式定时任务 XXL-JOB 分片广播

XXL-JOB 是一个分布式任务调度平台&#xff0c;支持分片任务执行。 1. 依赖引入 在项目中引入 XXL-JOB 的相关依赖。通常&#xff0c;你需要在项目的 pom.xml 文件中添加如下依赖&#xff1a; <dependency><groupId>com.xuxueli</groupId><artifactId&…...

设计模式-备忘录模式(Memento)

设计模式-备忘录模式&#xff08;Memento&#xff09; 一、备忘录模式概述1.1 什么是备忘录模式1.2 简单实现备忘录模式1.3 使用备忘录模式的注意事项 二、备忘录模式的用途三、备忘录模式实现方式3.1 基于数组的备忘录实现方式3.2 基于集合的备忘录实现方式3.3 基于HashMap的备…...

【机器学习】正则化到底是什么?

先说结论&#xff1a;机器学习中的正则化主要解决模型过拟合问题。 如果模型出现了过拟合&#xff0c;一般会从两个方面去改善&#xff0c;一方面是训练数据&#xff0c;比如说增加训练数据量&#xff0c;另一方面则是从模型角度入手&#xff0c;比如&#xff0c;降低模型复杂…...

Rust5.2 Generic Types, Traits, and Lifetimes

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 10: Generic Types, Traits, and Lifetimes lib.rs use std::fmt::Display;//Traits: …...

c 实用化的摄像头生成avi视频程序(加入精确的时间控制)

I时间控制是指&#xff1a;生成了n张图片帧用了多少时间m。帧率等于n/m。对应于头文件&#xff0c;m等于scale, n等于rate.为了精确&#xff0c;采用微秒计时。 I此程序生成的视频远好于ffmpeg&#xff0c;可能是此程序没有压缩数据原因吧。 现在的帧率不高&#xff0c;是因…...

Web后端开发_01

Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet&#xff0c;DispatcherServlet实现了servlet中规范的接口 请求响应&#xff1a; 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletRe…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...