前言

在上一节的学习中,已经了解到了关于JVM 内存相关的内容,比如JVM 内存的划分,以及JDK8当中对于元空间的定义,最后就是字符串常量池等基本概念以及容易混淆的内容,我们都已经做过一次总结了。不懂的小伙伴再复习复习~

GC

对于GC 这个名词我相信对于学习JAVA的同学,还是多少有了解的。GC 在HotSpot 虚拟机内的具体实现,使我们这节需要了解和学习的地方,而垃圾回收器GC 其工作的最主要的两个场所就是:

  • 堆 也就是最大的线程共享区域
  • 方法区

确定垃圾的方式

引用计数法

引用计数法,通俗的来说,每个对象都有一个计数器,用于记录这个对象被引用的数量,因为JAVA里面所有的对象都是按照内存地址的引用来使用的,被引用则计数器+1,反之则-1,若这个对象计数器为0,则可大致确认这个对象已经可以被回收了。

可达性算法

可达性分析,是为了解决引用计数法的循环引用问题,GCroots 就好比是一个对象树的根部,而每个对象就可以看做是树状图的上面的树干以及末端叶子,若根部GCroots 与末端或者树枝直接不可达,没有路径,则其成为不可达对象。

不可达对象不等价于可回收对象
不可达对象要抓换为可回收对象,则至少经过两次标记算法。

堆内存

在JVM当中存在这样一块区域,线程共享内存,主要用来存放实例对象和数组,也是垃圾清理GC最活跃的区域

在上一节我们已经学习过了,堆内存又可以按照GC的角度,细分为新生代和老年代,而这两个区域回收算法其实是各有千秋的。请听我细细道来~

GC分代收集算法

分代收集算法是当代VM常用的对象收集算法,通俗的讲,就是把堆内存分为新生代和老年代,在不同的区域内执行不同算法进行垃圾对象的清理与回收,其实分代回收算法算是一个父类,具体的算法还是我们下面要说的:

  • 新生代复制算法
  • 老年代标记整理算法

新生代

  • 复制算法
  • Minor GC
  • 简单、效率好,不易产生碎片

新生代作为堆内存里面最为活跃的一块内存区域,其主要负责新对象的产生,通过Minor GC清理内存空间,将到达年龄的对象送至老年代。

复制算法

复制算法,将区域的内存划分为两块,每次只是使用其中的一块。当一边的内存存满后,将这边的活跃对象全部复制到另一边,清空这一边的内存。
画个图来理解一下:

这幅图就很生动了,简单的总结一下就是:
复制--->清空---->互换
着其实和我们上一节当中就简单提了一下,同学们是否还记得?那我就再次浮现一下上次画过的图,其实就是Minor GC 最主要的工作方式。

将这幅图和我们这次的结果结合起来,就多了一块内存区域,其实多出来的TO区域 不就充当了一个缓存的过程嘛,最后还是把内存交出去,作为下一次的From区域,是一样的。

老年代

  • 标记整理算法
  • MajorGC
    在学习老年带的整理算法之前,我们首先需要了解一下标记清除算法。因为这个算法是标记整理算法的前生,需要先了解标记清除算法以及其功能性特点,才能理解标记整理算法的由来。

标记清除算法

其实可以从字面意思上理解到这个算法的意思,那就是:先标记而后进行清除嘛,其实就是这样的,先标记,而后清除。画个图,来理解一下。

这个算法就是这么简单粗暴,标记出来之后直接给你干掉!
特点:碎片化内存块严重

标记整理算法

标记整理算法就其实是这两个算法的结合,标记后不是清理,而是将这些标记的可以回收对象,活跃对象移到另外一边,清除可以回收的一侧对象。
标记、整理、最后再清理

小结

通过这一节的学习,以及结合上一节的内容。应该了解到java vm 的内存分布区域以及在最重要的堆里面进行的分代回收算法的基本概念,以及两个最重要的算法,新生代复制算法,老年代标记整理算法 这些也算是最面试当中经常出现的内容,还是需要熟悉。

对于具体的垃圾回收器这里暂时就不做那么深的说明了,暂时了解到这儿,越深入,对于刚开始的人越迷糊啊,等具体用到了再了解深入也不急。

参考

Java 中级 学习笔记 2 JVM GC 垃圾回收与算法的更多相关文章

  1. Java 中级 学习笔记 1 JVM的理解以及新生代GC处理流程

    写在最前 从毕业到现在已经过去了差不多一年的时间,工作还算顺利,但总是离不开CRUD ,我觉得这样下去肯定是不行的,温水煮青蛙,势必有一天,会昏昏沉沉的迷失在温水里.所以,需要将之前学习JAVA 当中 ...

  2. 深入理解java虚拟机学习笔记(二)垃圾回收策略

    上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略.        一. ...

  3. Java学习之二(线程(了解) JVM GC 垃圾回收)

    线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...

  4. 《深入理解java虚拟机》笔记(5)垃圾回收算法及垃圾收集器

    一.标记-清除算法 算法:分为标记和清除两个阶段,首先标记出所有需要回收的对象,再对标记对象进行回收. 不足之处:效率不高,会产生大量不连续内存碎片,导致下次分配较大内存时,若内存不足不得不触发垃圾回 ...

  5. Javascript高级编程学习笔记(11)—— 垃圾回收机制

    垃圾回收机制 垃圾回收机制,是保证脚本能长时间运行的重要机制 JS具有自动垃圾收集机制,也就是说执行环境会负责管理代码执行过程中使用的内存 与一些偏底层的语言(c.c++)不同,我们不需要手工地去管理 ...

  6. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  7. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

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

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

  9. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

随机推荐

  1. Json介绍与Ajax技术

    AJAX   AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据 ...

  2. Python--day24--复习

  3. 试用ZooKeeper

    ZooKeeper下载 通过ZooKeeper官网下载最新的稳定版本 解压ZooKeeper到某个目录,其目录结构为: 运行环境要求 系统环境 ZooKeeper对于市面上各种操作系统都有了不错的支持 ...

  4. tf.truncates_normal()

    转载自:https://blog.csdn.net/uestc_c2_403/article/details/72235565 tf.truncated_normal(shape, mean, std ...

  5. Python中&、^与and、or

    导火索:给定两个列表,怎么找出他们相同的元素和不通的元素? list1 = [1, 2, 3, 4, 57, 8, 90] list2 = [2, 3, 4, 5, 6, 7, 8] lis = li ...

  6. C/C++ 获取键盘事件

    Windows 系统下的 vs 中可以使用 _kbhit() 函数来获取键盘事件,使用时需要加入 conio.h 头文件 #include <conio.h> #include <i ...

  7. Javascript中那些你不知道的事之-- false、0、null、undefined和空字符串

    话不多说直接进入主题:(如果有写的不对的地方欢迎指正) 我们先来看看他们的类型分别是什么: typeof类型检测结果 结论:false是布尔类型对象,0是数字类型对象,null是object对象,un ...

  8. P3157 动态逆序对 CDQ分治

    动态逆序对 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3157 题意: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对 ...

  9. python简单小程序

    #足球队寻找10 到12岁的小女孩(包含10岁和12岁),编写程序询问用户性别和年龄,然后显示一条消息指出这个人是否可以加入球队,询问10次,输出满足条件的总人数#询问10次,输出满足要求的总人数 o ...

  10. Mac-安装命令一览表

    最近一直在学习Mac,可谓是撞了南墙撞西墙,各种问题需要动手去解决. 今天整理下在笔者Mac下面的各种命令 苹果自带的命令 sudo git ruby node 需要我们安装的命令 brew gem ...