垃圾收集与内存分配---笔记

1.概述

我们为什么要了解GC和内存分配呢?
当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集为系统打到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。

2.对象已死吗?

2.1 引用计数
给对象添加一个引用计数器,每当有一个地方引用它时,计数器+1,引用失效计数器-1;任何时候计数器为0的对象就是不可能再被使用。这有个问题是,两个对象相互引用导致两个对象都无法被回收。
2.2 可达性分析
通过一系列的GC Roots对象作为起点,从这些节点开始向下搜索。搜索所走过的路称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象不可用。
可作为GC Root的对象有:
虚拟机栈(栈帧的本地变量表)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用对象
即使在可达性分析中不可达的对象,也并非是“非死不可”,这时候他们暂时处于“缓刑”阶段。要真正宣告一个对象死亡,需要经历两个阶段:
(1)如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
(2)如果这个对象呗判断为有必要执行finalize()方法。那么这个对象会被放到一个F-Queue队列中,并在稍后由一个虚拟机自动建立的、优先级低的Finalizer线程去执行它,这里的“执行”是指虚拟机会触发这个方法,但并不承诺等待它运行结束。这是为了防止finalize()方法执行缓慢使得F-Queue队列其他对象永久等待。
因此,对象可以在finalize()方法里把自己赋值给一个变量,以达到“自救”的目的,但是这样的“自救”只能用一次(虚拟机只会调用一次finalize()方法)。—使用try-finally或者其他方式都可以做的更好,建议不要用finalize()。

3.垃圾收集算法

3.1 标记-清除
分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。标记过程在上面介绍过了。
不足:
1.标记和清除两个过程效率不高
2.标记清除后产生大量不连续的内存碎片。
该算法主要用在老年代区域。
3.2 复制算法
将内存分为两部分,每次使用其中一块,当这块内存用完,就将还存活的对象复制到另一块上面,然后再把已使用过的内存控件一次清理掉。
不足:
浪费一半内存
通常用在新生代区域中,有个改进的方法是将新生代分为Eden、From Survivor、To Survivor。
3.3 标记-整理
标记过程和标记清除一样。但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象向一端移动,然后清理掉端边界以外的内存。
主要用在老年代区域。

4.内存分配与回收策略

4.1对象优先在Eden分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。
4.2大对象(需要大量连续内存空间的java对象:很长的字符串以及数组)直接进入老年代
4.3长期存活的对象将进入老年代:虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象自Eden出生并经过第一次Minor GC后仍然存活,或者能被Survivor容纳的话,在Survivor区中每”熬过“一次Minor GC,年龄就增加1岁,当到一定阀值,则晋升为老年代。

5.垃圾收集器

5.1
Serial收集器:对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得更高的单线程收集效率。
5.2
ParNew 收集器:ParNew收集器除了多线程收集之外,其他与Serial收集器相比并没有太多创新之处,但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器。其中一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作。
5.3
Parallel Scavenge收集器:Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能第缩短垃圾收集时用户线程停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。
5.4
Serial Old收集器:Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法,这个收集器的主要意义也是在于给Client模式下的虚拟机使用。
5.5
Parallel Old收集器:Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器在JDK1.6中才开始提供。
5.6
CMS收集器:CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目的的收集器。
运作过程:初始标记、并发标记、重新标记、并发清除。
5.7
G1 收集器:G1(Garbage First)收集器是当今收集器技术发展的最前沿成果之一。
优势:并行与并发、分代收集、空间整合、可预测停顿
运行步骤:初始标记、并发标记、最终标记、筛选回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值