面试官:JVM为什么不采用引用计数法?     面试官:那你讲讲可达性分析算法?     面试官:垃圾回收器回收的是哪个区域?     面试官:那永久代不会进行垃圾回收对吧?     面试官:你说说都有哪些垃圾回收器?     面试官:你说的CMS为什么有较短的停顿?     面试官:那它有什么缺点?     面试官:你说G1是CMS的升级版,为什么?     面试官:垃圾回收算法都有什么?     面试官:复制算法可以怎么优化吗?              👉以【面试官面试】形式覆盖Java程序员所需掌握的Java核心知识、面试重点    📚本期是《JVM系列》,其他系列博客请订阅专栏《Java Offer训练营》    ❤创作不易,不妨点赞、收藏、关注支持一下      文章目录            判断可回收对象             引用计数法       可达性分析算法           垃圾回收器             垃圾回收区域       回收永久代       垃圾回收器       CMS原理       CMS的缺点       G垃圾回收器           垃圾回收算法             优化复制算法                1. 判断可回收对象   1.1 引用计数法       面试官:JVM为什么不采用引用计数法?      每个Java对象在引用计数法里都有一个引用计数器,引用失效则计数器 - 1,有新的引用则计数器 + 1,通过计数器的数值来判断该对象是否是可回收对象。   大家看下这个例子,如果对象A和对象B没有被任何对象引用,也没有被任何线程访问,这两个对象按理应该被回收。但如果对象A的成员变量引用了对象B,对象B的成员变量引用了对象A,它们的引用计数器数值都不为0,通过引用计数法并不能将其视为垃圾对象。       class A {        B b = new B();    }    class B {        A a = new A();    }   就因为引用计数法很难解决对象之间相互循环引用的问题,所以目前JVM采用可达性分析算法来判断Java对象是否是可回收对象。   1.2 可达性分析算法       面试官:那你讲讲可达性分析算法?      可达性分析顾名思义就是以某个起始点来判断它是否可达,这个起始点称为GC Roots。如果Java对象不能从GC Roots作为起始点往下搜索到,那该对象就被视为垃圾对象,即可回收对象。   可以作为GC Roots对象一共包括以下四种,这点也是面试官常问的:       虚拟机栈中引用的对象。    本地方法栈中引用的对象。    方法区中类静态属性引用的对象。    方法区中常量引用的对象。      2. 垃圾回收器   2.1 垃圾回收区域       面试官:垃圾回收器回收的是哪个区域?      JVM由五大区域组成:堆内存、方法区、程序计数器、虚拟机栈、本地方法栈。先说结论,垃圾回收器回收的是堆内存和方法区两大区域。   程序计数器、虚拟机栈、本地方法栈的内存分配和回收都具备确定性,都是随着线程销毁而销毁,因此不需要进行回收。   但在堆内存、方法区中,内存分配和回收都是动态的,我们只有在运行期间才能知道会创建哪些对象;另外这些垃圾对象不会自动销毁,如果任由这两部分区域的垃圾对象不管,势必造成内存的浪费甚至有内存泄漏的可能。   垃圾回收器存在的意义就是通过自动检测和回收这些垃圾对象,来减少内存泄漏的风险。   2.2 回收永久代       面试官:那永久代不会进行垃圾回收对吧?      虽然永久代的垃圾回收效率是比较低的,但永久代里的废弃常量和无用的类仍然会被回收。   例如创建一个字符串常量name,该字符串会存在于常量池中。如果该字符串没有任何String对象去引用它,当发生内存回收时有必要会清除该废弃常量。   private static final String name = "JavaGe                                  
点赞 4
评论 2
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务