第一次编辑  2019-05-07  01:09:39

垃圾回收的对象

程序中的不可用对象(不存活的对象,没有任何引用),或者无用的变量信息等,在程序中长期存在会逐渐占用较多的内存空间,导致没有足够的空间分配给新生成的对象等.

判断哪些是需要回收的对象

早期jdk使用引用计数法,计数每个对象的引用次数,对于没有引用的对象进行删除,但是该方法无法处理循环引用情况.

之后引入了可达性分析算法,将所有的引用关系看作一张图,从一个结点(GC ROOT)开始,寻找向下的引用结点,之后重复这一过程,其中的路径被称为引用链,当一个对象没有与GC ROOT相连的引用链时,该对象是不可用的

执行回收的时间

在CPU空闲时自动回收,或在堆内存满后进行回收,或者程序中调用System.gc()后进行回收

执行回收的算法

共有四种

  1. 1.      标记-清除算法

      分两步执行,首先标记,根据可达性分析标记出所有需要回收的对象,之后对被标记的对象进行回收.

      该方法不需要移动对象,只对不可用对象操作,较为简单.但是一般情况下,效率较低,同时由于直接回收垃圾,会产生内存碎片,后续为较大对象分配空间时,可能因为无法找到较大的连续内存空间而必须再次进行垃圾回收过程

  1. 2.      复制算法

      将可用的内存按照容量大小等分,每次只使用一块空间进行分配,当这一块用完时,将可用对象移动到另一块空间上,然后清理已经用过的空间.

      该方法每次只需要对一半的空间进行回收,同时解决了内存碎片的问题.但是使用中浪费了一半的内存空间,在可用对象较多的情况下需要进行较多的复制,效率降低.

  1. 3.      标记-整理算法

      标记-清除法的改进.在使用标记-清除算法回收不可用对象后,将所有可用的对象压缩到内存的一端,之后清理端边界之外的所有内存.

      该方法解决了内存碎片的问题,但是增加了对象移动的过程,执行的成本较高

  1. 4.      分代收集算法

      目前主要使用的方法

      根据对象存活的周期将内存(堆)分为多块,一般是新生代,老年代和永生代(永久代).在不同的代使用不同的收集器(收集器使用不同的算法)进行回收,提高效率.

      新生代

      尽快的收集生命周期短的对象.新生代内部一般被分为三个部分,分别是Eden区,survivor0区和survivor1区,分配的比例为8:1:1.新产生的对象首先被放置到Eden区,当该区被放置满之后,将该区的存活对象移动到survivor0区,之后清空Eden区,当survivor0区也被放置满时,将Eden区和survivor0区存活对象复制到survivor1区,之后清空Eden区和survivor0区.,交换survivro0区和survivor1区,即保持survivor1区为空,之后重复该过程.

      当survivor1区不够存放eden区和survivor0区的存活对象时,将这些对象放入老年代.

      在这个过程中的垃圾回收过程被称为Minor GC(小型垃圾回收),该过程发生比较频繁,不一定严格等待eden区满才执行.该回收过程发生时,所有程序线程暂停,直到完成回收工作,是Stop the world(STW)事件的一种.

      老年代

      存放生命周期较长的对象.老年代的空间较新生代大,当老年代满时触发Major GC,该过程同样导致STW,并且时间比Minor GC更长.

      永久代

      存放静态文件,如类或方法等.一些运行过程中动态生成的类会被放置到这里.

    各代使用不同的回收器,新生代使用应用复制算法的收集器,老年代使用应用标记-清除或标记-整理算法的收集器

     Java8废弃了永久代,用元空间进行代替;在JDK1.7中推出了新的G1收集器.

参考如下

https://baijiahao.baidu.com/s?id=1610753983428990724&wfr=spider&for=pc

https://blog.csdn.net/weixin_39067991/article/details/81045201

https://blog.csdn.net/w372426096/article/details/81360083

Java GC机制简要总结(Java垃圾回收的基本工作原理)的更多相关文章

  1. Java GC系列(2):Java垃圾回收是如何工作的?

    本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...

  2. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  3. 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  4. Java中谈尾递归--尾递归和垃圾回收的比较

    一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点:    1.调用的是同一个 ...

  5. 在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  6. Java垃圾回收是如何工作的?

    本教程是为了理解基本的Java垃圾回收以及它是如何工作的.这是垃圾回收教程系列的第二部分.希望你已经读过了第一部分:<Java 垃圾回收介绍>. Java 垃圾回收是一项自动化的过程,用来 ...

  7. 《Beginning Java 7》 - 8 - Collecting Garbage 垃圾回收

    Java 垃圾回收机制原理: Java 语言使用 garbage collector 来进行垃圾回收.它是允许在后台的代码,间或地检查没有引用的对象(unreferenced object).发现后, ...

  8. Java运行时内存划分与垃圾回收--以及类加载机制基础

    ----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...

  9. 【Java面试题】49 垃圾回收的优点和原理。并考虑2种回收机制。

    1.Java语言最显著的特点就是引入了垃圾回收机制,它使java程序员在编写程序时不再考虑内存管理的问题. 2.由于有这个垃圾回收机制,java中的对象不再有“作用域”的概念,只有引用的对象才有“作用 ...

随机推荐

  1. rails elasticsearch searchkick用法

    1.安装elasticsearch 之前要先安装java8: 参考https://www.elastic.co/guide/en/elasticsearch/reference/current/zip ...

  2. JVM Safepoint 安全点

    一.什么是安全点: 在可达性分析算法中查找存活的对象,首先要找到哪些是GC Roots: 有两种查找GC Roots的方法: 一种是遍历方法区和栈区来查找(保守式GC): 一种是通过OopMap的数据 ...

  3. WJC上学记

    WJC上学记题目描述:WJC为了追求YHY,决定考上树人,但是,愚蠢的他没有足够好的成绩,只能靠自己的亲戚来帮忙.但是由于他足够愚蠢,连自己的亲戚都不认识,仁慈而被树人优录的Geek_du决定帮助他. ...

  4. LoadRunner 技巧之 IP欺骗

    IP欺骗也是也loadrunner自带的一个非常有用的功能. 需要使用ip欺骗的原因:1.当某个IP的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量, ...

  5. ${varname:-defaultvalue}

    ${varname:-defaultvalue}的意思是:如果varname存在且非null,则返回其值:否则,返回defaultvalue. 用途:如果变量未定义,则返回默认值.

  6. [SHOI 2009] 会场预约

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2028 [算法] 直接用std :: set维护即可 时间复杂度 : O(NlogN) ...

  7. UI:UICollectionView

    #import "ViewController.h" #import "HeaderView.h" #import "FooterView.h&quo ...

  8. USACO 奶牛排队

    题目:给出一个只含有1,2,3的数字序列,问最少交换多少次才能将之变为递增数列. 解: 注意到只有1,2,3,我们只要将1,3交换到自己的应在位置上那么排序就已经完成了. 需要交换的有几种,记$a(x ...

  9. Linux中的gdb调试方法总结

  10. vmware实现与windows下的共享文件

    1 首先你得先设置一下windows下得共享 比如是准备共享D盘 那么右击 ----->属性------->高级共享勾上就OK勒 2那么vmware怎么设置呢? 打开vmware-> ...