垃圾收集器与内存分配策略
内存分配和回收原则
对象优先在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:快慢指针 基础解法,必须掌握!!! 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期—函数极坐标折线图
在之前的文章中,分享了Matlab函数折线图的绘制模板: 函数三维折线图: 函数网格曲面图: 函数曲面图: 函数等高线图: 函数等高线填充图: 进一步,再来分享一下函数极坐标折线图。 先来…...
如何用 GPT 去分析Excel数据
背景 需要尝试分析 Excel 的内容,每月都需要进行相关的分析,固定化流程,因此尝试制作固化的脚本,方便后续的分析。 执行步骤 帮我写一段 python 代码,我需要区分一个.xlsx的数据。格式示例如下: ”这块自…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000
目录 🌐 访问Web服务 💻 分析源代码 ⬇️ 下载图片并保留元数据 🔍 提取元数据(重点) 👤 生成用户名列表 🛠️ 技术原理 图片元数据(EXIF 数据) Username-Anarch…...