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

来源:互联网 发布:win7 home 装sqlserver 编辑:程序博客网 时间:2024/06/06 23:50

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)收集器是当今收集器技术发展的最前沿成果之一。
优势:并行与并发、分代收集、空间整合、可预测停顿
运行步骤:初始标记、并发标记、最终标记、筛选回收。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 从上海调档案到杭州怎么办 户口迁移身份证变更护照怎么办 有中国签证的孩子怎么办户口 大学生户口在学校怎么办签证 户口在南方人才市场怎么办签证 报警电话接到说方言的怎么办 学生去新加坡旅游签证怎么办 出入境的受理编号不见了怎么办 职工下岗档案单位丢失怎么办退休 大学毕业档案在自己手里怎么办 青岛李沧区房产证加名字怎么办手续 公积金迟交了1天怎么办 科一预约不上怎么办 科目一考试没去怎么办 科目一成绩单丢了怎么办 考科目二身份证丢了怎么办 考科目三身份证丢了怎么办 考科目一身份证丢了怎么办 滴滴顺风车被永久封禁怎么办 三岁宝宝智力发育迟缓怎么办 学车体检听力没过怎么办 学车体检听力不过关怎么办 离职体检发现听力有问题怎么办 买的二手房土地证没过户怎么办 b2扣了9分怎么办 上海网约车车证怎么办 b2驾照累计12分怎么办 c1本扣满12分怎么办 太原公共自行车丢了怎么办 在太原出租车丢了东西怎么办 太原社保卡丢了怎么办 太原铁路医保卡丢了怎么办 学车体检视力不合格怎么办 换驾照色弱被拒怎么办 在上海考驾照贵怎么办 驾驶证有效期过了半年怎么办 资格证脱审2年了怎么办 换驾驶证时眼睛近视了怎么办 违章累计扣12分怎么办 一个违章扣12分怎么办 a1驾照扣3分怎么办