JVM垃圾回收机制

JVM

垃圾回收机制(GC)
内存管理
  • Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。
  • 对象空间的分配:使用new关键字创建对象即可
  • 对象空间的释放:将对象赋值null即可。垃圾回收器将负责所有“不可达”对象的内存空间。
垃圾回收过程
  • 任何一种垃圾回收算法一般都要做两件基本事情:

    1. 发现无用的对象。
    2. 回收无用对象占用的内存空间。

    垃圾回收机制保证可以将"无用的对象"进行回收。无用的对象指的就是没有任何变量引用该对象。java的垃圾回收器通过相关算法发现无用对象,并进行清楚和整理。

  • 详细过程

    1. 新创建的对象,绝大多数都会存储在Eden中。
    2. 当Eden区满了(达到一定的比例)不能创建新对象。则会触发垃圾回收(GC),将无用对象清理掉,然后将剩余对象复制到某个Survivor中,同时清理Eden区。
    3. 当Eden区再次满时,会将Survivor1中的不能清空的对象,存放的Survivor2中,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空。
    4. 重复多次(默认15次)Survivor中没有被清理的对象,则会复制到年老去Old(Tenured)区中。
    5. 当OLd区满了,则会触发一次完整的垃圾回收(FullGc),之前新生代的垃圾回收称为(minorGC)
垃圾回收相关算法
  1. 引用计算法

    堆中每个对象都用一个引用计数。被引用一次,计数加1,直接到计数为0,则表示变成无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法被识别。

    public class Student{
        String name;
        Student friend;
        Public static void main (String [] args){
            Student s1 = new Student();
            Student s2 = new Student();
            s1.friend = s2;
            s2.friend = s1;
            s1 = null;
            s2 = null;
          
        }
    

    s1和s2互相引用对方,导致他们引用计数不为0,但是实际已经无用,但无法被识别。

  2. 引用可达法(根搜索算法)

    程序把所有的引用关系看作一张图,从一个节点GC ROOT开始。寻找对应的引用节点,找到这个节点以后。继续寻找这个节点的引用及诶单。当所有的引用节点寻找完毕之后,剩余的节点则被任务是没有被引用的节点,即无用的节点。

  3. 垃圾回收机制关键点

    • 垃圾回收机制只回收JVM堆内存里的对象空间。

    • 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力

    • 现在的JVM有多种垃圾回收实现算法,表现各异。

    • 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。

    • 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。

    • 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有

    一些效果,但是系统是否进行垃圾回收依然不确定。

    • 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一 个新的引用变量重新引用该对象,则会重新激活对象)。

    • 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

posted @ 2021-02-21 16:35  博客不放弃  阅读(190)  评论(0)    收藏  举报