文章内容摘自:深入理解java虚拟机 第三章  

对象已死?

1. 引用计数算法:

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是一个不可能再被使用的。

优点:实现简单,判定效率高

缺点:很难解决相互对象间相互循环引用的问题

2. 可达性分析法:

通过一系列的称为 “GC Roots” 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当到达一个对象没有任何引用链时,则证明此对象是不可用的。

3. 引用分为:强引用,软引用,弱引用,虚引用

4. 要宣布一个对象死亡,至少要经历两次标记过程:

根据可达性分析判断,如果没有引用,放入到F-Queue中,稍后调用finalize()方法。finalize()方法不一定能回收对象,虚拟机会另起线程做回收工作。

5. 回收方法区主要回收两部分内容:废弃常量和无用的类。

垃圾收集算法

1. 标记-清除算法

缺点:

1). 效率问题,标记和清除两个过程效率都不高

2). 空间问题

2. 复制-算法:

将可用内存分为两块,每次只是用其中一块。当一块用完,就将还存活着的对象复制到另外一块上面,然后再把已经使用过得内存空间一次清理掉。

优点:实现简单,运行效率高

缺点:内存空间浪费严重

3. 标记-整理:

标记后让所有存活的对象移动到另一端,然后直接清理掉端边界以外的内存。

4. 分代收集算法

把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最合适的收集算法。年轻带每次收集中会有大量对象死亡,使用复制算法。老年代

因为对象存活率高,使用标记清理或者标记整理算法来回收

HotSpot 的算法实现

1. 枚举根节点:

虚拟机应当有办法直接得知哪些地方存放着对象引用。在HotSpot中使用OopMap的结构来达到这个目的。

2. 安全点:程序执行时并非在所有地方都能停顿下来开始GC,只有到达安全点才停下来。

3. 安全区域:指在一段代码片段中,应用关系不会发生变化,在这区域中的任意时刻开始GC都是安全的。例如:sleep或者blocked状态。

垃圾收集器:

1. Young generation:Serial , ParNew , Parallel Scavenge , G1

Tenured generation : CMS, Serial Old , Parallel Old , G1

2. Serial 收集器:

优点:简单高效,对单个CPU环境来说,可以获得最高的单线程收集效率。

缺点:单线程,停顿时间过长

3. ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,除了使用多条线程收集器之外,其余行为包括Serial收集器可用的所有控制参数。

可以通过:-XX:ParallelGcThreads 参数来限制垃圾收集器的线程数。

3. Parallel Scavenge收集器

一个新生代收集器,它也是使用复制算法,又是并行多线程收集器。Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量

吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)  ,虚拟机总共运行100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%

Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

Parallel Scavenge收集器还有一个参数:-XX:+useAdapiveSizePolicy值得关注。这个参数打开后,虚拟机会根据当前系统的运行情况收集性能监控信息。动态调整内存参数以提供

    最合适的挺短时间或者最大吞吐量。这种调节方式成为GC自适应的调节策略。(adaptive:适应的,适合的 ; policy:政策,方针)

4. Serial Old 收集器

Serial 收集器的老年版本,单线程,标记整理算法。

两大用途:

1. jdk1.5之前与Parallel Scavenge收集器搭配使用

2. 作为CMS收集器的后备方案,在并发收集发生Concurrent Mode Failure 时使用。

5. Parallel Old

Parallel Scavenge 收集器的老年版本,使用多线程“标记-整理”算法。

在注重吞吐量以及CPU资源敏感的场合,都可以考虑使用Parallel Scavenge加Parallel Old 收集器。

6. CMS 收集器

CMS(Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集器。

缺点:

1. CMS收集器对CPU资源非常敏感。

2. CMS收集器无法处理浮动垃圾,可能会出现“Concurrent Mode Failure”失败而导致另一次Full Gc (Serial Old)的产生。

3. 基于“标记-清除”收集结束时有可能会产生很多空间碎片。可以设置CMS顶不住要进行Full Gc时开启碎片的合并整理过程。或者通过另外一个参数设置,多少次收集后,进行一次压缩收集。

7. G1 收集器

优点:

1. 并行与并发

2. 分代收集:对年轻代和老年代采用不同的收集方式

3. 空间整合:标记-整理

4. 可预测的停顿

8. 虚拟机搭配:

Serial(或ParNew)  和 CMS

Serial(或ParNew或Parallel Scavenge) 和 Serial Old(MSC)

Parallel 和 Paralle Old 或 Serial Old

G1 , G1 可以自己设置年轻代和老年代不同垃圾回收机制

9. 并行和并发

并行(Parallel) :指多条垃圾回收线程并行工作,但此时用户线程仍然处于等待状态。

并发(Concurrent): 指用户线程和垃圾回收线程同时执行(但不一定是并行的,可能会交替执行),用户线程在继续运行,而垃圾收集程序运行于另一个CPU上。

10. 年轻代中的垃圾收集器基本上都是采用复制算法,将存活的对象复制到To区。

理解GC日志(详见第89页)

最前面的数字,代表GC发生的时间,这个数字的含义是从Java虚拟机启动以来经过得秒数。

GC日志开头的"[GC"和“[Full Gc”说明这次垃圾回收的停顿类型,而不是用来区分新生代GC还是老年代GC的。如果Full ,说明这次GC是发生了Stop -The-World的。调用System.gc()方法

触发的收集,也是STW。

接下来的“[DefNew”、“[Tenured”、"[Perm 表示GC 发生的区域,这里显示的区域名称和使用的GC收集器时密切相关的。

收集内存区的变化,堆内存的变化

总共用时

垃圾回收器参数总结:

第90页

内存分配与回收策略:

1. 对象优先在Eden分配

2. 大对象直接进入老年代

3. 长期存活的对象将进入老年代

4. 动态对象年龄判定

5. 空间分配担保

Minor GC 和 Full GC

1. 新生代GC(Minor  GC) :指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。

2. 老年代GC(Maror GC/Full GC):指发生在老年代的GC,出现了Major GC 经常会伴随着至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略中

就有直接进行Major GC的策略选择过程)。Major GC 的速度一般会比Minor GC 慢10倍以上。

具体参数设置,建议参考:http://www.cnblogs.com/chengxin1982/p/3818448.html

最新文章

  1. Kafka资源汇总
  2. Android WebView 302斗争之旅
  3. iOS 利用for循环创建九宫格
  4. 从H264码流中获取视频宽高 (SPS帧)
  5. alwaysOn为什么不支持分布式事务
  6. css009 装饰网站的导航
  7. poj 3461Oulipo
  8. MFC学习 事件临界区
  9. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表
  10. MySQL flush privileges 명령어
  11. Delphi中判断WebBrowser的页面是否加载完成
  12. RDLC报表上下标实现
  13. WCF技术剖析之十七:消息(Message)详解(中篇)
  14. create pfile from spfile;
  15. SPFA小总结
  16. 海量数据,大数据处理技术--【Hbase】
  17. java多线程(死锁,lock接口,等待唤醒机制)
  18. mybatis从mapper接口跳转到相应的xml文件的eclipse插件
  19. Oracle 数据库监听配置和服务
  20. asp.net core 自定义404等友好错误页面

热门文章

  1. thinkphp5如何使用layout
  2. Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例
  3. 统计nginx进程占用的物理内存
  4. SpringMVC的解释与搭建Maven私有代理服务器
  5. Struts2的简单的文件上传
  6. [VS2015].NET4.0环境下使用.NET2.0程序集,使用sqlite时报异常 出现“混合模式程序集异常”
  7. Hadoop伪分布安装详解(四)
  8. LMAX Disruptor 原理
  9. Java8 新特性之Stream API
  10. POJ1330Nearest Common Ancestors最近公共祖先LCA问题