美文网首页
Java内存垃圾收集

Java内存垃圾收集

作者: 雁阵惊寒_zhn | 来源:发表于2020-09-09 21:18 被阅读0次

如何判断对象可以回收?

  • 引用计数算法
    记录每个对象被引用的次数,当引用次数为0时,对象不会再被使用。
    引用计数算法最致命的问题是,无法解决对象之间相互循环引用的情况。例如下图,A和B两个对象引用计数均不为0,为1。但实际上却已经不可能被访问到了。


    两个对象之间相互循环引用
  • 可达性分析
    从虚拟机中被称为“GC Roots”的根对象作为起始点,沿着引用的路径向下搜索,基于图论理论,遍历整个引用的图,最终凡是不可达的对象均是不可能再被使用的。
    按照Java虚拟机运行时内存分配规则,“GC Roots”显然包括:

    1. 各个线程的虚拟机栈中引用到的对象;
    2. 本地方法栈中JNI引用的对象;
    3. 共享内存方法区中类静态属性引用的对象,常量引用的对象;
    4. 虚拟机内部的引用;
    5. 被同步锁持有的对象等;
    6. 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等;

    除了以上固定之外,垃圾回收器和回收内存区域不同,可以选入一些临时的GC Roots。

Java的引用

JDK1.2之后对Java引用进行了扩充,分为强引用、软引用、弱引用和虚引用
强引用>软引用>弱引用>虚引用

  • 强引用(Strongly Reference),传统的引用赋值,只要存在,垃圾回收器就不会回收对象;
System.out.println("-------Strongly Reference--------");
int[] t1 = new int[10240000];
System.gc();
强引用GC日志

日志中可以看到在Full GC之后,对象仍旧存在。

  • 软引用(Soft Reference),在将要发生内存溢出前,会对软引用对象进行二次回收;
System.out.println("-------Soft Reference-----------");
SoftReference t2 = new SoftReference<>(new int[10240000]);
System.gc();
软引用GC日志

Full GC之后软引用的对象仍旧存在。但是如果连续分配大内存对象,在分配失败,内存溢出前会进行清理。

System.out.println("-------Soft Reference-----------");
SoftReference t2 = new SoftReference<>(new int[512000000]);
SoftReference t3 = new SoftReference<>(new int[512000000]);
System.gc();
GC清理软引用
  • 弱引用(Weak Reference),关联的对象只能生存到下一次垃圾回收时,无论系统是否有足够的空间,当下一次垃圾回收开始时,关联的对象都会被回收;
System.out.println("-------Weak Reference-----------");
WeakReference t3 = new WeakReference<>(new int[10240000]);
System.gc();

弱引用被回收。


弱引用GC日志
  • 虚引用(Phantom Reference),不会对关联对象生存时间产生影响,无法通过虚引用获取对象实例,虚引用的唯一目的就是在这个对象被回收时可以收到一个系统的通知。

对象可以自救的finalize函数,但不建议使用

finalize()函数是对象自救的最后一次机会,覆盖finalize()函数,虚拟机会执行这个方法。如果没有覆盖,或者finalize()函数已经执行过,则虚拟机不会再一次执行。finalize()方法只会被系统自动调用一次。

finalize()函数所能做的工作,try-finally或者其他方法都可以实现,不建议使用finalize()函数

相关文章

  • Java虚拟机(JVM)调优

    一、Java内存结构 二、堆内存的构成 三、堆内存参数的调整 四、GC如何确定垃圾 五、垃圾收集算法 六、垃圾收集...

  • 新手初学Java性能之 垃圾收集器

    前言 垃圾收集算法是内存回收的方法论;垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现...

  • 理解Java内存区域与垃圾收集器

    本文主要介绍java内存区域和GC回收 java内存区域 垃圾收集器 参考 java内存区域 运行时内存区域 ja...

  • JVM系列之垃圾收集器

    如果说上一节说的垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现 简单的介绍Java的垃圾收集...

  • 20-Serial收集器+ParNew收集器

    垃圾收集器 如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》 中对垃圾...

  • 黑马手机彩票-高速缓存笔记

    Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,OOM就是内存溢出,即Out Of...

  • 垃圾收集器

    如果说垃圾收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实...

  • Java内存垃圾收集

    如何判断对象可以回收? 引用计数算法记录每个对象被引用的次数,当引用次数为0时,对象不会再被使用。引用计数算法最致...

  • JVM GC

    java 垃圾回收机制 GC即垃圾收集机制是指JVM用于释放那些不再使用的对象所占用的内存。Java的内存管理实际...

  • Java垃圾收集器

     若果说收集算法是内存会说的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机中对垃圾收集器应该如何实现...

网友评论

      本文标题:Java内存垃圾收集

      本文链接:https://www.haomeiwen.com/subject/dzadektx.html