Omooo 4 years ago
commit 0f2042790d
  1. 2
      blogs/Java/口水话/JVM 相关口水话.md

@ -85,7 +85,7 @@ Full GC/Major GC 指发生在老年代的 GC,出现 Full GC 经常会伴随着
引用计数法就是给对象添加一个引用计数器,每当有一个地方引用时就加一,引用失效时就减一。引用计数实现简单,判断效率也很高,但是 JVM 并没有采用引用计数来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用问题。可达性分析的思路是通过一系列称为 GC Roots 的对象作为起始点,从这些起始点出发向下搜索,当有一个对象到 GC Roots 没有任何引用链时,即不可达,则说明此对象是不可用的。在 Java 中,可作为 GC Roots 的对象有虚拟机栈和本地方法栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象等。 引用计数法就是给对象添加一个引用计数器,每当有一个地方引用时就加一,引用失效时就减一。引用计数实现简单,判断效率也很高,但是 JVM 并没有采用引用计数来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用问题。可达性分析的思路是通过一系列称为 GC Roots 的对象作为起始点,从这些起始点出发向下搜索,当有一个对象到 GC Roots 没有任何引用链时,即不可达,则说明此对象是不可用的。在 Java 中,可作为 GC Roots 的对象有虚拟机栈和本地方法栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象等。
但这也并不是说引用计数一无是处,在 Android 的 Framework Native 层用的智能指针。智能指针就是一种能够自动维护对象引用计数的技术,它是一个对象而不是一个指针,但是它引用了一个实际使用的对象。简单来说,就是在智能指针构造时,增加它所引用的对象的引用计数;而在智能指针析构时,就减少它所引用对象的引用对象。但是它是怎样解决相互引用问题的呢?其实是通过强弱引用来实现,也就是将对象的引用计数分为强引用计数和弱引用计数两种,其中,对象的生命周期只受强引用计数控制。比如在解决对象 A 和 B 相互引用时,把 A 看成父 B 看成子,对象 A 通过强引用计数来引用 B,B 通过弱引用计数来引用 A。在 A 不再使用时,由于 B 是通过弱引用来引用它的,因此 A 的生命周期是不受 B 影响的,所以 A 可以安全的释放,在释放 A 时,同时也会释放它对 B 的强引用计数,这时 B 也可以被安全的回收了。在 Android 中,是使用 sp 来表示强引用,wp 表示弱引用。 但这也并不是说引用计数一无是处,在 Android 的 Framework Native 层用的智能指针。智能指针就是一种能够自动维护对象引用计数的技术,它是一个对象而不是一个指针,但是它引用了一个实际使用的对象。简单来说,就是在智能指针构造时,增加它所引用的对象的引用计数;而在智能指针析构时,就减少它所引用对象的引用对象。但是它是怎样解决相互引用问题的呢?其实是通过强弱引用来实现,也就是将对象的引用计数分为强引用计数和弱引用计数两种,其中,对象的生命周期只受强引用计数控制。比如在解决对象 A 和 B 相互引用时,把 A 看成父 B 看成子,对象 A 通过强引用计数来引用 B,B 通过弱引用计数来引用 A。在 A 不再使用时,由于 B 是通过弱引用来引用它的,因此 A 的生命周期是不受 B 影响的,所以 A 可以安全的释放,在释放 A 时,同时也会释放它对 B 的强引用,这时 B 也可以被安全的回收了。在 Android 中,是使用 sp 来表示强引用,wp 表示弱引用。
Java 中的引用可以分为四类,强引用、软引用、弱引用和虚引用。强引用在程序中普遍存在,类似 new 的这种操作,只要有强引用存在,即使 OOM JVM 也不会回收该对象。软引用是在内存不够用时,才会去回收,JDK 提供了 SoftReference 类来实现软引用。弱引用是在 GC 时不管内存够不够用都会去回收的,可以使用 WeakReference 类来实现弱引用。虚引用对对象的生命周期没有影响,只是为了能在对象回收时收到一个系统通知,可以使用 PhantomReference 类来实现虚引用。 Java 中的引用可以分为四类,强引用、软引用、弱引用和虚引用。强引用在程序中普遍存在,类似 new 的这种操作,只要有强引用存在,即使 OOM JVM 也不会回收该对象。软引用是在内存不够用时,才会去回收,JDK 提供了 SoftReference 类来实现软引用。弱引用是在 GC 时不管内存够不够用都会去回收的,可以使用 WeakReference 类来实现弱引用。虚引用对对象的生命周期没有影响,只是为了能在对象回收时收到一个系统通知,可以使用 PhantomReference 类来实现虚引用。

Loading…
Cancel
Save