Java垃圾收集原理

news/2024/4/28 17:17:47/文章来源:https://blog.csdn.net/apple_52296856/article/details/130140486

程序计数器、虚拟机栈、本地方法栈这三个区域随线程而灭,栈中栈帧的内存大小也是在确定的。这几个区域的内存分配和回收都具有确定性,因此不需要过多考虑如何回收。

Java堆和方法区这两个区域有着很显著的不确定性

  • 一个接口的实现类需要的内存可能不一样
  • 一个方法所执行的不同条件分支所需要的内存可能不一样

只有处于运行期间,才能知道程序需要多少内存,这部分内存的分配和回收是动态的。垃圾收集器关注的正是这部分内存。

判断对象是否有用

  1. 引用计数算法

每个对象中添加一个引用计数器,每当有一个地方引用它,计数器值就加一;当失去一个引用时,计数器值就减一。任何时刻计数器为0的对象就是不可能再被使用的。

但是这个算法不能解决循环引用的问题。

public class ReferenceCountingGC {public Object instance = null;private static final int _1MB = 1024*1024;private byte[] bigSize = new byte[2*_1MB];public static void testGC() {ReferenceCountingGC objA = new ReferenceCountingGC();ReferenceCountingGC objB = new ReferenceCountingGC();objA.instance = objB;objB.instance = objA;objA = null;objB = null;System.gc();}
}

但是实际上这两个对象可以被回收,所以实际上HotSpot使用的并不是这种内存回收方式。

  1. 可达性算法分析

通过这个算法用来判断对象是否存活。这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象不在链上,则说明这个对象可被回收。

可作为GC Roots的对象包括以下几种:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区常量引用的对象,譬如字符串常量池里的引用
  • 本地方法栈中Native方法引用的对象
  • Java虚拟机内部的引用
  • 所有被同步锁持有的对象
  • 反映Java虚拟机内部情况的JMXBean

除了这些还有其他对象可以临时性地加入GC Roots集合。

引用扩展

JDK 1.2之前,如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这个reference数据是引用。

JDK 1.2之后,引用扩展为了强引用、软引用、弱引用、和虚引用4种,这4中引用强度依次减弱。

  • 强引用指的是类似Object obj = new Object()的引用关系。只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
  • 软引用用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。通过SoftReference类来实现软引用。
  • 弱引用也是用来描述非必须对象的,但是只被弱引用关联着的对象,无论系统内存是否充足,在进行垃圾回收时都会被回收掉。通过WeakReference类来实现弱引用。
  • 一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被回收时收到一个系统通知。通过PhantomReference类来实现虚引用。

回收过程

即使是在可达性分析算法中被判定为不可打的对象,也不一定会被回收。一个对象真正被回收需要经过两次标记过程:当这个对象不可达时进行第一次标记,随后判断这个对象是否有必要执行finalize()方法;如果这个对象没有覆盖finalize()方法或者finalize()方法已经被虚拟机执行过了,那么就被视为“没有必要执行”。

如果这个对象被判定确有必要执行finalize()方法,那这个对象会被放置在一个F-Queue的队列中,并稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()方法。如果这个对象在finalize()方法中把自己和引用链上的任何一个对象关联了起来,那么这个对象就逃过了第二次标记。没有逃过标记的对象会被回收。

public class FinalizeEscapeGC {public static FinalizeEscapeGC SAVE_HOOK = null;public void isAlive() {System.out.println("yes, i am still alive :)");}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize method executed!");FinalizeEscapeGC.SAVE_HOOK = this;}public static void main(String[] args) throws Throwable {SAVE_HOOK = new FinalizeEscapeGC();SAVE_HOOK = null;System.gc();Thread.sleep(500);if(SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {System.out.println("no, i am dead :(");}SAVE_HOOK = null;System.gc();Thread.sleep(500);if(SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {System.out.println("no, i am dead :(");}}
}

运行结果

image-20230413204529484

回收方法区

方法区的垃圾收集主要回收两部分内容:废弃的常量和不再使用的类。

判断一个常量是否废弃相对简单(查看引用个数),而要判定一个类是否不再使用,需要同时满足下面三个条件

  • 该类的所有实例都已经被回收,Java堆中不存在该类及其派生子类的实例
  • 加载该类的类加载器已经被回收(只出现在自己设计类加载器的场景)
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Flutter开发一款音乐App(从0到1开发一款音乐App)

Flutter Music_Listener(flutter音乐播放器) Flutter version 3.9 项目介绍 1、项目整体基于getxretrofitdiojsonserialize开发 2、封装通用控制器BaseController,类似jetpack mvvm框架中的BaseViemodel 3、封装基础无状态基类BaseStatelessWidget,结合…

十三、市场活动:全部导出

功能需求:批量导出市场活动 用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框; 用户选择要保存的目录,完成导出市场活动的功能. *导出成功之后,页面不刷新 功能分析:导出市场活动 1.给批量…

Vue组件化编程【Vue】

2.Vue 组件化编程 2.1 模块与组件、模块化与组件化 2.1.1 模块 理解:向外提供特定功能的js程序,一般就是一个js文件为什么:js文件很多很复杂作用:复用js、简化js的编写、提高js运行效率。 2.1.2 组件 理解:用来实…

接口自动化【一】(抓取后台登录接口+postman请求通过+requests请求通过+json字典区别)

文章目录 前言一、requests库的使用二、json和字典的区别三、后端登录接口-请求数据生成四、接口自动化-对应电商项目中的功能五、来自postman的代码-后端登录总结前言 记录:json和字典的区别,json和字段的相互转化;postman发送请求与Python…

source insight4.0使用技巧总结

一、技巧1:查看函数调用关系 步骤 1:在主菜单中点击下图中的按钮 图 1 打开relation界面 步骤 2:在弹出的relation界面点击“设置”按钮, 图2 点击“设置”按钮 步骤3: 在“设置”界面中,“Levels”选择…

AC7811-FOC无感控制代码详解

目录 矢量控制原理 矢量控制框图 电流采样方式 电流在整个控制过程中的传递 采样关键点 三电阻 双电阻 单电阻 三者对比 坐标变换 dq轴电流的PI控制 启动方式 启动波形 脉冲注入 高频注入 Startup 预定位到指定角度 PulseInject_api hfi_api Speed loop s…

前端学习:HTML块、类、Id

目录 快 一、块元素、内联元素 二、HTML 元素 三、HTML元素 类 一、分类块级元素 二、分类行内元素 Id 一、使用 id 属性 二、 class与ID的差异 三、总结 快 一、块元素、内联元素 大多数HTML元素被定义为块级元素或内联元素。 块级元素在浏览器显示时,通常会…

FTP-----局域网内部传输文件(1)

在日常工作中,如果需要跨设备的传输文件,您需要借助USB数据线或者借助应用实现无线互联,将所需文件传输到对应设备,这一来一去,花费的时间与精力变多了,那么,怎么实现不使用第三方软件来实现跨设…

3-5年以上的功能测试如何进阶自动化?【附学习路线】

做为功能测试人员来讲,从发展方向上可分两个方面: 1、业务流程方向 2、专业技能方向。 当确定好方向后,接下来就是如何达到了。(文末自动化测试学习资料分享) 一、业务流程方向 1、熟悉底层的业务 作为功能测试工程师来讲,了解…

【C++高级】手写线程池项目-经典死锁问题分析-简历项目输出指导

作为五大池之一, 线程池的应用非常广 泛,不管是客户端程序,还是后台服务程序,掌握线程池,是提高业务处理能力的必备模块 本课程将带你从零开始,设计一个支持fixed和cached模式的线程池,玩转C11、…

IGA_PLSM3D的理解1

文章目录前言一、IgaTop3D_FAST.m给的参数二、Material properties 材料特性对Geom_Mod3D的理解对Pre_IGA3D的理解 输出1-----CtrPts: 输出2-----Ele: 输出3-----GauPts:前言 只是为方便学习,不做其他用途 一、IgaTop3D_FAST.m给的…

Python爬虫-某跨境电商(AM)搜索热词

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 关于某跨境电商(AM),本专栏前面有单独详细介绍过,获取配送地的cookie信息以及商品库存数据,感兴趣的同学可往前翻阅。 1. python爬虫|爬取某跨境电商AM的商品库存数据(Selenium实战) 2. Seleni…

5.39 综合案例2.0 - STM32蓝牙遥控小车1(手机APP遥控)

综合案例2.0 - 蓝牙遥控小车1- 手机APP遥控成品展示案例说明器件说明连线小车源码手机遥控APPAPP使用说明成品展示 案例说明 用STM32单片机做了一辆蓝牙控制的麦轮小车,分享一下小车的原理和制作过程。 控制部分分为手机APP,语音模块控制,Ha…

15-721 chapter2 内存数据库

Background 随着时代的发展,DRAM可以容纳足够的便宜,容量也变大了。对于数据库来说,数据完全可以fit in memory,但同时面向disk的数据库架构不能很好的发挥这个特性 这张图是disk database的cpu instruction cost 想buffer pool…

第5章 继承-Java核心技术·卷1

文章目录Java与C不同基本概念继承:基于已有的类创建新的类。构造器多态定义超类变量可以引用所有的子类对象,但子类变量不能引用超类对象。子类引用的数组可以转换成超类引用的数组覆写返回子类型强制类型转换阻止继承:final类和方法多态 vs …

ROS学习-ROS简介

文章目录1.ROS1.1 ROS概念1.2 ROS特征1.3 ROS特点1.4 ROS版本1.5 ROS程序其他名词介绍1. 元操作系统2. IDL 接口定义语言一些网站1.ROS 1.1 ROS概念 ROS(Robot Operating System,机器人操作系统) ROS 是一个适用于机器人的开源的元操作系统,提供一系列…

linux驱动开发 - 04_Linux 设备树学习 - DTS语法

文章目录Linux 设备树学习 - DTS语法1 什么是设备树?2 DTS、DTB和DTC3 DTS 语法3.1 dtsi 头文件3.2 设备节点3.3 标准属性1、compatible 属性2、model 属性3、status 属性4、#address-cells 和#size-cells 属性5、reg 属性6、ranges 属性7、name 属性8、device_type…

人工智能专题-知识表示

文章目录人工智能专题-知识表示大纲2.1 知识表示的概念2.1.1 知识表示观点2.1.2 知识表示的要求2.2 一阶谓词逻辑表示法2.2.1 一阶谓词概念2.2.2 谓词逻辑表示方法2.3 产生式表示法2.4 语义网络表示法2.5 框架表示法人工智能专题-知识表示 大纲 大纲:掌握知识表示方…

思科路由器发现重大漏洞,解决方法是……

晚上好,我是老杨。 思科知名度高,待遇也好,很多网工心生向往,也有很多人考过思科认证的相关证书,对思科的印象还是不错吧? 而且,作为美国著名的网络设备厂商,思科是全球路由器巨头…

【面试】如何设计SaaS产品的数据权限?

文章目录前言数据权限是什么?设计原则整体方案RBAC模型怎么控制数据权限?1. 数据范围权限控制2. 业务对象操作权限控制3. 业务对象字段权限控制总结前言 一套系统的权限可以分为两类,数据权限和功能权限,今天我们从以下几个点&am…