郑州高端建站,优化设计官方网站,模板建站服务公司,怎么做一元抽奖网站GC策略解决了哪些问题#xff1f; 既然是要进行自动GC#xff0c;那必然会有相应的策略#xff0c;而这些策略解决了哪些问题呢#xff0c;粗略的来说#xff0c;主要有以下几点。 1、哪些对象可以被回收。 2、何时回收这些对象。 3、采用什么样的方式回收。 GC策略采用何…GC策略解决了哪些问题 既然是要进行自动GC那必然会有相应的策略而这些策略解决了哪些问题呢粗略的来说主要有以下几点。 1、哪些对象可以被回收。 2、何时回收这些对象。 3、采用什么样的方式回收。 GC策略采用何种算法 有关上面所提到的三个问题其实最主要的一个问题就是第一个也就是哪些对象才是可以回收的。 有一种比较简单直观的办法它的效率较高被称作引用计数算法。但是这个算法有一个致命的缺陷那就是对于循环引用的对象无法进行回收。想象一下假设JVM采用这种GC策略那么程序猿在编写的程序的时候下面这样的代码就不要指望再出现了。 public class Object {Object field null;public static void main(String[] args) {Thread thread new Thread(new Runnable() {public void run() {Object objectA new Object();Object objectB new Object();//1objectA.field objectB;objectB.field objectA;//2//to do somethingobjectA null;objectB null;//3}});thread.start();while (true);}} 这段代码看起来有点刻意为之但其实在实际编程过程当中是经常出现的比如两个一对一关系的数据库对象各自保持着对方的引用。最后一个无限循环只是为了保持JVM不退出没什么实际意义。 对于我们现在使用的GC来说当thread线程运行结束后会将objectA和objectB全部作为待回收的对象。而如果我们的GC采用上面所说的引用计数算法则这两个对象永远不会被回收即便我们在使用后显示的将对象归为空值也毫无作用。 这里LZ大致解释一下在代码中LZ标注了1、2、3三个数字当第1个地方的语句执行完以后两个对象的引用计数全部为1。当第2个地方的语句执行完以后两个对象的引用计数就全部变成了2。当第3个地方的语句执行完以后也就是将二者全部归为空值以后二者的引用计数仍然为1。根据引用计数算法的回收规则引用计数没有归0的时候是不会被回收的。 根搜索算法 由于引用计数算法的缺陷所以JVM一般会采用一种新的算法叫做根搜索算法。它的处理方式就是设立若干种根对象当任何一个根对象到某一个对象均不可达时则认为这个对象是可以被回收的。 就拿上图来说ObjectD和ObjectE是互相关联的但是由于GC roots到这两个对象不可达所以最终D和E还是会被当做GC的对象上图若是采用引用计数法则A-E五个对象都不会被回收。 说到GC rootsGC根在JAVA语言中可以当做GC roots的对象有以下几种 1、虚拟机栈中的引用的对象。 2、方法区中的类静态属性引用的对象。 3、方法区中的常量引用的对象。 4、本地方法栈中JNI的引用的对象。 第一和第四种都是指的方法的本地变量表第二种表达的意思比较清晰第三种主要指的是声明为final的常量值。 垃圾搜集算法 根搜索算法解决的是垃圾搜集的基本问题也就是上面提到的第一个问题也是最关键的问题就是哪些对象可以被回收。 不过垃圾收集显然还需要解决后两个问题什么时候回收以及如何回收。在根搜索算法的基础上现代虚拟机的实现当中垃圾搜集的算法主要有三种分别是标记-清除算法、复制算法、标记-整理算法。这三种算法都扩充了根搜索算法不过它们理解起来还是非常好理解的。转载于:https://www.cnblogs.com/peterxiao/p/10669977.html