3、jvm基础知识(三)

如何判断堆上的对象没有被引用?
常见的有两种判断方法:引用计数法和可达性分析法。
引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1。
在这里插入图片描述
引用计数法的优点是实现简单,缺点有两点:
1.每次引用和取消引用都需要维护计数器,对系统性能会有一定的影响
2.存在循环引用问题,所谓循环引用就是当A引用B,B同时引用A时会出现对象无法回收的问题。
在这里插入图片描述
可达性分析算法
Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:垃圾回收的根对象(GC
Root)和普通对象,对象与对象之间存在引用关系。
下图中A到B再到C和D,形成了一个引用链,可达性分析算法指的是如果从某个到GC Root对象是可达的,对象就
不可被回收。
在这里插入图片描述
可达性分析算法
哪些对象被称之为GC Root对象呢?
⚫ 线程Thread对象,引用线程栈帧中的方法参数、局部变量等。
⚫ 系统类加载器加载的java.lang.Class对象,引用类中的静态变量。
⚫ 监视器对象,用来保存同步锁synchronized关键字持有的对象。
⚫ 本地方法调用时使用的全局对象。

如何判断堆上的对象有没有被引用?

引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减
1,存在循环引用问题所以Java没有使用这种方法。
Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两
类:垃圾回收的根对象(GC Root)和普通对象。
可达性分析算法指的是如果从某个到GC Root对象是可达的,对象就不可被回收。最
常见的是GC Root对象会引用栈上的局部变量和静态变量导致对象不可回收

JVM 中都有哪些引用类型

⚫ 强引用,JVM中默认引用关系就是强引用,即是对象被局部变量、静态变量等GC Root关联的对象引用,只要
这层关系存在,普通对象就不会被回收。
⚫ 软引用,软引用相对于强引用是一种比较弱的引用关系,如果一个对象只有软引用关联到它,当程序内存不足
时,就会将软引用中的数据进行回收。软引用主要在缓存框架中使用。
⚫ 弱引用,弱引用的整体机制和软引用基本一致,区别在于弱引用包含的对象在垃圾回收时,不管内存够不够都
会直接被回收,弱引用主要在ThreadLocal中使用。
⚫ 虚引用(幽灵引用/幻影引用),不能通过虚引用对象获取到包含的对象。虚引用唯一的用途是当对象被垃圾回
收器回收时可以接收到对应的通知。直接内存中为了及时知道直接内存对象不再使用,从而回收内存,使用了
虚引用来实现。
⚫ 终结器引用,终结器引用指的是在对象需要被回收时,终结器引用会关联对象并放置在Finalizer类中的引用队
列中,在稍后由一条由FinalizerThread线程从队列中获取对象,然后执行对象的finalize方法,在对象第二次
被回收时,该对象才真正的被回收

ThreadLocal中为什么要使用弱引用?

ThreadLocal可以在线程中存放线程的本地变量,保证数据的线程安全。
在这里插入图片描述
ThreadLocal中是这样去保存对象的:
1、在每个线程中,存放了一个ThreadLocalMap对象,本质上就是一个数组实现的哈希表,里边存放多个Entry对象。
2、每个Entry对象继承自弱引用,内部存放ThreadLocal对象。同时用强引用,引用保存的ThreadLocal对应的value值。
在这里插入图片描述
以代码为例:
threadLocal.set(new User(1,“main线程对象”));
在这里插入图片描述
User user = threadLocal.get();
在这里插入图片描述
不再使用Threadlocal对象时, threadlocal = null;由于是弱引用,那么在垃圾回收之后,ThreadLocal对象就可以被
回收。
在这里插入图片描述
此时还有Entry对象和value对象没有能被回收,所以在ThreadLocal类的set、get、remove方法中,在某些特定条件满
足的情况下,会主动删除这两个对象。
在这里插入图片描述
如果一直不调用set、get、remove方法或者调用了没有满足条件,这部分对象就会出现内存泄漏。强烈建议在
ThreadLocal不再使用时,调用remove方法回收将Entry对象的引用关系去掉,这样就可以回收这两个对象了
在这里插入图片描述

ThreadLocal中为什么要使用弱引用?

当threadlocal对象不再使用时,使用弱引用可以让对象被回收;因为仅有弱引用没
有强引用的情况下,对象是可以被回收的。
弱引用并没有完全解决掉对象回收的问题,Entry对象和value值无法被回收,所以合
理的做法是手动调用remove方法进行回收,然后再将threadlocal对象的强引用解除

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

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

相关文章

电机选型与直线模组(简化版)

2-1电机分类和普通电机选型 1、电机及其原理的基本认知: 电动机我们平时简称电机,大部分情况下指的都是通电后,输出轴会旋转运动的设备。即将电能转换为机械能,供我们使用以驱动机构运行。电机简单的讲,其实就是一个…

ubuntu 一键安装python3.10和pip3.10

在Ubuntu系统上,您可以通过添加官方Python PPA来安装Python 3.10。以下是通过命令行安装Python 3.10和pip的步骤: 打开终端。 添加deadsnakes PPA(Personal Package Archive): sudo add-apt-repository ppa:deadsna…

梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码

源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题,把接口本地化,但是集成外链播放器…

【前端推荐】node.js有哪些命令

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端运行JavaScript代码。Node.js拥有丰富的模块和工具,通过命令行工具,可以执行各种任务来简化开发流程。以下是一些常用的Node.js命令: 1. node 这是最…

x264 arm64汇编分析 quant8x8_neon分析

一 C语言实现 #define QUANT_ONE( coef, mf, f ) \ { \ if( (coef) > 0 ) \ (coef) (f (coef)) * (mf) >> 16; \ else \ (coef) - ((f - (coef)) * (mf) >> 16); \ nz | (coef); \ } static int quant_8x8( dctcoef dct[64], udctcoef mf[64], udctcoef bias…

【Qt】常用控件(输入类)

目录 一、Line Edit二、Text Edit三、ComBo四、DateTimeEdit五、Slider 一、Line Edit QLineEdit 用来表示单行输入框,可以输入一段文本,但是不能换行。 属性说明test输入框中的文本inputMask输入内容格式约束maxLength最大长度frame是否添加边框echoM…

harbor api v2.0

harbor api v2.0 v2.0 v2.0 “harbor api v2.0”与v1区别较大,此处harbor也做了https。另外,通过接口拿到的数据也是只能默认1页10个,所以脚本根据实际情况一页页的循环抓取数据 脚本主要用于统计repo(仓库)、image,以及所有镜像…

东方财富网股票数据爬虫

废话不多说 , 直接上源码 import csv # 用于读写 CSV 文件 import json # 用于解析 JSON 数据 import requests # 用于发送 HTTP 请求 from lxml import etree # 用于解析 HTML 文档# 定义 DataScraper 类,实现数据抓取功能 class DataScraper:# 初始化函数def…

腾讯云2023: 容器与函数计算实践精选,引领Serverless与Docker容器新趋势

引言 在云计算领域,容器和函数计算技术的迅猛发展正引领着企业架构的新变革。尤其是在2023年,随着技术的成熟和应用场景的拓展,腾讯云发布的《2023腾讯云容器和函数计算技术实践精选集》为我们提供了一窗口,深入了解这一领域的最…

C#多线程编程详细教学

在C#中,多线程编程是一种非常重要的技术,它允许程序同时执行多个任务,从而提高了应用程序的响应性和整体性能。本文将详细介绍C#中的多线程编程,包括基本概念、线程创建、线程同步以及相关的代码示例。 一、基本概念 线程是操作…

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN二: 如何训练模型,内附详细损失、准确率、均值计算

手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN(新手适用)一: model.py:创建模块-CSDN博客 从零开始实现一个基于Pytorch的卷积神经网络 - 知乎 目录 1 设备device定义 2 训练模型定义 3 开始训练 3.1 step、batch…

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解

机器学习-十大算法之一线性回归算法案例讲解 一摘要二个人简介三什么是线性回归四LinearRegression使用方法五糖尿病数据线性回归预测1.数据说明2.导包3.导入数据4.脱敏处理5.抽取训练数据和预测数据6.创建模型7.预测8.线性回归评估指标9.研究每个特征和标记结果之间的关系.来分…

职场成功的关键:提升软实力,成就非凡事业

在竞争激烈的职场中,专业技能固然重要,但软实力同样不可或缺。要想在职场中脱颖而出,实现事业上的成功,我们需要在提升软实力上下功夫。本文将探讨职场软实力的内涵及其在职场成功中的作用,并提供一些建议,…

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:timescale 1,一直走下来,在modelsim中出现了下面问题2,rtl文件、tb文件2.1,rtl代码2.2,tb测试2.3&a…

java Web实现用户登录功能

文章目录 一、纯JSP方式实现用户登录功能(一)实现思路1、创建Web项目2、创建登录页面3、创建登录处理页面4、创建登录成功页面5、创建登录失败页面6、编辑项目首页 (三)测试结果 二、JSPServlet方式实现用户登录功能(一…

校园通勤车可视化系统的设计与实现

1.需求分析: 校园通勤车可视化系统的设计与实现,不用管什么可视化,就是一个小程序就是可以知道校园车的路线,然后往简单了弄就可以。 校园通勤车可视化系统的设计与实现,不用管什么可视化,就是一个小程序…

【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【threejs】较大物体或shape的贴图较小问题处理方法

问题 有的场景内相对体型差距过大的物体(如山地 海洋等)由于尺寸问题,加载贴图过于小,同时shader也无法完全展示,如图 我们可以获取物体的uv,进行缩放使得贴图可以完全展开 如果uv是乱的 可以用xyz坐标最…

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁👊 总结了一篇【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 💝 前言 今天在登录redis时&#xff0c…

matlab函数化简和函数极限

文章目录 化简求函数极限泰勒公式泰勒公式求解 化简 simplify 函数是MATLAB中符号计算工具箱提供的一个函数,用于简化数学表达式。它可以根据预定义的简化规则,对给定的数学表达式进行简化和转化。 以下是simplify 函数的一些常用用法: 简…