JVM垃圾回收机制和常见算法

news2024/11/26 6:23:09

        GC回收垃圾流程第一步是定位内存空间中没有引用到的对象,然后才能进行回收。那么GC是如何定位这些内存中没有用到的对象呢?

一、引用计数器算法(废弃)

        引用计数器算法是给每一个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1;当引用失效的时候,计数器减1;当计数器为0的时候,JVM就默认对象不再使用,是“垃圾”了,这种定位算法存在一个缺点:就是无法解决循环依赖的问题。当A引用B,B也引用A的时候,此时AB对象的引用都不为0,此时也就无法垃圾回收,所以一般主流虚拟机都不采用这个方法。

二、根搜索算法(可达性分析算法)

        根搜索算法是通过“GC ROOT”根对象作为起始节点,从该节点开始往下搜索,搜索通过的路径称之为“引用链”,当一个对象没有被GC Root 的引用链连接的时候,说明这个对象是不可用的且无法达到的,然后才可以被GC进行回收。

GC Root对象包括:

  1. 虚拟机栈中引用的对象
  2. 方法区域的类静态属性引用的对象
  3. 方法区域中常量引用的对象
  4. 本地方法栈中JNI(Native方法)引用的对象                                         

经过以上算法分析后,确定好了要回收的对象,可以进行下一步回收了,以下是常见的GC回收算法:

三、回收算法

(一)标记清除法

        标记-清除算法包括两个阶段:“标记”“清除”

在标记阶段,遍历堆然后确定所有要回收的对象,并做标记;

在清除阶段,将标记阶段确定不可用的对象清除;

标记-清除算法是基础的收集算法,标记和清除阶段的效率不高,而且清除后会产生大量的不连续空间(内存碎片),这样当程序需要分配大内存对象的时候,可能无法找到足够的连续空间

(二)标记复制算法

        复制算法就是把内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候,把存活的对象复制到另外一块内存上,然后把原来的那块内存清理掉。复制算法实现简单,运行效率高,并且解决了标记清除法内存碎片的问题。缺点是由于每次只能使用其中的一半,造成内存的利用率不高。

 

(三)标记-整理算法

        标记-整理算法和标记-清除算法一样,标记--整理算法是把存活对象往内存一端移动,然后直接回收边界以外的内存。标记--整理算法提高了内存的利用率,并且它适合在收集对象存活时间较长的老年代。

 

(四)分代收集算法

        分代收集是根据对象的存活时间把内存分为新生代老年代,根据各个代对象的存活特点,每个代采用不同的垃圾回收算法。新生代采用复制算法、老年代采用标记--整理算法。

四、JVM内存模型

Java虚拟机中有三个主要的内存区域:方法区、Java栈和Java堆,它们分别用于存储不同类型的数据。

(一)方法区(Method Area):

        用于存储类的结构信息,如类名、属性、方法、接口等。在JDK 8及之前的版本中,方法区是一个逻辑上独立于堆的内存区域,它通常也被称为永久代(PermGen)。而在JDK 8之后,方法区被移除,取而代之的是元空间

(二)Java栈(Java Stack):

        每个线程都会有自己的Java栈,用于存储局部变量操作数栈、方法出口等信息。Java栈是一个先进后出(FILO)的数据结构。当一个方法被调用时,就会在Java栈中创建一个新的栈帧;当方法执行结束时,对应的栈帧就会被弹出。

(三)Java堆(Java Heap):

        用于存储对象实例和数组。所有线程共享一个Java堆,而且Java堆也是JVM管理的最大的一块内存区域。在Java程序运行过程中,所有通过new关键字创建的对象都会在Java堆中分配空间

                                                              JVM结构模型图

五、JVM引用类型(重要)

         Java中对象的引用分为四种级别,这四种级别由高到低依次为:强引用、软引用、弱引用、虚引用。

(一)强引用

        级别最高的引用,普通变量赋值即为强引用,如 A a = new A();如果一个对象被强引用、那么垃圾回收器绝对不会回收它;当内存空间不足,Java虚拟机宁可跑内存溢出异常,也绝对不会随意回收具有强引用的对象来解决内存不足的问题。

(二)软引用:

        如果一个对象具有软引用,那么如果内存空间足够,垃圾回收器不会回收它,一旦内存空间不够了,垃圾回收器就会回收这些软引用对象的内存。软引用可用来实现内存敏感的高速缓存。

(三)弱引用:

        弱引用的生命周期更短,弱引用的作用是使对象能够被垃圾回收器回收,即如果一个对象只被弱引用所引用,无论内存空间是否足够,这个对象在下一次垃圾回收时都会被回收

弱引用可以解决内存泄露的问题。

        缓存:如果我们需要为某些数据进行缓存而不想影响垃圾回收器对这些数据的回收,可以使用弱引用来实现缓存功能。

       监视器:有时候我们需要对某些对象进行监视,但是又不想让监视器本身影响到这些对象的生命周期,可以使用弱引用来实现监视器功能。

(四)虚引用:

        虚引用是最弱的一种引用类型,它的作用是在对象被垃圾回收器回收时收到一个系统通知或者后续处理操作。虚引用必须和引用队列联合使用。

总之强引用垃圾回收器不会回收,软引用内存空间不足时会回收,弱引用不管内存空间是否足够,垃圾回收器都会回收它;虚引用是最弱一种引用,必须联合引用队列一起使用。

六、GC会回收JVM中哪些内存?

        内存运行时JVM会有一个运行时数据区来管理内存。它包括5大部分:程序计数器、虚拟机栈、本地方法栈、方法区、堆。因为程序计数器、虚拟机栈、本地方法栈是线程私有的,随线程而生、随线程而死、生命周期比较短,因此不用考虑内存回收的问题。需要考虑内存回收的是GC主要进行回收的内存是JVM中的方法区和堆。

总结GC 的目的在于实现无用对象内存自动释放,减少内存碎片、加快分配速度。

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

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

相关文章

Linux入门操作

pwd 查看当前目录 与 自动补全 文件详情 drwxrwxr-x d代表文件夹 -代表文件 其中rwx rwx r-x r是可读 w是可写 x 执行 第一组(前三个)指文件拥有者的权限 第二组(中三个)代表文件拥有的组的权限 第三组(后三个&am…

5.2.1二叉树的定义和基本术语

二叉树的基本概念: 二叉树是递归定义的二叉树 下面我们来看几个特殊的二叉树: 特点: 1)只有最后一层有叶子节点 2)不存在度为1的结点 3)按层序从1开始编号,结点i的左孩子为2i,右孩…

three.js地图可视化项目-广州模型

概述 如有不明白的可以加QQ:2354528292;wx: aichitudousien 更多教学视频请访问:https://space.bilibili.com/236087412 详细教学请到上方视频链接访问,总共3个多小时的教学~ three.js地图可视化项目-广州模型 搭建开发环境 使用…

Tomcat的概念、部署、及优化

一、Tomcat概述 1、Tomcat的概念 Tomcat是Java语言开发的,服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说&am…

金陵科技学院五年一贯制专转本旅游学概论考试大纲

金陵科技学院五年一贯制专转本旅游学概论考试大纲 一、考核对象 本课程的考核对象为五年一贯制高职专转本“旅游管理”专业入学考试考生。 二、考核方式 本课程考核采用闭卷笔试的方式。 三、命题依据及原则 1、命题依据 参考书目:《旅游学概论》(第七版) 李…

【Git 入门教程】第一节、什么是Git?

在软件开发中,代码的管理和版本控制非常重要。为了更好地管理代码,需要使用一种有效的工具来保证代码的质量和稳定性。而Git正是这样一种工具。 一、概念 Git是一种分布式版本控制系统,它可以追踪文件的变化,并且可以协同工作。它…

SpringBoot——MyBatis-Plus源码分析及开发实践详解

focus w x:CodingTechWork 文章目录 focus w x:CodingTechWork 引言MyBatis-Plus 介绍概述特点常用注解TableNameTableIdIdType类型 TableField MyBatis-Plus 源码分析IService原生CURD接口savesaveorUpdateremoveupdategetlistpage Mapper原生CURD接口i…

抚仙湖,一个亦梦亦幻的地方,这个五一节,我们骑友′的诗和远方

云南省玉溪市抚仙湖是中国南方最大的深水型淡水湖泊之一,位于云南省中部,距离昆明市约80公里。抚仙湖的面积约为212平方公里,平均水深约为120米,最大水深可达157米。 抚仙湖最美的景点有很多,其中最著名的是以下几个&a…

2023年五月份图形化二级打卡试题

活动时间 从2023年5月1日至5月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

深度学习技巧应用9-模型训练中学习率的调整和假数据生成技巧与总结

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用9-模型训练中学习率的调整和假数据生成技巧与总结,我们在训练模型的时候,为了测试模型是否可以行,但是目前还没有标注好大量的数据,在缺乏数据的情况下,今天教大家如何生成假数据(测试数据)进行模型调试,并且教…

时间序列预测(一)基于Prophet的销售额预测

时间序列预测(一)基于Prophet的销售额预测 小O:小H,有没有什么方法能快速的预测下未来的销售额啊 小H:Facebook曾经开源了一款时间序列预测算法fbprophet,简单又快速~ 传统的时间序列算法很多&a…

mac电脑怎么录屏?2招轻松搞定!

案例:怎样对mac电脑进行屏幕录制? 【之前一直使用的是Windows电脑,对Windows电脑比较熟悉。最近换了一台苹果电脑,不知道使用它怎么进行电脑录屏。求一个好用的苹果电脑录屏方法!】 在我们的日常工作和生活中&#x…

c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 上一章,我们将c入门的基础知识进行了学习,本章其实才算真正的跨入到c开始可能比较难,但只有我们唯有不断的前进,才能斩断荆棘越过人生的坎坷! 话不多说安全带系好,发车啦(建议电脑观看&…

【原创】用Matplotlib绘制的图表,真的是太惊艳了!!

当我们谈论Python中的数据可视化,Matplotlib是一个不可或缺的库。它强大的功能和灵活性使我们能够以各种方式轻松地呈现数据。然而,有时候,我们可能会忽视Matplotlib在创建视觉上令人惊叹的图像方面的潜力。在本文中,我们将探讨如…

C语言数据结构+KMP算法next数组优化计算方法+优化后子串匹配代码实现

KMP算法next数组优化版 一.计算根据下列模式串计算出next数组二.优化next数组三.用优化后next的数组代码实现子串的匹配总结 通过我之前那篇KMP算法的讲解,我们可以快速手算KMP算法的next数组,但是之前计算的next数组在一些情况下会有缺陷,比如模式串’aaaab’和主串’aaabaaaa…

人人都能用,3s学会加密你的网址变成ooo

文章目录 1 前言2 原理及使用方法3 这玩意有什么用3.1 简单加密网址3.2 隐藏二级目录3.3 彩蛋:无限月读3.4 探讨性的加密应用 4 转换的代码4.1 将字符转为utf8数组4.2 将utf8数组转换为字符串4.3 最终转换4.4 用R来实现 5 讨论 1 前言 大家可以复制一下这个网址到浏…

[JavaEE初阶] 类加载机制

在真正的战争到来之前,尽可能地变得强大吧~ 文章目录 前言1. 类加载1.1 类加载的过程1.2 类加载的时机1.3 双亲委派模型 前言 这个问题是面试经典题,让我们来求甚解吧~ 1. 类加载 1.1 类加载的过程 如下图 加载,找到.class文件,读取文件内容验证,验证.class文件的格式是否…

IntelliJ IDEA 接入ChatGPT (免费,无需注册)生产力被干爆了!

IntelliJ IDEA 接入ChatGPT 前言 : 今天给大家介绍一款好用的 IntelliJ IDEA ChatGPT 插件 可以帮助我们写代码,以及语言上的处理工作,以及解释代码。让我们的生产力大大提高! 一. ChatGPT-Plus 功能介绍 支持最新idea版本AI询问功能,写好…

记录一次adb+frida+hook学习经过

adb连接模拟器 adb devices 查看adb 连接设备 offline 表示设备未连接成功或无响应,device 设备已连接 未连接就使用adb connect 127.0.0.1:端口号 各种模拟器端口号及模拟器连接方式_雷电模拟器 调式串口_宋学慧的博客-CSDN博客 举个栗子 常见adb命令 adb vers…

NXP公司LPC21XX+PID实现稳定温度控制

本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后,再用设定的温度与当前温度相减,通过PID算法计算出当前输出脉宽,并将其输出到L298N模块中,使加热丝发热,形成闭环&#xf…