jvm的垃圾回收策略

垃圾回收回收的是什么

  • 对象

  • 类元数据: 类的元数据包括类的结构信息、方法信息、字段信息等,它们存储在方法区(Metaspace)中。当一个类不再被引用时,垃圾回收器会卸载这个类,并释放其在方法区中占用的内存空间。

  • 线程栈和本地方法栈

  • 类加载器: 类加载器负责加载类并生成类的元数据。当一个类加载器不再被使用时,垃圾回收器会清理它所加载的类及其相关的元数据,并释放相应的内存空间。

  • 其他资源: 包括文件句柄、网络连接、数据库连接等外部资源。这些资源通常由 Java 虚拟机管理器进行管理,垃圾回收器不会直接回收它们,但在某些情况下,这些资源可能会被释放,比如对象的 finalize() 方法被调用时。

判断对象已死

程序计数器,虚拟机栈,本地方法区,随一个线程生,随一个线程死,在编译时就确定了空间大小,不需要判断对象状态。
堆和方法区却拥有很大的不确定性,需要判断其中的对象是否已死。

引用计数法:缺点明显

给每个对象一个引用数,被引用一次+1,取消引用-1。
缺点:当两个对象互相引用时,无法判断已死。

可达性分析算法:主流使用(java,C#)

GC ROOT 对象及其引用的对象被认为是“活动”的,即它们是程序中正在使用的对象,不会被垃圾回收器回收。因此,垃圾回收器会从 GC ROOT 对象出发,沿着对象之间的引用链,标记所有可达的对象,然后清除未被标记的对象,以释放内存空间。

GC ROOT是一定存活的对象
GC ROOT有哪些:
  • 虚拟机栈中的引用

  • 本地方法栈中的引用

  • 方法区中的类静态属性引用的对象: 类的静态属性保存在方法区中,如果一个对象被类的静态属性引用所引用,那么这个对象也是 GC ROOT。

  • 方法区中的常量引用的对象: 常量池中的字符串常量、类的静态常量等,如果一个对象被方法区中的常量引用所引用,那么这个对象也是 GC ROOT。

  • JNI(Java Native Interface)中的引用: 本地代码中也可能会引用 Java 对象。如果一个对象被 JNI 中的引用所引用,那么这个对象也是 GC ROOT。

  • synchronized持有的对象。

再谈引用

JDK1.2后对引用进行了扩充,

强引用(Strong Reference): 强引用是最常见的引用类型,它是指通过 new 关键字创建的对象所持有的引用。只要存在强引用指向一个对象,这个对象就不会被垃圾回收器回收,即使内存不足时也不会回收这些对象。当没有强引用指向一个对象时,这个对象就可以被垃圾回收器回收。

软引用(Soft Reference): 软引用是一种比较弱的引用类型,用于描述一些还有用但非必需的对象。当内存不足时,垃圾回收器会回收软引用所引用的对象。软引用通常用于实现缓存等功能,可以避免内存溢出的情况发生。

弱引用(Weak Reference): 弱引用比软引用更弱,它只能保持对一个对象的非必需引用。当对象只被弱引用所引用时,即使内存充足,垃圾回收器也会回收这个对象。弱引用通常用于实现一些特定的功能,比如监视对象的生命周期等。

虚引用(Phantom Reference): 虚引用是一种比较特殊的引用类型,它通常不被用于获取对象的实例,而是用于跟踪对象被垃圾回收器回收的状态。虚引用是一种最弱的引用类型,它不能单独使用,必须和引用队列(ReferenceQueue)一起使用。当对象被回收时,虚引用会被添加到引用队列中,通知程序对象的回收情况。

非死不可与自我拯救

当可达性算法分析一个对象该死亡时,虚拟机会判断这个对象是否调用过了finalize()方法,如果调用过,则判定为没有必要执行垃圾回收。
如果判断为有必要执行finalize()方法,那么这个对象会被放置在一个F-Queue队列中,并且在稍后由一个虚拟机自己建立的,低调度优先级的线程去执行其finalize()方法。
对象可以在finalize()方法中拯救自己,如果此时它和GC ROOT建立了联系,则拯救了自己。

回收方法区的垃圾

在《java虚拟机规范》中提到,方法区可以没有垃圾回收,因为方法区的垃圾回收性价比很低,只有很少的内存可以被回收,确实有些虚拟机也没有实现方法区的垃圾回收。
方法区回收的主要是:废弃的常量和不再使用的类的元数据。

垃圾回收算法

垃圾回收算法主要是:引用式和追踪式,主流的垃圾回收算法使用的都是追踪式,我们讨论的也是追踪式的。

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

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

相关文章

TCP的十个重要的机制

注:TCP不是只有十个机制 TCP 可靠传输是tcp最为重要的核心(初心) 可靠传输,并不是发送方把数据能够100%的传输给接收方 而是退而求其次 让发送方发送出去数据之后,能够知道接收方是否收到数据。 一但发现对方没有…

[RK3566-Android11] 关于 a2dpsink -蓝牙支持接收播放/无PIN码连接

问题描述 1.蓝牙支持接收播放 2.蓝牙支持无PIN码连接(不需要弹出pin配对码请求弹窗) 3.蓝牙支持播放歌曲信息并应用层获取 解决方案: 1.a2dpsink-蓝牙需要支持接收播放补丁 1、device/rockchip/common/overlay/overlay/packages/apps/Blue…

CVE-2021-30517:Type confusion bug in LoadSuperIC

前言 这个漏洞是一个比较老的洞,之所以分析这个漏洞,只要是想再学习一下 ICs 相关的知识。并该漏洞的利用是利用与 String/Function 之间的混淆,比较有意思。 环境搭建 sudo apt install python git checkout 7d5e5f6c62c3f38acee12dc4114…

浅谈深度学习的学习方法

深度学习作为人工智能领域的一大热门技术,吸引了越来越多的开发者和研究者投身其中。然而,对于初学者来说,如何高效地入门深度学习并不是一件容易的事情。 一、基础知识准备 在开始学习深度学习之前,建议先掌握一些基础知识&…

vite.config.js

Vue3vite vite和webpack区别? 1.vite服务器启动速度比webpack快,由于vite启动的时候不需要打包,也就无需分析模块依赖、编译,所以启动速度非常快。当浏览器请求需要的模块时,再对模块进行编译,这种按需动态…

AI智能涂抹修补解决方案助力企业高效创作

传统的手动涂抹修补方式不仅效率低下,而且往往难以达到理想的视觉效果。美摄科技凭借深厚的AI技术研发实力,推出了面向企业的AI智能涂抹修补解决方案,为企业带来前所未有的创作体验。 美摄科技的AI智能涂抹修补解决方案,具备强大…

集群式无人机仿真环境和数据集

仿真环境和数据集 Quick StartAcknowledgementsSwarmSim Quick Start Compiling tests passed on 20.04 with ros installed. You can just execute the following commands one by one. # Download the Simulator and run it wget https://cloud.tsinghua.edu.cn/library/34…

年少不知EFCore好,错把SqlSugar当成宝

背景:依然记得我的第一份WebApi项目使用得是SqlSugar,当时还没有系统学习b/s这边的知识,跟着别人做项目用SqlSugar觉得非常方便,减少了自己手写ADO.Net的痛苦。但是今天发现这个EFCore也是巨好用啊,下面写一下他的简单…

DDD 的四层领域模型是怎样的?包含哪些基础概念?

DDD的四层领域模型如下所示: 展现层:这一层负责向用户显示信息和解释用户命令,完成前端界面逻辑。并将用户请求传递给应用层。应用层:这一层是很薄的一层,负责协调领域层中的领域对象,组成具体应用场景。应…

svn cannot set LC_CTYPE locale

svn报警告 svn: warning: cannot set LC_CTYPE locale svn: warning: environment variable LC_CTYPE is en_US.UTF-8 svn: warning: please check that your locale name is correct 使用命令 sudo dpkg-reconfigure locales 选择en_US.UTF-8,我的警告就好了 参…

vue3从精通到入门12:vue3的生命周期和组件

生命周期: 生命周期钩子主要包括: beforeCreate:组件实例被创建之前调用。在这个阶段,组件的 props 和 data 还未被初始化。created:组件实例创建完成后调用。在这个阶段,组件的 props 和 data 已经被初始…

Linux空洞文件

起因 今天在学习RandomAccessFile这个类时&#xff0c;看到里面有一个方法 public void seek(long pos) throws IOException {if (pos < 0) {throw new IOException("Negative seek offset");} else {seek0(pos);}}这个方法没有对文件的长度的校验&#xff0c;如…

springcloud==openfeign+springboot仿照openfeign自定义注解和使用

我的目的是参照原本openfeign的注解&#xff0c;但是我想实现每个外部服务的URL可以自己指定生成的规则。 自定义EnableMyFeignClients 自定义MyImportBeanDefinitionRegistrar&#xff0c;更改获取URL的逻辑。这个应该是个可行的方式&#xff0c;但是RIBBON的视线方式应该会…

LangChain入门:11.Pydantic(JSON)解析器实战

摘要 在数字化营销的浪潮中&#xff0c;自动化内容生成成为了提升效率和用户参与度的利器。本文将详细介绍如何利用LangChain的自然语言处理能力和Pydantic的数据验证特性&#xff0c;构建一个自动化的花店文案生成器。通过这个工具&#xff0c;您可以快速为各种花卉生成吸引人…

Gateway是什么?(SpringCloudAlibaba组件)

1、网关介绍 **网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。**网关的结构也和路由器类似&#xff0c;不同的是互连层。网关既可以用于广域网互连&#xff0c;也可…

截稿倒计时 CCF-B COCOON’24论文延期至4月8日提交

会议之眼 快讯 第30届COCOON 2024 (International Computing and Combinatorics Conference)即国际计算与组合学会议将于 2024 年 8月23日-25日在中国上海举行&#xff01;COCOON是一个专注于计算机科学理论领域的国际性学术会议&#xff01;COCOON会议自1995年起举办&#xf…

Promise-以往的异步编程模式

要理解这个 double 函数在调度异步操作后为什么会立即退出&#xff0c;我们可以一步一步拆解它的执行流程。 首先&#xff0c;看一下 double 函数的定义&#xff1a; function double(value) {setTimeout(() > setTimeout(console.log, 0, value * 2), 1000); }当你调用 d…

JDK下载安装配置

一.JDK安装配置。 1.安装注意路径,其他直接下一步。 2.配置。 下接第4步. 代码复制: JAVA_HOME D:\Program Files\Java\jdk1.8.0_91 D:\Program Files\Java\jdk1.8.0_91\bin 3.验证(CMD)。 java javac java -version 二.下载 1.下载JDK1.5-1.9(所有版本)下载: https://www.…

docker环境中宿主机防火墙添加ssh无法生效的问题分析

背景 在部署了docker容器的环境中&#xff0c;要在防火墙开通22端口&#xff0c;即ssh服务&#xff0c;以便在终端可以正常登陆。使用firewall-cmd在docker区域添加了22端口&#xff0c;但是没有起作用。后再public区域添加22端口才起作用。为什么docker区域不起作用&#xff…

使用vuepress搭建个人的博客(一):基础构建

前言 vuepress是一个构建静态资源网站的库 地址:VuePress 一般来说,这个框架非常适合构建个人技术博客,你只需要把自己写好的markdown文档准备好,完成对应的配置就可以了 搭建 初始化和引入 创建文件夹press-blog npm初始化 npm init 引入包 npm install -D vuepress…