深入Java虚拟机阅读感(二)-Java垃圾回收器与内存分配策略

版权声明:版权归作者所有 https://blog.csdn.net/yulin959/article/details/81101209

垃圾回收器主要算法:

      1、引用计数法。给对象添加一个计数器,当对象被使用时则加1,当引用失效时则减1,当计数为0时则认为该对象可以被回收。由于该算算法无法解决对象相互引用而计数不会减为0,导致该对象无法回收,所以该算法不是Java虚拟垃圾回收器的算法。

      2、可达性分析算法。该算法是虚拟机的

           

当对象引用不能到达图中ROOT实际在虚拟机垃圾回收器中是GC Roots对象时则判断该对象可以被回收。

Java对引用概念有强变弱:

          强引用如:Objec obj = new Object()这样引用的对象如果obj不设置为obj=null则永远都不会被回收;

         软引用:该引用是对象还可达,但是不是程序必须使用的对象。如果发生内存溢出之前则进行回收。如果这次垃圾回收之后内存还是不够则抛出内存溢出的异常信息。

          弱引用:弱引用描述的是非必须的对象。在当垃圾回收器工作时该对象则被回收。

           虚引用:虚引用也是引用中最弱的一个。虚引用也不能获取对象实例。虚引用只有在垃圾回收时通知系统

Java 中PhantomReference类设置虚引用。

标记对象生存还是死亡。在分析不可达算法当中也不是只要不可达立即回收,需要将不可达对象进行最少两次标记后才会真正的

回收掉 。在对象真正销毁时会去检查finalize方法是否已被执行,或对象没有覆盖掉finalize,则虚拟机认为没有必要执行finalize。

如果虚拟机认为有必要执行finalize方法则将该对象放入F-Queue队列中,由优先级较低dJVM Finalize线程去执行。当执行完finalize也不一定该对象一定会被回收。

回收方法区:

          在HotSpot虚拟机当中称为永久代。在Java虚拟机规范当中,没有要求对方法区进行垃圾回收。

在使用反射,动态代理时需要注意方法区的内存溢出。

          垃圾回收算法:

                       1.标记-清楚算法(Mark-Sweep):该算法将经历标记与清楚两个阶段,该算法的效率较低。标记清除后将会有大量不连续的内存空间。在需要申请大量连续内存时则需要再次进行标记回收。这样将效率较低。

                         2.复制算法。复制算法则是在内存中心开辟一块空间将所有没有被回收的对象复制值该区域,再将以前的区域清理掉,形成连续可用的空间。该算法将堆内存降至一半。

未完待续........

猜你喜欢

转载自blog.csdn.net/yulin959/article/details/81101209