文章内容摘自:深入理解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

JVM(3) 垃圾回收器与内存分配策略的更多相关文章

  1. Java自动内存管理机制学习(二):垃圾回收器与内存分配策略

    备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...

  2. JVM学习第二天(垃圾回收器和内存分配策略)大章

    说道垃圾回收器大家应该都会有所了解,GC白,当然说道具体的可能就不是很清楚了,今天我们就来玩一玩; GC要做的事情: 第一步:确定堆中需要回收的对象; 第二步:什么时候回收; 第三步:怎样回收 为什么 ...

  3. jvm垃圾回收器与内存分配策略

    一.判断对象存活的算法 1.引用计数算法 (1)概念:给对象中添加一个引用计数器每当有一个地方引用它时,计数器值加1:当引用失效时,计数器就减1:任何时刻计数器为0的对象就是不可能再被使用的. (2) ...

  4. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  5. 深入了解java虚拟机(JVM) 第七章 内存分配策略

    理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域   一般来说,新创建的对象都会直 ...

  6. JVM垃圾回收器、内存分配与回收策略

    新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...

  7. [jvm]垃圾回收与内存分配策略

    一.垃圾回收算法 概述 JVM中,当创建的对象不再被使用的时候,此时我们认为他是无用的“垃圾”:在现代主流的商用jvm中,都是通过可达性分析来判断对象是否存活的.这个算法的基本思想是通过一系列“GCR ...

  8. 【转载】JVM 学习——垃圾收集器与内存分配策略

    本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collectio ...

  9. Java的垃圾回收和内存分配策略

    本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...

随机推荐

  1. AWS系列-AWS EC2实例类型改配(机器配置升级)

    1.1 EC2实例升级需要先把升级的实例停机才能升级 1.2 如图选择需要升级的EC2,点击操作,实例设置,更改实例类型 1.3 选择你要想的配置,点击应用 1.4 启动EC2实例即可

  2. .NET基础知识(一、认识.Net)

    参考链接:http://blog.csdn.net/shanyongxu/article/details/50849111 认识.NET平台 可能很多人问什么是.NET框架,它包含了哪些内容?为开发程 ...

  3. iOS开发之--如何使用自定义字体

    一.首先把字体导入到工程中 二.选择Build Phases -->Copy Boundle Resources ,把所用的字体添加进去,一般x-code会自定导入 三.在info.plist中 ...

  4. OpenSSL学习笔记

    SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...

  5. Android模拟器基本使用和常用工具介绍

    注:其中部分内容参考网上资源 1.Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的移动设备.Android的模拟器是基于QEMU开发的,QEMU是一个有名的开源虚拟机项目(详 ...

  6. docker使用阿里云镜像仓库

    1:阿里云docker仓库 https://dev.aliyun.com/search.html 2:进去注册帐号后,点击自己的管理中心. 3:在管理中心点击加速器,右边面板会有你的加速地址,右边面板 ...

  7. .NET 4.0 中的契约式编程

    契约式编程不是一门崭新的编程方法论.C/C++ 时代早已有之.Microsoft 在 .NET 4.0 中正式引入契约式编程库.博主以为契约式编程是一种相当不错的编程思想,每一个开发人员都应该掌握.它 ...

  8. 【转】Spring Boot 日志配置(超详细)

    更新日志: 20170810 更新通过 application.yml传递参数到 logback 中. [toc] 简书不支持目录,截图一张. image.png 默认日志 Logback: 默认情况 ...

  9. 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

    1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...

  10. 网络编程 - UDP协议

    UDP协议 服务端 ''' UDP 协议 又称 数据报协议 SOCK_DGRAM ''' from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 ...