Java垃圾回收机制分析

ch32v103xx 烧写 烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。 阅读详情


今天主要讲讲Java的垃圾回收机制,根据主题,本文将按照如下几个点进行分析:

一、什么是垃圾回收

        JVM垃圾回收是指回收存储在内存中且未被使用的Java对象所占用的空间。一般而言,Java对象被创建的时候,会在堆中开辟一块内存用于存储对象信息,因此我们说的垃圾回收一般是指回收堆中的垃圾,方法区也会存储一些垃圾,也会涉及到垃圾回收,本节暂不讨论。

二、为什么要回收垃圾

        由于内存资源比较匮乏,程序在运行过程中,需要不断的进行对象的创建,这些创建的对象需要内存空间进行保存,因此,需要将一些已经不再使用的对象回收,将回收的空间交给新创建的对象使用。

三、如何标定垃圾

        同其他的框架或算法一样,JVM对垃圾标定的算法也是不断的进化的。起先,JVM设计者采用引用计数法进行垃圾标定,由于引用计数法无法解决循环引用的问题,因此,JVM设计者采用了另外一种算法–可达性分析,来标定垃圾。

1.引用计数法

i)简介

        引用计数的意思是,如果某对象有被引用,则引用加1,取消引用,则引用减1,如果引用为0,表示该对象为垃圾,可被JVM回收。

ii)问题分析

class Count {
	Count obj;

	public static void main(String[] args) {
			// 创建两个对象
			Count obj_1 = new Count();
			Count obj_2 = new Count();
			// 引用
			obj_1.obj = obj_2; // 引用obj_2
			obj_2.obj = obj_1; // 引用obj_1
			// 指向为空
			obj_1 = null;
			obj_2 = null;
	}
}

        上述代码中,obj_1和obj_2对象都存在引用的关系,但是代码后部分通过将其指向空后,程序中无法再使用了对象obj_1和obj_2,因此,这两个对象可以被标定为垃圾,而引用计数法进行标定的时候发现,该对象存在引用的关系,可知,内存中存在两个无法被使用的对象,出现了内存泄漏问题。从引用计数结构图(下图1)可以看出,obj_1和obj_2存在引用的关系,但是外界却无法引用到obj_1和obj_2。
在这里插入图片描述
                                图1 引用计数结构图

2.可达性分析

        可达性分析是根据对象的可达状态进行垃圾标定的,它需要一个根节点(GC Root),然后通过根节点进行对象查找,如果能通过根节点找到的对象,表示该对象时可达到的对象,否则为不可达对象。Java垃圾回收的时候,会将不可达对象的内存回收。
在这里插入图片描述
                                                                图2 可达性分析结构图
        可达性分析结构图(如图2)中,蓝色表示可通过GC Root找到,灰色表示无法通过GC Root找到(注意:灰色对象之间也可以存在可达性状态,如:obj_6能够找打obj_9),灰色的为垃圾,需要被回收。

       一般而言,我们创建对象的方法有如下几种:

// 方式1
static ClassName STATIC_CN = new ClassName;
// 方式2
final static ClassName F_STATIC_CN = new ClassName;
// 方式3
private void testMethod() {
	ClassName cn = new ClassName();
}

方式1:静态变量指向一个对象;
方式2:静态常量指向一个对象;
方式3:局部变量执行一个对象;

因此GC Root的范围在本地方法栈、虚拟机栈和方法区中的对象中;

四、垃圾回收算法

1.标记-清除

2.标记-复制

3.标记-整理

4.复制算法

五、垃圾收集器

1.Serial

2.ParNew

3.Parrellel Scavenge

4.Serial Old

5.Parrellel Old

6.CMS

7.G1

【100%通过率】华为OD机试真题2026双机位C卷 C语言 实现【加密算法】 【100%通过率】华为OD机试真题2026双机位C卷 Python&JS 实现【加密算法】有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下 阅读详情

相关推荐

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 730

Parallel Scavenge收集器

Parallel Scavenge 特点 Parallel Scavenge收集器是一个新生代收集器,它也是使用【标记-复制】算法的收集器,并且并行的多线程收集。 CMS收集器 关注点是尽可能地缩短垃圾收集时用户线程的停顿时间 停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。 Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量(Throughput) 吞吐量是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运

summer_fish的专栏 751

Altium Designer 18 将Gerber文件逆向转换成PCB(详细记录)

自己看了网上的教程,弄了很久,估计还有不足的地方,但是先把思路理一理(初学AD) 同时遇到了许多问题: 不是AD导出的Gerber估计不能自动识别层 要自己设置层顺序 要有钻孔文件数据制作NC工具(我也不懂是怎么说,就是size尺寸的) 这里记录一下,以防忘记。 正常顺序: 1.新建CAM 2.导入Gerber,选择CAM文件夹下的所有文件导入 3.设置层属性和物理顺序 4.设置NC工具 5.提取网络表 ...

lb_monkey的博客 1万+

看完这篇垃圾回收,和面试官扯皮没问题了

前言 Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不用...

weixin_41385912的博客 1697

银河麒麟V10 SP3离线安装Nginx1.21.5全记录(附11个rpm包下载清单)

本文详细记录了在银河麒麟V10 SP3操作系统上离线安装Nginx 1.21.5的全过程,包括11个必备rpm包的下载清单。通过分步骤的实战指南,帮助用户在国产化环境中高效部署Nginx服务,涵盖安装、配置、调优及故障排查等关键环节,特别适合金融、政务等对安全性要求高的场景。

weixin_30872337的博客 605

XVF3800麦克风阵列实战:从选型到快速原型搭建

本文详细介绍了XVF3800麦克风阵列的选型与快速原型搭建实战经验。从开箱即用的特性到波束成形、回声消除等核心功能拆解,再到硬件设计避坑指南和固件开发技巧,帮助开发者高效实现智能语音设备的开发。特别适合智能音箱、会议终端等需要远场拾音和声源定位的应用场景。

weixin_29161719的博客 274

GC 垃圾回收算法

GC 垃圾回收

liuqinhou的博客 4946

独立游戏开发者必看:STEAM税务信息更新全流程(附中国区避坑指南)

本文为独立游戏开发者详细解析了Steam税务信息更新的全流程,重点针对中国区开发者提供了避坑指南。文章深入解释了W-8BEN表格的填写要点,并指导如何准备个人所得税纳税记录和身份证等核心证明文件,以确保顺利通过审核,避免收入被预扣税款。

tcp8optimizer的博客 1301

java8 parallel并行处理实战

需求 我需要做一个人员某几项数据的统计,由于数据量较大,不能一次性加载到内存进行统计。所以采用了遍历每个用户。当然也可以分配处理。 分析需求可得知,每个用户其实互不相关,数据的统计可以同步进行,因此考虑到并发执行。而java8刚好提供了这样的功能,对集合数据的并发执行parallel,所以有了以下测试 为加快统计速度尝试 原代码用时 2018-10-15 15:03:22.863 |-IN...

weixin_34279579的博客 705

【100%通过率】2024华为OD机试真题E卷 C++ 实现【栈数据合并/空栈压数】

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设: 栈顶至栈底整数依次编号为n1、n2...nx, n1为最新压入的整数)

MISAYAONE的博客 1553

基于FPGA的64点fft变换verilog开发

这精度的损失在10bits看来对最后的误差的影响是存在是不可忽略的。此后,在这思想基础上又开发了高基和分裂基等快速算法,随着数字技术的高速发展,1976年出现建立在数论和多项式理论基础上的维诺格勒傅里叶变换算法(WFTA)和素因子傅里叶变换算法。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

FPGA/MATLAB学习教程/源码/项目合作开发 1977

java基础总结(七十二)--java8中parallel使用注意事项

package test; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class noname { public static void main(String[] args) { List<Integer> l...

秋天的猿 2106

华为的LTC(Lead to Cash,从线索到现金)流程是其销售管理体系的核心,覆盖了从发现销售线索到最终收回现金的全过程,强调端到端的业务贯通和以客户为中心的运营理念

华为LTC流程是覆盖销售全周期的管理体系,包含四大阶段:线索转机会(LTO)、机会转订单(OTO)、订单转交付(OTD)、交付转现金(DTC)。其核心采用"铁三角"团队模式(AR/SR/FR协作),通过多部门联合评审把控关键节点,实现端到端业务贯通。该流程与IPD、MTL、ITR等体系高效协同,结合iSales平台实现数字化管理,有效提升销售效率、客户满意度和资金回笼速度。

金牌架构师 1724

Java的垃圾回收机制介绍、工作原理、算法及分析调优

Java的垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)提供的一种自动内存管理机制,用于自动回收不再使用的内存空间,以避免内存泄露和内存溢出等问题。下面主要介绍Java垃圾回收的基本概念、工作原理、算法等。

jackiendsc的博客 1995

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java内存结构与垃圾回收机制算法分析

什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的; 甚至这个虚拟机最初并非是为Java语言而开发的,它来源...

Leon_Jinhai_Sun的博客 281

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java垃圾回收机制 | 可达性分析,垃圾收集器

转自:Java垃圾回收机制 | 可达性分析,垃圾收集器 导读 一个对象的一生经历了什么? 如何判断对象是否可用? 引用计数法和可达性分析算法各有什么优缺点? 哪些对象可以作为GC ROOT? 垃圾回收的时候如何快速寻找到根节点?(安全点和OopMap) 垃圾回收算法有哪些?各有什么优缺点? 有哪些垃圾回收器?各有什么优缺点?适用什么场景 1、对象回收处理过程 2、判断用户是否可用算法 2.1、引用计数算法 如上图,给对象一个引用计数器refCount。每有一个对象引用它,计数器

hxc2101的博客 459

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

全面分析Java的垃圾回收机制

Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有...

amiao2014的专栏 241

java垃圾回收机制分析

java垃圾回收机制分析一、什么是java垃圾回收   Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆是由垃圾回收来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动

salonzhou的专栏 810

Java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析总结的属实到位

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。BAT面试经验实战系列:Spring全家桶+Redis等其他相关的电子书:源码+调优面试真题:《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》

2401_84152317的博客 947

Java-jvm垃圾回收机制算法分析

垃圾回收机制概述  Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。   ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对

魔法革1996 242
上一篇: 数据结构:约瑟夫问题Java实现
gd_2014
博客等级 码龄12年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值