当前位置: 首页 > 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; ”这块自…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…...