对象被判定为垃圾的算法

引用计数算法 和 可达性分析算法

引用计数算法

判断对象的引用数量通过判断对象的引用数量来决定对象是否可以被回收

每个对象实例都有一个引用计数器,被引用+1,完成引用-1

任何引用计数为0的对象实例可以被当作垃圾收集

优点:执行效率高,程序执行受影响较小

缺点:无法检测出循环引用的情况,导致内存泄露

可达性分析算法(主流)

通过判断对象的引用链是否可达来决定对象是否可以被回收GC Root -> Object1 -> Object2

Object3 -> Object4 (没有与GC Root相连,可以被垃圾回收)

可作为GC Root的对象虚拟机栈中的引用对象(栈帧中的本地变量表)

方法区中的常量引用的对象(保存的是某个对象的地址)

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

本地方法中JNI(Native方法)的引用对象

活跃线程的引用对象

垃圾回收算法

标记-清除算法 , 复制算法 , 标记-整理算法 和 分代收集算法

标记-清除算法(Mark and Sweep)标记:从根集合进行扫描,对存活的对象进行标记

清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存

特点:碎片化

复制算法(Copying)年轻代常用分为对象面和空闲面

对象在对象面上创建

对象面用尽后,存活的对象被从对象面顺序复制到空闲面

将对象面所有对象内存清除

特点:解决碎片化问题

顺序分配内存,简单高效

适用于对象存活率低的场景(年轻代)

缺点:只能使用50%的内存空间

标记-整理算法(Compacting) 老年代常用标记:从根集合进行扫描,对存活的对象进行标记

清除(整理):移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收

特点:避免内存的不连续性

不需要设置两块内存互换

适用于存活率高的场景(老年代)

分代收集算法(Generational Collector)上述垃圾回收算法的组合

按照对象生命周期的不同划分区域以采用不同的垃圾回收算法

目的:提高JVM垃圾回收效率

GC分类Minor GC:当Eden区被占满时,触发Minor GC

Full GC:情况很多,后面单独讨论

年轻代垃圾回收过程

年轻代:尽可能快速地收集掉生命周期较短的对象Eden区(几乎所有对象都从Eden区生成,容量为年轻代的8/10)

两个Survivor区(容量各为年轻代的1/10)程序在Eden区被创建

当Eden区被占满时,触发Minor GC,并将存活对象移动到Survivor区A(存活对象年龄+1),清空Eden区

当Eden区再次被占满时,再次触发Minor GC,并将Survivor-A和Eden区的存活对象复制到Survivor-B中(存活对象年龄+1),清空Eden区和Survivor-A区。两个Survivor区from和to性质调换。

当对象年龄达到某个值(默认是15,可通过-XX:MaxTenuringThreshold修改)进入老年代

注:如果对象过大,Eden区/Survivor区装不下,则直接进入老年代。

年轻代中的对象对象如何晋升到老年代新生代对象经历一定Minor次数依然存活的对象

Survivor区/Eden区中放不下的对象

新生成的大对象(-XX:+PretenuerSizeThreshold)

老年代垃圾回收过程

老年代:存放生命周期较长的对象,常用标记-清除算法,标记-整理算法Full GC 和 Major GC是等价的(也有说Major GC特指老年代回收,而不像Full GC一样包括Minor GC)

Full GC比Minor GC慢得多,执行频率低

触发Full GC的条件老年代空间不足

永久代空间不足(≤ JDK1.7)

Minor GC晋升到老年代的平均大小大于老年代的剩余空间

CMS(并发标记-清除算法) GC时,出现promotion failed(Minor GC时,Survivor放不下了,则需要将对象晋升到老年代,但老年代也放不下了), concurrent mode failure(并行时同时有多个对象放入老年代,但老年代空间不足)

调用System.gc()

使用RMI来进行RPC或管理的JDK应用,每小时执行1次Full GC

垃圾收集器(不同于垃圾收集算法)

两个概念Stop-the-World 和 Safepoint

Stop-the-WorldJVM由于要执行GC而停止了应用程序的执行

任何一种GC算法中都会发生

多数GC优化通过减少Stop-the-World发生的时间来提高程序性能

Safepoint分析过程中对象引用关系不会发生变化的点

产生Safepoint的地方:方法调用;循环跳转;异常跳转等

当所有线程都运行到安全点,垃圾回收器才开始运行。

JVM运行模式Server:启动慢,运行快(优化较多)

Client:启动快,运行慢

年轻代常见的垃圾收集器

各个收集器兼容性如下图所示,其中G1收集器不与任何其他收集器兼容:

Serial收集器(-XX:+UseSerialGC,复制算法)单线程收集,进行垃圾收集时,必须暂停所有工作线程

简单高效,Client模式下默认的年轻代收集器

ParNew收集器(-XX:+UseParNewGC,复制算法)多线程收集,进行垃圾收集时,必须暂停所有工作线程

单核执行效率不如Serial,在多核下执行有优势

Parallel Scavenge收集器(-XX:+UseParallelGC,复制算法)比起关注用户线程停顿时间,更关注系统的吞吐量(后台运算有优势)

在多核下执行才有优势,Server模式下默认的年轻代收集器

老年代常见的垃圾收集器Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)单线程收集,进行垃圾收集时,必须暂停所有工作线程

简单高效

Parallel Old收集器(-XX:+UseParallelOldGC,标记-整理算法)多线程,吞吐量优先

CMS(Concurrent Mark Sweep)收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)

垃圾收集器是一款以获取最短停顿时间为目标的收集器。由于现代互联网中的应用,比较重视服务的响应速度和系统的停顿时间,所以CMS收集器非常适合在这种场景下使用。初始标记(JVM停顿):stop-the-world(虚拟机停顿正在执行的任务,从虚拟机根对象开始扫描到与之直接关联的对象,以及被存活的青年代对象所直接引用的对象,并做标记)

并发标记:并发追溯标记,程序不会停顿

(并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象)

重新标记(JVM停顿):暂停虚拟机,扫描CMS堆中的剩余对象

并发清理:清理垃圾对象,程序不会卡顿

(并发重置:重置CMS收集器的数据结构)

年轻代和老年代均适用的收集器——Garbage First(G1)收集器(复制+标记-整理算法)特点:并行和并发

分代收集

空间整合(不像CMS用的是标记-清除算法)

可预测的停顿

将整个Java堆内存划分成多个大小相等的Region(不再划分年轻代和老年代,但仍然保留该概念)

年轻代和老年代不再物理隔离(内存中每个可用状态都可以自由地被分为年轻代/老年代)

Object的finalize()方法的作用与C++的析构函数不同,析构函数调用确定,而finalize()是不确定的

将未被引用的对象放置于F-Queue队列

方法执行中随时可能会被终止

给予对象最后一次重生机会

Java中的强引用,软引用,弱引用,虚引用有什么区别

强引用(Strong Reference)最普遍的引用:1Object o = new Object();

当内存空间不足时,即使抛出OutOfMemortError终止程序也不会回收具有强引用的对象

通过将对象设置为null来弱化引用,使其被回收

软引用(Soft Reference)对象处在有用但非必须的状态

只有当内存空间不足时,GC会回收该引用的对象的内存

可以用来实现高速缓存1

2String str = new String("hello");

SoftReference sr = new SoftReference(str);// 软引用

弱引用(Weak Reference)非必需对象,比软引用更弱一些

GC时会被收回

被回收的概率也不大,因为GC线程优先级比较低

适用于引用偶尔被使用且不影响垃圾收集的对象1

2String str = new String("hello");

WeakReference wr = new WeakReference(str);// 弱引用

虚引用(Phantom Reference)不会决定对象的生命周期

类似于没有被引用,任何时候都可能被垃圾收集器回收

跟踪对象被垃圾收集器回收的活动

必须和引用队列ReferenceQueue联合使用1

2

3String str = new String("hello");

ReferenceQueue q = new ReferenceQueue();

PhantomReference r = new PhantomReference(str, q);// 虚引用引用队列:无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达(类似链表)

存储关联的且被GC引用(回收)的软引用,弱引用以及虚引用

java gc回收机制种类_Java垃圾回收机制相关推荐

  1. java垃圾回收 分代_Java 垃圾回收机制 (分代垃圾回收ZGC)

    什么是自动 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制.所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象:而未使用中的对象(未引用对象), ...

  2. java垃圾回收根对象_Java垃圾回收怎么理解?

    展开全部 Java的堆是一个运行时数据区,类的实例(对象)从中62616964757a686964616fe58685e5aeb931333339653664分配空间.Java虚拟机(JVM)的堆中储 ...

  3. java gc回收机制种类_JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 2.什么时候 ...

  4. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  5. java垃圾回收菜鸟_java垃圾回收机制

    1:对象可能不被垃圾回收 2:垃圾回收并不等于"析构" 3:垃圾回收只与内存有关,为了回收程序不再使用的内存 java虚拟机采用了"自适应"的垃圾回收机制,即& ...

  6. java list clear 垃圾回收_java垃圾回收机制

    1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导数内存溢出,所以内存资源的管是非常重要了. 1.1.C/C++语言的垃圾回收 在C/C+ ...

  7. 6种java垃圾回收算法_Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  8. java内存 海子_Java垃圾回收机制 - 海 子

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  9. java 垃圾回收 新生代_Java垃圾回收

    一.概述 Java垃圾回收器实现内存的自动分配和回收,这两个操作都发生在Java堆上(还包括方法区,即永久代).垃圾回收操作不是实时的发生(对象死亡不会立即释放),当内存消耗完或者是达到某一指标(th ...

最新文章

  1. __new__ __init__区别
  2. Java实现图片裁剪预览功能
  3. docker centos7容器 安装ssh服务
  4. python计算直角三角形顶点坐标
  5. Power of Two
  6. 自定义AlertDialog布局
  7. java post 登陆_java HttpPost 密码登录和提交表单的案例
  8. redis学习笔记——应用场景
  9. 计算机数据库管理基本知识,2015年计算机四级考试《数据库技术》基础知识:概念篇...
  10. 什么是偏向锁、轻量级锁、重量级锁?
  11. Android租赁源码,AndroidUS六仔源码出租的配置文件操作封装
  12. mach-O文件结构分析
  13. Unity使用FGUI的基本操作(一)
  14. poi解析excel文件(支持xls和xlsx)java学习版
  15. 窗函数设计法设计FIR数字滤波器——FDATool
  16. matlab 有源高滤波器,基于MATLAB有源滤波器的研究设计.ppt
  17. 系统集成项目管理工程师章节重点第一章
  18. Unity网格编程篇(二) 非常详细的Mesh编程入门文章
  19. Expression:vector subscript out of range
  20. PHP Imagick发光文字

热门文章

  1. 关于官方提供的mindspore镜像mindspore-modelzoo
  2. 创成汇丨2019年参加创新创业大赛都能获得什么?
  3. linux备份系统img,N1盒子备份armbian/linux/ubuntu系统到img镜像
  4. USB暂停与蓝牙鼠标断开
  5. 小黑子—Java从入门到入土过程:第六章
  6. go语言学习:结构体
  7. JSON对象转成formData对象,formData对象转成JSON对象
  8. 征信记录中出现“连三累六”该怎么办?
  9. 什么是高防服务器?如何正确的选择高防服务器
  10. 数通基础-网络基础知识