深入理解java虚拟机读书笔记,第三章:垃圾收集器与内存分配策略

3.1概述


3.2对象已死吗

3.2.1引用计数法

实现简单、判定效率高

无法解决循环引用的问题

主流虚拟机没有采用

3.2.2可达性分析算法

通过一系列称作“GC Roots”的对象作为起始点,向下搜索,搜索走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连,则证明不可用

可作为GC Roots的对象

虚拟机栈(栈帧中的本地变量表)中引用的对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

本地方法栈中JNI(即一般所说的native方法)引用的对象

3.2.3再谈引用

强引用:只要引用存在,垃圾收集器就不会回收

软引用(SoftReference):有用但非必须,系统在发生内存溢出之前进行二次回收

弱引用(WeakReference):非必须对象,只能生存到下一次垃圾收集发生之前

虚引用(PhantomReference):又称幽灵引用或者幻影引用,对对象的生存时间无影响,也无法通过虚引用获得对象的实例,唯一目的是这个对象被虚拟机回收的时候收到一个系统通知

3.3.4生存还是死亡

不可达对象两次标记后才可以宣告死亡

第一次标记筛选判断是否需要执行finalize()方法

当对象没有覆盖finalize()或者已经被虚拟机调用,则不需要执行

有必要执行,则放到F-Queue的队列中,稍后由虚拟机自建的、低级别的线程Finalizer去执行———触发操作,不保证运行结束

finalize()方法是对象逃脱死亡的最后一次机会

3.3.5回收方法区

回收废弃常量:没有任何地方引用

回收无用的类

同时满足以下三个条件,”可以“回收

堆上没有该类的任何实例

加载该类的ClassLoader已经被回收

该类的java.lang.Class对象没有被任何地方引用,无法通过发射获取该类的实例

在大量使用发射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGI这类频繁自定义Classloader的场景都需要具备类卸载功能,以保存永久代不会溢出


3.3垃圾收集算法

3.3.1标记-清除算法

算法分为标记和清除两个阶段,首先标出需要回收的对象,标记完成后统一回收

不足:效率,标记和清除效率都不高;空间,产生内存碎片


3.3.2复制算法

将内存按容量分为大小相等的两块,每次只使用一块

当一块用完了,将活着的对象复制到另一块上,然后把已使用过的内存清理掉

不足:内存缩小一半,造成内存浪费


3.3.3标记-整理算法

适合老年代

3.3.4分待收集算法

根据存活周期内存划分


3.4HotSpot的算法实现

3.4.1枚举根节点

可作为GC Roots的节点主要在全局性引用(常量和类静态属性)和执行上下文(帧栈中的本地方法表中)

Stop The world

3.4.2安全点

3.4.3安全区域


3.5垃圾收集器

3.5.1Serial收集器


最基本,发展最悠久的

单线程收集(一个CPU,一个收集线程)

暂停所有其他工作,知道收集结束

Client模式下的默认收集器


3.5.2ParNew收集器


Serial收集器的多线程版

多条线程进行垃圾收集

Server模式下的默认收集器

只有Serial和ParNew和CMS能够配合使用


3.5.3Parallel Scavenge收集器


新生代收集器,采用复制算法

并行的多线程收集器

目的达到一个可控制的吞吐量


3.5.4 Serial Old收集器


单线程

使用标记整理算法

主要目的在给client模式下的虚拟机使用

server模式下用途

jdk1.5及其以前的与Parallel Scavenge配合使用

作为CMS的后备预案


3.5.5 Parallel Old收集器


Parallel Scanvenge的老年代版本

使用多线程和标记整理

JDK1.6中开始使用


3.5.6CMS收集器


以获取最短停顿时间为目标

基于标记清除算法


四个步骤

初始标记

并发标记

重新标记

并发清除


优点:并发收集、低停顿

缺点:对CPU资源敏感;无法处理浮动垃圾;空间碎片


3.5.7G1收集器


面向服务端应用的垃圾收集器


特点

并行与并发

分代收集

空间整合

可预测的停顿


把JAVA堆分为多个Region,根据价值大小(回收获得的空间和所需要时间的经验值)回收

3.5.8理解GC日志


3.5.9垃圾收集器参数总结


3.6内存回收和分配策略


3.6.1对象优先在Eden区分配

当没有足够的Eden时,虚拟机进行一次Minor GC

打印内存回收日志:-XX:PrintGCDetails

Suvivor不足,通过分配担保机制进入老年代

3.6.2大对象直接进入老年代

通过设置参数-XX:PretenureSizeThreshold,大于该参数的垃圾收集的时候直接进入老年代,避免在Eden区和两个个Survivor进行大量的内存复制

3.6.3长期存活的对象进入老年代

虚拟机为每个对象定义了年龄计数器

年龄阈值-XX:MaxTenuringThreshold

3.6.4动态对象年龄判断

在Survivor区相同年龄大小的所有对象大小的总和大于Survivor的一半,则年龄大于或等于该年龄的对象直接进入老年代

3.6.5空间分配担保



第三章:垃圾收集器与内存分配策略



参考文献:

[1] 深入理解Java虚拟机 第二版 --周志明


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容