深入理解JVM-垃圾回收详解

1. 概述

Java内存运行时区域的各个部分,程序计数器虚拟机栈本地方法栈3个区域随线程而生,随线程而灭.

对每一个栈帧,其分配多少内存都基本是在类创建的时候就确定好的因此这几个区域的内存分配和回收都具备确定性,这几个区域就不需要考虑如何回收.

Java堆方法区这两个区域则有很明显的不确定性(如一个接口的多个实现类的内存可能不一样,一个方法所执行的不同条件所需要的的内存也可能不一样),只有处于运行期间才知道,因此这部分的分配和回收是动态性的

在这里插入图片描述

2.1 引用计数与可达性分析算法

在这里插入图片描述

2.2 引用的四种类型

在这里插入图片描述

2.3 finalize方法

一个对象的死亡最多会经历两次标记的过程.

如果对象在进行可达性分析后发按下没有与GC Roots相连接的引用链,那它将会被第一次标记.

随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法.

如果有必要执行,将对象放在F-Queue队列中,由一条优先级低的Finalizer线程去执行对象的finalize()方法.

finalize方法中可通过与引用链上的任何一个对象建立关联从而使对象避免被回收,在第二次标记时就会被移除"即将回收"集合, 但只能有一次"免死"机会

如果执行完finalize方法对象还没逃脱,基本上就要被真的回收了.

2.4 回收方法区

方法区中垃圾收集主要回收两部分内容: 一、废弃的常量 二、不再使用的类型

判断一个常量是否废弃比较简单,但判断一个类可被回收的条件很苛刻.

在这里插入图片描述

在大量使用反射、动态代理、GCLib等字节码框架,动态生成JSP以及OSGi这类频繁自定义类加载器的场景中, 通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压力.

3.1 垃圾收集算法

从如何判定对象消亡的角度触发,垃圾收集算法可以划分为"引用计数式垃圾收集(直接垃圾收集)"和"追踪式垃圾收集(间接垃圾收集)"两大类

追踪式垃圾回收(间接垃圾收集)算法分为三大类, 标记-清除标记-复制标记-整理

在这里插入图片描述

3.2 垃圾回收器

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浔汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值