在进行垃圾回收之前,先判断哪些对象应该被回收,将其标志出来。java提供两种策略:
当一个对象有一次引用时,计数+1。计数为0时,代表该对象没有任何引用,将其标志。但无法解决循环引用问题。如下图,堆中两个对象相互引用,但栈中没有引用指向它们,此时他们的计数都为1,不能被回收,但实际上他们已经为垃圾数据。
以GC Roots对象做为起点,如果该起点与某个对象没有有可达性的连接,则代表该对象可被回收。
可做为GC Roots的对象:
将堆内存分为新生代和老年代。因为新生代只有少量对象存活,通常使用复制算法;而老年代对象存活率高,通常使用标志 - 清楚算法或者标志 - 整理算法
该方法效率高,直接把标记好的对象清除,把占用的空间置为可用。但是会产生碎片化的内存,导致没有足够大的空间存储大内存对象。
将新生代分为三个区(Eden、Survivor1,Survivor 2,空间占比8:1:1 )。
将已标志的对象一边清除,一遍整理,使得GC过后,内存还能连续,解决碎片化问题。
串行回收器:停止当前所有工作线程,启动一个GC线程进行垃圾回收。GC线程回收完成后,工作线程方可继续执行。Serial是新生代的回收器,使用的是复制回收算法,Serial Old是老年代的回收器,使用的是标记 - 清除算法或者标记 - 整理算法。(jdk1.1,jdk1.2默认回收器)
并行回收器(PS、PO):串行回收器的多线程版本,停止所有工作线程后,启动多个GC线程去进行回收工作。Parallel Scavenge是新生代的回收器,Parallel Old是老年代的回收器 (jdk1.8默认回收器)
ParNew: 针对新生代的回收器,停止所有工作线程后,启动多个GC线程进行回收工作(同Parallel Scavenge,只不过Parallel Scavenge是与Parallel Old搭配使用的,ParNew是与CMS搭配使用的)
CMS(Concurrent Mark Sweep): 针对老年代的回收器
todo
本文地址:https://blog.csdn.net/qq_36390175/article/details/107352625
如对本文有疑问, 点击进行留言回复!!
整合SpringBoot写的Coffee网站,前端模仿星巴克
<Unity Scripts ERROR> Unity 脚本报错合集(附带解决办法)
网络同步在游戏历史中的发展变化(四)—— 状态同步的发展历程与基本原理(下)...
Codeforces - Yet Another Segments Subset
【leetcode】289.生命游戏 (三种解法开阔思路,java实现)
网友评论