终结器引用上述图片的A4对象就是终结器引用
我们下面介绍终结器引用的概念:
- 终结器引用实际上是对象自己定义的finallize方法
- 终结器对象同样也需要绑定引用队列,因为他需要靠终结器对象来清除内部对象
- 如果我们希望清除终结器引用的对象,那么我们需要先将终结器引用对象导入到引用队列中
- 引用队列中同样也会一直检测是否出现终结器对象,若出现终结器对象 , 那么针对该终结器对象调用其内部对象的finallize方法删除
- 引用队列中检测终结器对象的优先级较低,所以效率相关而言比较慢
标记清除法我们首先给出简单图示:
文章插图
我们来做简单解释:
- 首先我们找出需要进行垃圾回收的部分并进行标记
- 然后我们将该标记地址部分清除即可(注意:这里的清除仅仅是记录起始地址和终止地址,然后在其他内存占用时再次覆盖)
- 执行速度极快
- 但会产生内存碎片,当内存碎片逐渐增多会导致问题
文章插图
我们来做简单解释:
- 首先我们根据Root标记出需要垃圾回收的部分
- 然后我们将垃圾回收的部分抛出之后,将后面的部分进行地址腾挪,使其紧凑
- 不会产生内存碎片 , 导致内存问题
- 速度较慢,同时整理过程中其他进程全部停止(因为会涉及内存地址重塑,进行其他进程可能会导致内存放置地址错误)
文章插图
我们来做简单解释:
- 我们准备两块完全相同的区间,将他们分为From和To区间
- 我们首先在from区间存储数据,我们直接进行垃圾回收判定
- 然后将需要保存的数据直接放入To区间,垃圾回收的部分不需要管理
- 最后我们将From和To区间的定义交换 , 将新添加的数据放入现在的From区间(之前腾挪的To区间)
- 不会产生内存碎片,相对而言比较迅速
- 但需要占用两块相同的地址空间,导致占用空间较多
分代垃圾回收机制介绍我们前面已经介绍了三种垃圾回收算法 , 但实际上我们的垃圾回收采用的是三种方法的组合方法:
文章插图
我们首先对大概念进行介绍:
- 新生代:用于存放新产生的内存数据,清除频繁
- 老生代:用于存放一直使用的内存数据,只有当内存占满时才会清理
- 伊甸园:用于存放所有的新产生的内存数据
- 幸存区From:用于存放未被垃圾回收的数据
- 幸存区To:用于进行未被垃圾回收的数据的复制方法
- 幸存值:用于表示内存数据的常用程度,所有内存数据进入时默认值为0 ,
- 首先我们的新数据都会进入到新生代的伊甸园中去,默认幸存值为0
- 当伊甸园数据满后,会进行gc , 这时我们进行标记清除法,将不需要的内存筛出
- 同时将幸存下来的内存数据放入到幸存区From,幸存值+1,同时进行From和To区间的对调
- 我们继续进行储存直到伊甸园再次占满,对整个新生代进行gc
- 首先将幸存区From的幸存内存放入To中并将伊甸园的幸存数据放入To,进行区间调换,幸存值+1
- 直到幸存值达到一个阈值(默认为6或者15),该内存数据就会被移动到老年代,新生代仍旧继续工作
- 直至新生代和老年代全部都占满后,这时我们就需要进行大型的垃圾回收 , 也就是我们之前提到的Full gc!
含义参数堆初始大小-Xms堆最大大小-Xmx 或 -XX:MaxHeapSize=size新生代大小-Xmn 或 (-XX:NewSize=size + -XX:MaxNewSize=size )幸存区比例(动态)-XX:InitialSurvivorRatio=ratio 和 -XX:+UseAdaptiveSizePolicy幸存区比例-XX:SurvivorRatio=ratio晋升阈值-XX:MaxTenuringThreshold=threshold晋升详情-XX:+PrintTenuringDistributionGC详情-XX:+PrintGCDetails -verbose:gcFullGC 前 MinorGC (小gc)-XX:+ScavengeBeforeFullGC分代垃圾回收案例展示我们通过一个简单的实例来展示分代垃圾回收的实际演示:
推荐阅读
- 黑莓q5用安装微信的方法a 用黑莓自带的印象笔记手敲的 看不懂的宝宝们在私聊我吧
- JVM学习笔记——内存结构篇
- 【lwip】08-ARP协议一图笔记及源码实现
- 小米笔记本Pro15增强版评测_小米笔记本Pro15增强版评测表现
- 用一台笔记本电脑如何赚钱(笔记本电脑赚钱的办法)
- 四 【单片机入门】应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
- 笔记本电脑CF中烟雾头怎么调(win10cf新版本烟雾保护头怎么调)
- 笔记本电脑配置高低怎么区分(笔记本电脑看什么配置判断好坏)
- pytorch、paddlepaddle等环境搭建 深度学习环境搭建常用网址、conda/pip命令行整理
- 三十九 Java开发学习----SpringBoot整合mybatis