zoukankan      html  css  js  c++  java
  • Java垃圾回收机制

    Java垃圾回收机制

     

     

    自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

    所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。

    在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。

     

     


     

    总体GC经过三个过程:标记 --> 清除 -->压缩

    1. 标记:首先第一次GC时,回收器会把对象标记使用与未使用

     

          上图中,蓝色部分表示已引用对象,橙色表示未引用对象。

    2. 清除:这一步删除所有未引用的对象

     

    3. 压缩:为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。


            GC新生代对象移动到老年代的情况

            上图为JVM模拟图

           对象首先在Eden区分配空间,一旦eden区满了,就会触发第一次GC,进行小型垃圾回收机制,把存活的对象放在第一个S区,并清除Eden空间,

         在下一次GC时,重复之前的操作,不过特别的时会把第一个S区的对象移动到第二个S区,并清除Eden和第一个S区,这时,S区已经有了不同年龄的对象。

         在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S,。幸存的对象增加年龄。Eden区和S被清空。

         

         新生代到老年代

         1. 当Eden和一个Survivor区中依然存活的对象无法放入到Survivor中,则通过分配担保机制提前转移到老年代中。

         2. 如果对象的体积太大,新生代无法容纳的话也会绕过新生代,直接在老年代分配空间。

           3. 长期存活的对象将进入老年代。
           虚拟机对每个对象定义了一个对象年龄(Age)计数器。当年龄增加到一定的临界值时,就会晋升到老年代中,该临界值由参数:-XX:MaxTenuringThreshold来设置。
          如果对象在Eden出生并在第一次发生MinorGC时仍然存活,并且能够被Survivor中所容纳的话,则该对象会被移动到Survivor中,并且设Age=1;
          以后每经历一次Minor GC,该对象还存活的话Age=Age+1。

         4.动态对象年龄判断

          虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,

          年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。

     

     

     参考链接:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html#

          https://www.cnblogs.com/yuandluck/p/9484495.html

     

  • 相关阅读:
    博客背景美化——动态雪花飘落
    尼姆博弈+SG函数
    2016 CCPC-Final-Wash(优先队列+贪心)
    【php】---mysql语法增、删、改、查---【巷子】
    【php】---mysql---基本操作及使用---【巷子】
    【Object.prototype.toString.call()】---判断某个对象属于哪种内置类型------【巷子】
    【webpack】---模块打包机webpack基础使用---【巷子】
    设计模式---003代理模式---【巷子】
    设计模式---002适配模式---【巷子】
    设计模式---001单例模式---【巷子】
  • 原文地址:https://www.cnblogs.com/PrayzzZ/p/10942022.html
Copyright © 2011-2022 走看看