GC垃圾回收机制学习日记一

伯德图逆向工程:用MATLAB从扫频数据中提取系统特性的5个关键步骤 本文详细介绍了使用MATLAB从扫频数据中提取系统特性的5个关键步骤,包括数据预处理、频响特性提取、相位解缠绕、系统特性反演和结果验证。通过伯德图逆向工程技术,工程师可以有效分析黑箱系统的频率响应特性,解决噪声干扰和相位跳变等实际问题,提升控制系统调试效率。 阅读详情

聊到Java中的GC垃圾回收机制,必定离不开Java JVM中的内存模型及Java对象的生命周期,学习GC机制前我先简单了解了一下Java的内存模型。

一、Java内存模型

    将Java内存简化后,大致分为三个分区:虚拟机栈(线程栈)、Java堆、方法区。

    一、虚拟机栈(VM stack),线程私有,在线程在同一时间创建,管理Java方法执行的内存模型,每个方法执行时都会在对应的线程中的线程栈中创建一个栈帧,这个栈帧主要保存了:局部变量表、操作数栈、动态链接方法,返回地址信息等,当一个方法执行结束后,对应的栈帧中基本类型数据或者对象的引用会被立即释放。栈的大小也代表一个请求对应的最大深度,一个方法中如果存在过多的局部变量,会影响到栈帧的大小,而栈的最大深度也就是线程栈的大小/栈帧的大小,如果请求的深度超过了栈的深度,就会抛出Stack OverflowError异常,这种问题常出现在递归方法,或者大量方法嵌套的环境中。一般栈的大小在线程创建时已经固定,也存在动态扩展的线程栈,但这种方式需注意,当栈进行扩展但是空余的内存不足,无法支持扩展就会抛出OutOfMemoryError异常

    (具体的栈帧的描述可以参考:https://www.cnblogs.com/Codenewbie/p/6184898.html)

     二、Java堆(Java heap),线程共享,用于存储Java对象实例和数据,GC垃圾回收的主要区域,堆主要分为新生区以及养老区。

    新生区:具体划分为:Eden,Survivor(此处包括两个区域:to survivor,from survivor),用于保存新建的对象(过大的数组创建后会被保存至养老区)及年轻的对象,新建及年轻的对象生灭比较频繁,此处GC采用的回收算法为复制(coping)算法,此处的GC被称为YGC(Young GC),也被称为Minor GC,执行速度快。在经过足够多的YGC回收之后,生存时间足够长的对象会被保存至养老区。

    新生区中的Eden space和两个Survivor space(下面简称S0,S1,这两块中会保证一块内存区域为空,另一块保存对象),对象创建时会被存放在Eden中,当YGC触发时,GC会清除不被引用/不可达的对象,然后将Eden和保存对象的survivor区S0中的存活对象,复制保存至S1区域中,清空S0、Eden,然后等下一次YGC触发时,会将Eden、S1的存活对象复制到S0中,经过足够多的YGC后,仍然存活的对象说明对象比较稳定,将对象存至养老区中。

    养老区:用于保存生存时间足够的对象及过大的数据,此处数据的稳定性较强(经过新生区的多次GC,存活的对象说明一直被引用),当养老区内存被完全占用后,会有一次全量的GC,此处的GC采用的回收算法为标记-清除(Mark-Sweep)算法。此处的GC被称为Major GC。

    上面说到了GC回收的两种算法1、复制算法,2、标记-清除-压缩算法,下面会叙述一下两种算法的实现思想及新生区和养老区为何选择两种算法的理由。

    1、标记-清除算法:从根节点gc root根据引用关系来遍历整个堆,并作标记,所有不可达/未被引用的对象上不存在标记,之后回收掉未标记的对象,此处存在两种实现:1:标记-清除,即标记—扫描—清除,这种GC实现会导致内存的不连续,较多的空间碎片会导致内存使用率过低;2、标记-压缩,即标记—扫描—压缩—清除,标记的过程未变,标记完成后,扫描所有的对象,将所有被标记的有效对象压缩至划定的内存的顶部,然后根据有效对象和无效对象的边界,清除所有不可达的对象,不过整理压缩的速度比较慢。

    2、复制算法:首先仍然是标记有效对象的过程,然后将Eden和S0(即当前两块survivor中保存对象的内存区域)中的有效对象,通过复制的方式,移动到S1(即当前为空的survivor区域),然后每次GC都会重复以上的操作,这样处理不会存在内存碎片,但对内存区域结构有对应的要求。

    因为新生区中的对象生灭比较频繁,一次回收可能需要回收掉大部分的对象,当使用标记-清除算法时,会存在内存碎片过多或者是压缩时间过长的问题,而通过复制算法,通过两块survivor区的复制操作,来消除内存中的大量碎片,来降低新生区的GC回收时间。而养老区中大部分对象是经过多次Minor GC回收后存活的对象,此类对象的生灭并不频繁,产生的碎片也较少,整理的代价也比较小。

    关于Major GC、Full GC这两种GC,查阅了一些资料,某些资料中major GC和Full GC被记录在同一个概念中,而一些资料将两者拆分开,这里就不记录了。

    三、方法区,线程共享,线程安全,用于储存class的二进制文件,包括虚拟机加载的类信息、常量、静态变量、即时编译的代码等,又名为Non-Heap(非堆)。

    常量池:方法区中的一块内存,常量的储存位置,在编译期间将一部分的数据保存在该区域,包含基本类型如int、long等以final生命的常量值,和String字符串。

    静态区:方法区内的一块内存,用于存放类中的以static声明的静态成员变量

    Q:在方法中创建变量String demoStr = new String("Test!");说一下这行代码中的信息保存在JVM的那些区域?

    A:首先String demoStr这个局部变量名(String是引用对象,保存了内存地址)会被保存到虚拟机栈中的方法栈帧中的局部变量表,而通过new String(),创建的String对象会在堆中被创建,栈帧中保存的地址指向对堆内对应对象,而具体代码的信息则在方法区。若是新建局部变量为基本类型如int,此局部变量的值也会被保存在栈帧中。

注:每次GC操作都是STW(Stop-The-World)操作,即除了GC回收的线程,其他所有线程都处在等待阶段,如果最大STW过大会造成程序停顿


EZ-INSAR工具箱(使用历史问题) 把 rasterio 升到 1.3+(或退回 py39)→features能 import → 脚本能跑 → 出图 → MATLAB 不再报错! 阅读详情

相关推荐

大智慧L2实时api接口的逐笔委托功能执行代码分享

用过l2行情接口的投资者应该都了解大部分的接口都是有逐笔委托功能的,那么大智慧L2实时api接口也有着很强大的逐笔委托功能,投资者可以通过这个逐笔委托功能可以看到一个股票的每天出现的全部委托指令,那么在这个逐笔委托功能里包含了委托价格、委托时间、委托量和委托方向四个要素!那么接下来小编就分享一下大智慧L2实时api接口的逐笔委托功能执行代码!那么在这里提个醒:投资者可以在大智慧L2实时api接口进行设置过滤,在逐笔委托列表里,就仅仅只会显示超过设置委托量或委托额的委托单,而不再显示小单。

Qq_2037696191的博客 3732

Java垃圾回收机制

Java垃圾回收机制

zhangyan_1010的专栏 4052

NLP DAY1: 文本数据读取

txt 文本数据的读写CSV 及 Excel 文本数据的读写更多的 DataFrame 操作数据规模太大怎么办相信通过本次实验的学习,同学们可以游刃有余地面对各种数据文件了。在接下来的实验中,我们将开始真正地开启自然语言处理之旅,开始认识并熟悉一些常见的针对文本本身的预处理操作。

feifeikon的博客 1058

Java垃圾回收机制(GC)

1.垃圾回收算法 1)标记清除算法: 标记:先进行扫描,将已存活的对象进行标记; 清楚:对堆内存进行遍历,回收没有标记的对象; 缺点:清楚后会产生大量不连续的内存碎片,也就是碎片化问题;这个问题可能导致后续创建较大的对象时无法找到足够的连续空间继而再次触发垃圾回收。 2)复制算法:将可用内存分为对象面和空闲面,在对象面上创建对象,若对象面满,就将还存活的对象复制到空闲面,然后将对象面的所有对象清楚。 这个算法解决了碎片化的问题,特别使用Eden区,因为Eden区对象的存活率很低,所以所需复制的对

w7486的博客 3516

《统计学习方法》——李航 学习大纲

最近在学习李航写的统计学习方法概论, 每一章都用xmind理清了思路,括号里是书里的公式,第一次写博文,敬请指教~~~~ 第一章 统计学习方法论 第二章 感知机 每个方法其实只需要着重掌握三要素和输入输出就可以了,主要看模型、策略和算法。 感知机主要是二类分类的线性分类模型。 看到后面会注意感知机和支持向量机的区别。 第三章 k近

wjy619251334的博客 1万+

爬取中国空气质量在线监测分析平台

1.准备,爬取的链接地址 https://www.aqistudy.cn/html/city_detail.html 2.分析 a.当打开链接后,数据已经设置好了,说明里面大部分都是js通过ajax调用的, b.打开f12分析代码 通过捕获到的数据包,发现当前请求为ajax,携带着一个为d的参数且该请求携带的数据是加密过的,并且响应也是加密过的 c.这时候的问题就是...

Mr Right 6370

详解Java垃圾回收(GC)机制

最基本、发展历史最久的收集器,这个收集器是一个采用复制算法的单线程的收集器,单线程一方面意味着它只会使用一个CPU或一条线程去完成垃圾收集工作,另一方面也意味着它进行垃圾收集时必须暂停其他线程的所有工作,直到它收集结束为止。反之,若对象覆盖了finalize方法并且该finalize方法并没有被执行过,那么,这个对象会被放置在一个叫F-Queue的队列中,之后会由虚拟机自动建立的、优先级低的Finalizer线程去执行,而虚拟机不必要等待该线程执行结束,即虚拟机只负责建立线程,其他的事情交给此线程去处理。

s44359487yad的博客 2827

【MATLAB】绘制泽尼克多项式

上次只给了公式没有给代码,很多小伙伴表示不是很认可。今天直接把代码发上来了。

HPC_ZY 5576

【JVM】万字长文!深入详解Java垃圾回收(GC)机制

如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

陈宝子的博客 6705

Qt/C++音视频开发1-vlc解码播放

一、前言 最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt+vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。 所有用vlc做视频监控解码的人都会遇到一个问题,那就是鼠标事件被接管拦截了,不能识别鼠标事件,比如双击最大化等,这就很憋屈了,明明很好用的一个东西,怎么突然之间鼠标事件

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 4938

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

Java GC回收机制是怎么回事?

最早的话是用一种计数法。也就是在堆中有一个类似计数器的东西来判断这个堆中的对象是否还有没有人引用。如果计数器清零,则判断为此对象是无用的了,可以回收清除了。计数器法就类似这种,听其他大佬说python依然沿用这种回收机制。但是Java可能会出现对象间的互相引用,用这种方法就不行了。比如下图:可能比喻的不是很恰当,但道理是这样的。后来意识到这个问题后就出现了我们的寻根法,根据对象一直往下找,找到最底层有没有栈对象引用。

m0_58907154的博客 439

【FastDDS】Discovery ( 01-overview )

Fast DDS 提供了多种发现机制用于自动匹配数据写入器和读取器,包括简单发现(默认兼容RTPS标准)、静态发现(可跳过SEDP阶段)、集中式的发现服务器架构以及手动RTPS发现。发现过程分为参与者发现(PDP)和端点发现(EDP)两个阶段,PDP通过多播/单播公告确认参与者存在,EDP则匹配主题和数据类型相同的端点。系统支持配置发现协议、租约期限等通用参数,以及各机制特有设置如静态EDP XML配置、服务器定位器等。此外还支持通过监听器实现发现回调功能。

Ray Home 719

java垃圾回收机制简称,2018-03-09 GC垃圾回收机制学习日记一

看到Java中的GC垃圾回收机制,必定离不开Java JVM中的内存模型及Java对象的生命周期,学习GC机制前我先简单了解了一下Java的内存模型。一、Java内存模型将Java内存简化后,大致分为三个分区:虚拟机栈(线程栈)、Java堆、方法区。一、虚拟机栈(VM stack),线程私有,在线程在同一时间创建,管理Java方法执行的内存模型,每个方法执行时都会在对应的线程中的线程栈中创建一个栈...

weixin_42391485的博客 113

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java面试-G1 垃圾回收器的特点:Region、Mixed GC

《Java面试200问》系列聚焦G1垃圾回收器的核心机制,深入解析Region内存划分与Mixed GC混合回收策略。文章通过技术演进对比,揭示G1作为"分代式区域收集器"的创新设计:将堆内存划分为等大Region实现并行回收,运用Remembered Set解决跨代引用问题,采用Mixed GC动态混合回收新生代和老年代Region。配套提供GC日志分析指南、关键调优参数及面试高频问题解析,帮助开发者掌握这款平衡吞吐量与低延迟的JVM垃圾回收器。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java学习日记13——内部类、局部类、匿名类、以及垃圾回收机制

Java学习日记13——内部类和匿名类、以及垃圾回收机制 对象清楚和垃圾回收机制  Java具有自动的垃圾回收机制和对象清楚管理,所以基本不需要手动进行操作,也不需要使用delete语句删除对象,Java会自动分辨对象是否被使用,从而做到自动释放内存。另外,如果执行的程序或者线程太多,那么可能需要使用System.gc()方法建议系统进行垃圾回收和清理,当然这里的gc()方法仅仅只是建议系统进行,实在系统有能力实现的情况下自动进行,也不是手动进行释放。 内部类 Java的内部类,即是在类中再定义类,那么这样

Andy24.的博客 636

GC回收日记

GC查找垃圾的办法? 引用计数法(java没用这种算法) 当类被引用的时候,counter+1,当减少引用的时候,counter-1,当counter为0的时候,类没有被引用。由于会出现循环引用导致counter一直相加,导致对象不能回收。所以,Java没有采用这种算法。 可达性分析法(根搜索算法,Java采用的这种算法) 根搜索算法,就是从root上开始查找那么没有引导用的对象,都是垃圾对象。...

独立开发者 242

Java基础---JVM垃圾回收机制

一些基础概念问题就不写了此处略去一万字,一个小萌新的自我救赎之路哈哈哈 1、GC算法(垃圾回收器是算法的落地实现) 文章目录1、GC算法(垃圾回收器是算法的落地实现) 1.引用计数 2. 标记清楚 ...

池海 542

学习日记2

经过与同事的探讨,和自己的检查。就昨天的日记,有几个错误地方,做出叙述,如下: 首先是字面叙述。前文所叙述的文档注释符格式应为(/*注释符/.) 之后在运行Javadoc时,eclipse导出javadoc,今天没有出现了错误。我上网查了一下。并没有什么第三方注释。@see@version等注释也只是eclipse里自带的注释方式。 昨天有位同事跟我说。IDE可以直接导出doc注释。首先我以为这是...

Vae_jiangwen的博客 213

Java学习日记 2022.6.27

Java学习日记

不想取名字的博客 687

JVM学习日记:垃圾收集算法(一)

垃圾回收算法

weixin_42982603的博客 277

JVM学习日记(八)Day8

本文主要探讨Java垃圾回收机制中的关键概念。首先解释了GC不能并发执行的原因:可达性分析需要系统快照,必须暂停用户线程以避免标记错误。重点介绍了安全点和安全区机制,指出JVM会在方法调用、循环结束等安全点检查GC条件,而安全区则允许阻塞线程不受检查。文章还详细分析了四种引用类型:强引用(默认方式)、软引用(内存不足时回收)、弱引用(下次GC回收)和虚引用(监控对象回收)。特别说明了虚引用必须搭配引用队列使用,用于资源清理。最后提及终结器引用是JVM内部实现finalize()方法的机制。这些机制共同保障了

Java球球憋卷啦🥵 1408

憨批豪java成长日记-jvm相关

1. 内存模型以及分区 栈区: 栈分为java虚拟机和本地方法栈. 重点是java虚拟机,线程是私有的.生命周期与线程相同. 每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等, 每个方法从被调用,直到被执行完,对应着一个栈帧在虚拟机中从入栈到出栈的过程. 通常说的栈就是指局部变量表部分,存放编译期间可知的8种基本数据类型,以及对象引用和指令地址.局部变量表是在编译期间完成分配,当进入一个方法时,这个栈中的局部变量分配内存大小是确定的. 当线程请求栈深度大于虚拟机所允

wtfwifi的博客 163

理解GC日志 -- GC常用命令与GC结果解读

理解GC日志 – GC常用命令与GC结果解读 GC结果解读 阅读GC日志是处理java虚拟机内存问题的基础技能,每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都不一样。但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定 的共性,例如以下两段典型的日志: [GC (System.gc()) [PSYoungGen: 19712K->760K(384...

Mr.hu 1732

JVM读书日记2(垃圾收集器与内存分配策略)

对象已死? 引用计数器 在对象中添加一个引用计数器,没到有一个地方引用它时,计数器值+1,引用取消计数器值减一。 要额外消耗内存,并且考虑情况要更多比如循环引用,A调用B,B调用A。 可达性分析法 核心“GC roots”,以GC roots为起始点的集合,从这些节点开始根据引用关系向下搜索,走过的路径称为引用链。 什么样的对象可以作为GC roots 1) 在虚拟机栈中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等 2) 在方法区中类静态属性引用的对象,如java类的引

qq_39734254的博客 192

C#学习日记

一、基础概念回顾:值类型变量,通常分配在。intfloatcharboolenum自定义结构体引用类型变量,实际数据位于。string(虽然看起来像值,但本质是引用类型)数组、类class接口interface、委托delegate📌 结构体(struct)是值类型,类(class)是引用类型。可以参考下面这篇博客二、如何判断类型是值类型还是引用类型F12查看类型定义,是struct就是值类型,是class就是引用类型。new三、变量生命周期临时变量。

weixin_66584806的博客 807

阿里招聘成长日记2:第一天:java的GC机制

第一天:java的GC机制1.GC简介2.内存回收方式2.1. 引用计数2.2. 停止-复制2.3. 标记-删除3.java GC具体工作原理:4.关于对象的finalize()方法: 1.GC简介   GC:垃圾回收站,是将java的无用的堆对象进行清理,释放内存,以免发生内存泄露。在介绍java回收站前,首先介绍下几种回收机制 2.内存回收方式 2.1. 引用计数   当一个对象A被其他对...

七月向阳,秋千之上的博客 147
上一篇: 面试随笔——记录一些面试中碰到的问题(初级/中级Java开发)
下一篇: Mybatis+Spring配置学习日记
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值