02JVM_垃圾回收GC

news2024/9/20 8:06:55

二、垃圾回收GC

里面存放着java的所有对象实例,当对象为“死去”,也就是不再使用的对象,就会进行垃圾回收GC

1.如何判断对象可以回收

1.1引用计数器

介绍

在对象中添加一个引用计数器,当一个对象被其他变量引用时这个对象的引用计数器加1。当某个变量不再引用这个对象时引用计数器减1。当这个引用计数变为0时,这个对象就会被垃圾回收。

优点

判定效率很高

缺点

不完全准确,当两个对象相互引用就判断失效了。当A引用B对象,B引用A对象,然后A和B不再被其他变量引用,垃圾不会回收,出现了垃圾回收失效。

 

1.2可达性分析算法(Java)

介绍

①要确定一个根对象GC Roots(肯定不会被垃圾回收的对象)作为起始节点,当垃圾回收前会对堆对象进行扫描,判断这些对象是否被根对象引用,如果没有被引用那么这个对象就可以垃圾回收。

②java虚拟机是通过可达性分析判断存活对象

哪些对象可以作为GC Root?

①虚拟机栈中引用的对象

各个线程调用的方法(参数,局部变量)

②本地方法栈中native方法引用的对象

③方法区中类静态属性引用的对象

Java类的引用类型静态变量

④方法区中常量引用的对象

字符串常量池StringTable里的引用

⑤所有被同步锁synchronized持有的对象

⑥java虚拟机内部的引用,核心类

1.3四种引用

 

1.强引用-不回收

介绍

程序代码中普遍存在的引用赋值“Object obj = new Object()”这种引用关系。

特点

不回收,只要沿着GC Root引用链能够找到这个对象,这个对象就不会被垃圾回收。

2.软引用-内存不足回收

介绍

软引用(间接引用)是一些还有用但非必需的对象,当被软引用关联的对象,系统发生内存溢出钱,会把这些对象列进回收范围进行二次回收。如果这次回收没有足够的内存,会抛出内存溢出异常

特点

当垃圾回收后,此时内存仍不够,软引用关联的对象会进行垃圾回收(内存不够才回收)

3.弱引用-发现就回收

介绍

弱引用是一些还有用但非必需的对象,生存到下一次垃圾回收为止。在系统进行垃圾回收时,发现弱引用,不管系统堆空间是否充足,都会回收软引用关联的对象。

特点

当发生垃圾回收时,弱引用关联的对象都会被回收。(内存不管够不够都回收)

4.虚引用-对象回收跟踪

介绍

当虚引用对象创建时会关联一个引用队列。虚引用在创建时必须提供引用队列作为参数。当垃圾回收准备回收一个对象时,如果发现他是虚引用,在垃圾回收后把这个虚引用加入引用队列,通知应用程序对象的回收情况。

5.终结器引用-引用队列配合

介绍

用于实现对象的finalize()方法。当终结器对象创建时会关联一个引用队列。当准备回收一个对象时,发现是终结器引用,会把终结器引用对象放入引用队列(此时对象没回收)。由Finalizer线程调用该对象的finalize()方法,第二次垃圾回收就会回收此对象。

2.垃圾回收算法

2.1标记清除

什么时候垃圾回收

扫描整个堆对象的过程中,如果发现对象被GC Root引用了,需要保留。如果这个对象没有被GC Root引用,就要进行垃圾回收。

标记清除算法的两个阶段

①把没有引用的对象标记为垃圾。

②把垃圾对象占用的空间释放,清除

③释放不是空间清0,而是把起始地址记录下来,然后将来把创建的新对象存储这个位置

优点

垃圾回收速度快

缺点

产生内存碎片

2.2标记整理

标记整理两个阶段

①把没有引用的对象标记为垃圾

②把可用的对象向前移动,让内存更加紧凑。连续的空间变多。

优点

没有内存碎片

缺点

对象整理过程中需要移动,垃圾回收效率低。

2.3复制

复制两个阶段

①把没有引用的对象标记为垃圾

②把活着的内存分为两块from区和to区。把from区存活的对象复制到to区。然后清空from区,然后交换from和to的位置

优点

没有内存碎片

缺点

占用双倍内存空间

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

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

相关文章

软件架构之前后端分离架构服务器端高并发演进之路

软件架构之前后端分离架构&服务器端高并发演进之路 前后端分离架构服务器端关于不同并发量的演进之路1. 单体架构2. 第一次演进:应用服务器和数据库服务器分开部署3. 第二次演进:引入本地缓存和分部署缓存4. 第三次演进:引入反向代理和负…

SQL语句如何生成PDM文件

首先我们先了解一下什么是PDM 物理数据模型(PDM)是数据库设计和管理过程中的重要组成部分,具有以下好处: 可视化数据库结构: PDM提供了一个直观的方式来可视化数据库的结构,包括表、列、索引、关系等。这使…

数据结构与算法学习(day4)——解决实际问题

前言 在本章的学习此前,需要复习前三章的内容,每个算法都动手敲一遍解题。宁愿学慢一点,也要对每个算法掌握基本的理解! 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法,今天我们来实践一下前面的三种算法。…

QT连接OpenCV库完成人脸识别

1.相关的配置 1> 该项目所用环境:qt-opensource-windows-x86-mingw491_opengl-5.4.0 2> 配置opencv库路径: 1、在D盘下创建一个opencv的文件夹,用于存放所需材料 2、在opencv的文件夹下创建一个名为:opencv3.4-qt-intall 文…

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView,only load visible item when page return,Kotlin base on this article: Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin_zhangphil的博客…

L1和L2正则

L1和L2正则 L1正则常被用来进行特征选择,主要原因在于L1正则化会使得较多的参数为0,从而产生稀疏解,我们可以将0对应的特征遗弃,进而用来选择特征。一定程度上L1正则也可以防止模型过拟合。 L2正则: L1损失函数相比于…

口袋参谋:淘宝卖家如何对订单实现批量标旗?

​插旗在淘宝店铺里是经常能使用到的,如果淘宝卖家订单量太大,一个一个的标旗太过于繁琐,而且容易出错。 那么使用批量插旗工具,则可以大大节省卖家时间,提高工作效率! 【批量插旗】功能: 一键…

基于blockqueue的生产和消费模型

线程篇下讲的是基于阻塞队列的生产者消费者模型。在学习这个之前我们先了解一些其他概念: 同步:在保证数据安全的条件下,让线程按某种特定的顺序依次访问临界资源。 通过上一节的代码我们实现了一个多线程抢票的程序,但结果显示…

Pytorch学习:卷积神经网络—nn.Conv2d、nn.MaxPool2d、nn.ReLU、nn.Linear和nn.Dropout

文章目录 1. torch.nn.Conv2d2. torch.nn.MaxPool2d3. torch.nn.ReLU4. torch.nn.Linear5. torch.nn.Dropout 卷积神经网络详解:csdn链接 其中包括对卷积操作中卷积核的计算、填充、步幅以及最大值池化的操作。 1. torch.nn.Conv2d 对由多个输入平面组成的输入信号…

ChatGPT AIGC 完成超炫酷的大屏可视化

大屏可视化一直各大企业进行数据决策的重要可视化方式,接下来我们先来看一下ChatGPT,AIGC人工智能帮我们实现的综合案例大屏可视化效果: 像这样的大屏可视化使用HTML,JS,Echarts就可以来完成,给ChatGPT,AIGC发送指令的同时可以将数据一起发送给ChatGPT。 第一段指令加数…

Direct3D绘制旋转立方体例程

初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp #include <windows.h> #include "d3dUtility.h" #include <d3dx9math.h>IDirect3DDevice9* Device NULL; IDirect3DVertexBuffer9* VB NULL; IDirect3…

【C语言】入门——结构体

目录 结构体 为什么有结构体&#xff1f; 1.结构体的声明 1.2结构体变量的访问和初始化 2.结构体成员的访问 结构体 struct 结构体类型 {//相关属性; }结构体变量; 结构体和数组不同&#xff0c;同一类型的数据的集合是数组&#xff1b; 结构体是多种类型的数据的集合&…

NSV60600MZ4T1G 双极型晶体管(BJT)学习总结

双极型晶体管的起源: 双极型晶体管是在1947年发明的&#xff0c;第一个晶体管是将两条具有尖锐端点的金属线与锗衬底(germanium substrate)形成点接触(point contact)&#xff0c;以今天的水准来看&#xff0c;此第一个晶体管虽非常简陋但它却改变了整个电子工业及人类的生活方…

CANdelaStudio CDD编写方法

本文是基于CANdelaStudio12.0讲解 一.把DTC从Excel导入cdd的方法 问题一&#xff1a;当导入DTC的xxx.cdi文件报如下红色错误 可能原因&#xff1a;在设置具有下拉框的属性的内容时&#xff0c;输入的内容不在下拉框列表中 解决办法:在.cddt文件中更新“”Error Code Table“”…

通达信趋向指标DMI公式详解

DMI指标(Directional Movement Index)也称趋向指标或动向指标&#xff0c;是用于衡量市场的趋势方向以及趋势强度的一种技术指标&#xff0c;由著名的技术派大师威尔斯威尔德(Welles Wilder)于1978年发表在《技术交易系统新概念》这本书中。威尔斯威尔德(Welles Wilder)这位大佬…

企微SCRM营销平台MarketGo-ChatGPT助力私域运营

一、前言 ChatGPT是由OpenAI&#xff08;开放人工智能&#xff09;研发的自然语言处理模型&#xff0c;其全称为"Conversational Generative Pre-trained Transformer"&#xff0c;即对话式预训练转换器。它是GPT系列模型的最新版本&#xff0c;GPT全称为"Gene…

springboot项目中application.properties无法变成小树叶问题解决

1.检查我们的resources目录的状态&#xff0c;看看是不是处在普通文件夹的状态&#xff0c;如果是的话&#xff0c;我们需要重新mark一下 右键点击文件夹&#xff0c;选择mark directory as → resources root 此时我们发现配置文件变成了小树叶 2.如果执行了上述方法还是不行…

[uniapp]踩坑日记 unexpected character > 1或‘=’>1 报错

在红色报错文档里下滑&#xff0c;找到Show more 根据提示看是缺少标签&#xff0c;如果不是缺少标签&#xff0c;看看view标签内容是否含有<、>、>、<号,把以上符合都进行以<号为例做{{“<”}}处理

超详细-Vivado配置Sublime+Sublime实现VHDL语法实时检查

目录 一、前言 二、准备工作 三、Vivado配置Sublime 3.1 Vivado配置Sublime 3.2 环境变量添加 3.3 环境变量验证 3.4 Vivado设置 3.5 配置验证 3.6 解决Vivado配置失败问题 四、Sublime配置 4.1 Sublime安装Package Control 4.2 Sublime安装VHDL插件 4.3 语法检查…

排序相关问题

本篇博客在B站做了内部分享,标题为「排序相关问题」 MySQL的ORDER BY有两种排序实现方式&#xff1a; 利用有序索引获取有序数据 (不得不进行)文件排序 在explain中分析时&#xff0c;利用有序索引获取有序数据显示Using index&#xff0c;文件排序显示Using filesort。 1. 能够…