GC 算法

  GC 即 Garbage Collection 垃圾回收。JVM 中的 GC 99%发生在堆中,而 Java 堆中采用的垃圾回收机制为分代收集算法。即将堆分为新生代和老年代,根据不同的区域使用不同的垃圾回收算法。

1. 确认垃圾的算法

1.1 引用计数法

  给每个对象设置一个引用计数器,每有一个地方引用此对象时,计数器 +1,引用失效计数器 -1。当对象计数器为0时,将会被垃圾回收。

  引用计数器无法解决循环引用的问题。当AB两个对象都无其他对象引用,且 A 对象引用 B 对象,B 对象也引用 A 对象时,两个对象本应被回收,但计数器都不为0,无法垃圾回收。

  因此主流虚拟机都未采用此算法。

1.2 可达性算法(引用链法)

  从一个被视为 GC Roots 的对象开始向下搜索,如果一个对象到 GC Roots 没有任何引用链相连时,说明此对象不可用,可以被垃圾回收。

 Java 中可作为 GC Roots 的对象如下:

  • 虚拟机栈中引用的对象

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

  • 方法区常量池引用的对象

  • 本地方法栈 JNI 引用的对象

  当一个对象不可达 GC Roots 时,这个对象不会立马被回收,而是处于死缓的阶段,若要真正被回收需要经历两次标记。

  被第一次标记的对象会经历一次筛选,筛选是否有必要进行finalize()方法,对象如果已被虚拟机调用过或认定没必要执行finalize()方法,则立即回收。

  如果需要执行finalize()方法,则把对象放入 F-Queue 队列中,等待Finalize()线程执行,该线程为低优先级,且不被 JVM 承诺执行完毕。GC对 F-Queue 队列中的对象进行二次标记,被标记后等待回收。

2. 垃圾回收算法

2.1 标记清除算法 Mark-Sweep

  最基础的垃圾回收算法,分两个阶段,标记,清除。标记所需回收的对象,清除被标记的对象。

  看似简单,但该算法最大的问题在于内存碎片化严重,如果清理后不整理内存,整块内存就会被存活的对象分割成一块块较小的连续空间,当需要创建较大对象时会难以在内存中找到合适的连续空间。

  • 节约空间

  • 需要进行两次扫描,耗时严重

  • 内存碎片化严重

  • 老年代标记清除,标记压缩结合使用

2.2 复制算法 Copying

  为了解决标记清除算法内存碎片化的缺陷而被提出。

  按内存容量将内存划分为两块,每次只使用其中一块,当一块内存存满后,将存活的对象复制至另一块,清空当前块内的内存,然后两边互换使用。

  • 算法实现简单,内存效率高,不易产生碎片

  • 使用空间被压缩,浪费了一点空间,如果存活对象增多,算法效率会大大降低

2.3 标记整理算法 Mark-Compact

  结合标记清除算法和复制算法被提出。

算法思想:

  • 标记死亡对象

  • 将存活对象移动至内存另一端

  • 清除端边界外所有对象

  

 特点:

  • 内存连续,不产生碎片

  • 效率不高,要标记存活对象,整理对象引用地址,效率低于复制算法

  • 老年代标记清除,标记压缩结合使用

JVM学习笔记——GC算法的更多相关文章

  1. JVM学习笔记——GC垃圾收集器

    GC 垃圾收集器 Java 堆内存采用分代回收算法,因此 JVM 针对新生代和老年代提供了多种垃圾收集器. 1. Serial 收集器 Serial 收集器是单线程收集器,采用复制算法. 是最基本的垃 ...

  2. 【Java虚拟机】JVM学习笔记之GC

    JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行 ...

  3. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  4. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  5. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  6. JVM学习笔记——垃圾回收篇

    JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...

  7. JVM学习笔记(四)------内存调优【转】

    转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...

  8. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  9. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

随机推荐

  1. reids在linux上的安装《四》

    linux 安装redis 完整步骤 红色字体在我的Centos上没有设置,因为我设置了密码 安装: 1.获取redis资源 wget http://download.redis.io/release ...

  2. 证明:(a,[b,c]) = [(a,b),(a,c)]

    这题是潘承洞.潘承彪所著<初等数论>(第三版)第一章第5节里一个例题,书中采用算术基本定理证明,并指出要直接用第4节的方法来证是较困难的. 现采用第4节的方法(即最大公约数理论里的几个常用 ...

  3. HCNP Routing&Switching之OSPF LSA类型(二)

    前文我们了解了OSPF的一类.二类.三类LSA,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15209829.html:今天我们来聊一聊OSPF的四类和五类L ...

  4. 记录Mac下使用Charles抓包

    抓包 简述 在网络应用如后端系统,app,小程序等的开发过程中,免不了接口可能会报错,但是一般在app中或者小程序中没有便捷的console控制台,而且线上环境也不会开启调试模式,所以想看一下接口的响 ...

  5. Git使用教程四

    拉取线上仓库 :git pull 提醒: 在每天工作的第一件事就是先git pull拉取线上最新·的版本: 每天下班前要做的是git push,将本地代码提交到线上仓库. 有兴趣可以关注一下微信公众号

  6. HDD成都站:HMS Core 6.0带来新可能 多元服务驱动产品商业成功

    9月10日,由华为开发者联盟主办的HDD(Huawei Developer Day)于成都举行.活动中,华为HMS Core各领域专家重点解读了HMS Core 6.0为开发者带来的多项全新能力,及生 ...

  7. python glob.glob()

    glob()函数可以将某目录下所有跟通配符模式相同的文件放到一个列表中,有了这个函数,我们再想生成所有文件的列表就不需要使用for循环遍历目录了,直接使用glob.glob(path+pattern) ...

  8. JDBC管理事务

    一.事务概念:打包一起的多个步骤的业务操作,要么同事成功,要么同时失败,则需要用事务管理: 二.代码实现

  9. ESP8266- AP模式的使用

    打算通过该模式,利用手机APP完成配网 • AP,也就是无线接入点,是一个无线网络的创建者,是网络的中心节点.一般家庭或办公室使用的无线路由器就是一个AP. • STA站点,每一个连接到无线网络中的终 ...

  10. php去除html标签及空格回车

    /** * 去除html标签和空格回车等 * @param $string * @return string */ function cutstr_html($string){ $string = s ...