当前位置: 首页 > news >正文

垃圾收集器与内存分配策略

内存分配和回收原则

对象优先在Eden区分配

大对象直接进入老年代

长期存活的对象进入老年代

什么是内存泄漏

不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出

自动垃圾回收与手动垃圾回收

自动垃圾回收:由虚拟机来自动回收对象,优点是降低程序员实现难度;可能无法及时进行内存回收;

手动垃圾回收:由程序员实现对象的删除,优点是能够及时回收内存,编写不当可能会出现空指针,重复释放,内存泄漏的问题

线程私有区域的垃圾回收

线程私有的部分,是随着线程的创建而创建,随着线程的销毁而销毁,方法的栈帧在执行完方法之后会自动弹出栈并释放掉内存。

方法区的回收

方法区回收的内容主要是不再使用的类

判定一个类是否能够卸载,需要满足这几个条件:

1、此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。

2、加载该类的类加载器已经被回收。

3、该类对应的 java.lang.Class 对象没有在任何地方被引用。

堆回收

如何判断能否回收

Java中的对象能否被回收,根据对象是否被引用决定,如果对象被引用了,说明对象还在使用,不允许回收。那怎么判断对象有没有被引用呢?常见的有两种判断方法,引用计数法和可达性分析法。

引用计数法为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1

优点是使用简单,缺点有两个,一个是每次引用和取消引用需要维护引用计数器,对系统性能有一定影响。另一个是存在循环引用的问题,当对象A应用对象B,B引用对象A时,会出现对象无法回收的问题。

可达性分析算法是指通过GC Roots对象作为起点,从这些节点向下搜索,节点所走过的路径称为引用链,当一个对象到GC Roots之间没有任何引用链相连,那么该对象是可以被回收的,否则不能被回收。

 可被当作GC Root对象有哪些呢?

线程Thread对象。

系统类加载器加载的java.lang.Class对象。

监视器对象,用来保存同步锁synchronized关键字持有的对象。

本地方法调用时使用的全局对象。

几种常见的对象引用

强引用:当我们声明一个变量并指向某个实例时,就是强引用,存在强引用关系的对象是不会被回收,内存空间不足时候,会抛出OutOfMemoryError

软引用:是指在内存不足时回收,当内存空间不足时,垃圾回收器会回收它。

弱引用:当垃圾回收器发现只具备弱引用的对象,不论是否内存充足,都会回收它

虚引用:不能通过虚引用对象获取到包含的对象。作用是当对象被垃圾回收器回收时可以接收到对应的通知。

垃圾回收算法

标记-清除算法

标记可达对象(即存活对象),清除未被标记对象;缺陷有两点,效率低和造成内存碎片

复制算法

将内存分成两部分,每次只使用其中一部分,当使用完毕,将存活对象复制到另一部分,然后清除掉使用过部分

缺陷有两点,内存变小;不适合老年代(老年代存活对象多,复制性能差)

标记-整理算法

标记存活对象,将存活对象向另一端移动,清理掉边界外内存;优点:避免内存碎片;缺点:如果存活的对象多,移动耗时长;因此标记-整理算法适合老年代:因为老年代对象生命周期较长,会产生大量的内存碎片

HotSpot虚拟机为什么要分为新生代和老年代

可以依据各个年代特点进行垃圾回收,新生代,每次垃圾收集,大量对象会死去,因此采用标记-复制算法,只需复制少量存活对象。老年代,对象存活时间久,因此使用标记-清除算法,清除少量死亡对象,或者标记-整理算法

分代假说

1.弱分代假说:大多数对象存活时间短。

2.强分代假说:熬过越多次的垃圾回收,就越难以被回收。

3.跨代引用假说:跨代引用的对象占少数。

垃圾收集器

垃圾收集器有哪些?

Serial:新生代收集器,采用标记-复制算法

Serial Old:老年代收集器,采用标记-整理算法

ParNew:新生代多线程并行收集,Serial多线程版本,使用标记-复制算法

Parallel Scavenge:新生代多线程收集器,采用标记-复制算法,专注于吞吐量。(吞吐量 = 运行用户代码时间 / (运行用户代码时间+垃圾收集时间) ),其他收集器则关注于用户停顿时间。

Parallel Old:老年代收集器,Parallel Scavenge老年代版本,采用标记-整理算法

CMS收集器

步骤:1.初始标记:标记与GC Roots直接关联的对象;2.并发标记:遍历整个对象图;3.重新标记:并发标记期间,用户线程继续运行,会导致一部分标记变动,因此需要修正;4.并发清除:清除死亡对象;

缺点:占用一部分线程的资源;并发清除阶段,用户线程继续运行,此时也会产生垃圾对象,导致无法清除,这部分垃圾称为浮动垃圾;采用标记-清除算法,产生内存碎片,内存碎片多了之后,就无法给大对象分配内存,因此full GC会更加频繁。

Garbage First收集器:之前的收集器垃圾回收的范围很大,(新生代,老年代,Java堆),而这个收集器将Java堆分成很多个相等大小的Region,Region可以扮演新生代空间,或者是老年代空间,而垃圾回收时候,回收的标准是哪块垃圾多,回收价值高,就回收哪块。

步骤:1.初始标记:标记与GC Roots直接关联的对象;2.并发标记:遍历整个对象图;3.最终标记:处理并发标记期间遗留的记录;4.筛选回收:对Region按照回收价值排序,考虑用户停顿时间,制定回收计划,进行回收;

JDK8默认垃圾收集器

Parallel Scavenge(新生代) + Parallel Old(老年代)

未完待续

相关文章:

垃圾收集器与内存分配策略

内存分配和回收原则 对象优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 什么是内存泄漏 不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出 自动垃圾回收与手动垃圾回收 自动垃圾回收:由虚拟机来自动回收对象…...

Python计算三角形的面积

Python 计算三角形的面积 以下实例为通过用户输入三角形三边长度,并计算三角形的面积: # 三角形第一边长 a 3 # 三角形第二边长 b 4 c float( input("输入三角形第三边长: ") ) # 计算半周长 s (a b c) / 2 # 计算…...

198.【2023年华为OD机试真题(C卷)】万能字符单词拼写(JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-万能字符单词拼写二.解题思路三.题解代码Pytho…...

Tomcat服务为什么起不来?

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 服务跑在Tomcat下面,有时候会遇到Tomcat起不来的情况。目前为止常遇到的情况有如下几种: 1. Tomcat服务…...

计算机网络 VLAN

路由器将多个局域网连接起来,而交换机将一个局域网里的设备连接起来。 路由器的端口分配局域网的网段(子网网段),局域网的内部设备的ip都在这个网段里,再由交换机将数据派发到目的设备,交换机是按照MAC地址…...

docker搭建Dinky —— 筑梦之路

简介 Dinky 是一个 开箱即用 、易扩展 ,以 Apache Flink 为基础,连接 OLAP 和 数据湖 等众多框架的 一站式 实时计算平台,致力于 流批一体 和 湖仓一体 的探索与实践。 主要功能 其主要功能如下: 沉浸式 FlinkSQL 数据开发&#x…...

Python基础(十四、数据容器之集合Set)

文章目录 一、集合语法二、集合的基本操作添加元素删除元素随机删除元素,可获得删除的值清空取出2个集合的差集消除2个集合的差集合并2个集合集合元素个数查询元素是否存在 遍历集合集合的遍历 什么是数据容器? 数据容器是Python中用于存储和操作数据的对…...

OpenHarmony之HDF驱动框架

概述 HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在…...

深入浅出理解TensorFlow的padding填充算法

一、参考资料 notes_on_padding_2 二、TensorFlow的padding算法 本文以TensorFlow v2.14.0版本为例,介绍TensorFlow的padding算法。 tf.nn.conv2d # https://github.com/tensorflow/tensorflow/blob/v2.14.0/tensorflow/python/ops/nn_ops.py#L2257-L2361paddi…...

TDD-LTE 附着流程和去附着流程

目录 1. 附着流程 1.1. 正常附着流程 2. 异常附着流程 2.1 RRC建立失败 2.2 核心网拒绝 2.3 eNodeB未收到初始化上下文建立请求 2.4 RRC重配置请求丢失 2. 去附着流程 2.1 非关机去附着流程 2.1.1 连接态非关机去附着 2.1.2 空闲态非关机去附着 2.2 关机去附着流程 …...

[Angular] 笔记 23:Renderer2 - ElementRef 的生产版本

chatgpt: Renderer2 简介 在 Angular 中,Renderer2 是一个服务,用于处理 DOM 操作的抽象层。它提供了一种安全的方式来操作 DOM,同时与平台无关,有助于维护应用程序的跨浏览器兼容性和安全性。 Renderer2 的作用是在 Angular 组…...

WEB:探索开源OFD.js技术应用

1、简述 OFD.js 是一个由开源社区维护的 JavaScript 库,专注于在浏览器中渲染和处理 OFD 文件。OFD 作为一种开放式的文档格式,被广泛应用于电子政务、电子合同等领域。OFD.js 的出现为开发者提供了一个强大的工具,使得在前端实现 OFD 文件的…...

平方根,又叫二次方根,表示为〔√ ̄〕

正在加载中... 平方根,又叫二次方根,表示为〔√ ̄〕,如: 平方根,又叫二次方根,表示为〔√ ̄〕,如:数学语言为:√ ̄164。语言描述为&…...

Springer Latex正文参考文献样式改为数字

用过爱斯唯尔的latex,正文参考文献都是数字,第一次用Springer Latex的参考文献竟然是authoryear,如下: 将这种样式变回序号样式: (1)使用这个documentclass(此为双栏) …...

六、typescript泛型使用

1.identity函数,这个函数会返回任何传入它的值,可以看作是echo命令 function identity(arg:number):number {return arg }或 使用any类型会导致这个函数可以接收任何类型的参数,这样会丢失一些信息,传入与返回类型应该是相同的 有…...

【快慢指针】26.删除有序数组中的重复项

题目 法1&#xff1a;快慢指针 基础解法&#xff0c;必须掌握&#xff01;&#xff01;&#xff01; class Solution {public int removeDuplicates(int[] nums) {if (nums.length < 2) {return nums.length;}int slow 0, fast 1;while (fast < nums.length) {if (n…...

爬虫工作量由小到大的思维转变---<第三十一章 Scrapy Redis 初启动/conn说明书)>

前言: 重点在读connection.py的源码,这个组件主要是用来连接的; 因为连接都无法做到,后面想更改点自定义就白扯了; 正文: 翻译版的connection.py源码: import sys import six from scrapy.utils.misc import load_object from . import defaults# 快捷方式映射 设置名称 -&…...

2023年山东省职业院校技能大赛高职组“软件测试”赛项-单元测试报告答案

任务四 单元测试 目录 任务四 单元测试 题目1: 题目2: 题目3:<...

Matlab论文插图绘制模板第133期—函数极坐标折线图

在之前的文章中&#xff0c;分享了Matlab函数折线图的绘制模板&#xff1a; 函数三维折线图&#xff1a; 函数网格曲面图&#xff1a; 函数曲面图&#xff1a; 函数等高线图&#xff1a; 函数等高线填充图&#xff1a; 进一步&#xff0c;再来分享一下函数极坐标折线图。 先来…...

如何用 GPT 去分析Excel数据

背景 需要尝试分析 Excel 的内容&#xff0c;每月都需要进行相关的分析&#xff0c;固定化流程&#xff0c;因此尝试制作固化的脚本&#xff0c;方便后续的分析。 执行步骤 帮我写一段 python 代码&#xff0c;我需要区分一个.xlsx的数据。格式示例如下&#xff1a; ”这块自…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…...