Java中高级面试题(6)
点击上方“Java知音”,选择“置顶公众号”
技术文章第一时间送达!
知音专栏
对于有一定经验的开发者,在面试过程中多多少少都会被问及jvm相关知识,但是往往在实际开发中涉及较少,这里整理一些知识点做一期面试题库拿出来,希望对有用到朋友有一些参考。
小编水平有限,可以把常考题型列出来,但解答部分仅做参考,如果有知识点错误希望能够留言纠正,如果是有更好的参考答案,更加欢迎留言大家探讨,我会置顶,以上这些,下面是正题。
Java语言中一个显著的特点就是引入了垃圾回收机制,这个大家都清楚,垃圾回收的概念这里也不做介绍,重点是垃圾回收是在什么时候开始?对什么东西,做了什么事情?
GC何时开始:
所有的回收器类型都是基于分代技术来实现的,那就必须要清楚对象按其生命周期是如何划分的。
年轻代:划分为三个区域:原始区(Eden)和两个小的存活区(Survivor),两个存活区按功能分为From和To。绝大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的对象放到存活区。垃圾回收绝大部分发生在年轻代。
年老代:存储年轻代中经过多个回收周期仍然存活的对象,对于一些大的内存分配,也可能直接分配到永久代。
持久代:存储类、方法以及它们的描述信息,这里基本不产生垃圾回收。
有了以上这些铺垫之后开始回答GC何时开始:
Eden内存满了之后,开始Minor GC(从年轻代空间回收内存被称为 Minor GC);升到老年代的对象所需空间大于老年代剩余空间时开始Full GC(但也可能小于剩余空间时,被HandlePromotionFailure参数强制Full GC)
对什么东西操作,即垃圾回收的对象是什么:
从root开始搜索没有可达对象,而且经过第一次标记、清理后,仍然没有复活的对象。
做了什么东西:
主要做了清理对象,整理内存的工作。具体的引申如下
垃圾回收器的类型:
串行垃圾回收器(Serial Garbage Collector)
并行垃圾回收器(Parallel Garbage Collector)
并发标记扫描垃圾回收器(CMS Garbage Collector)
G1垃圾回收器(G1 Garbage Collector)
垃圾回收算法:
引用计数法
标记清除法
复制算法
标记压缩算法
分代算法
分区算法
以上这些,可以自己了解一下,这里列举几篇相关文章:
类在虚拟机中的加载过程
加载Loading:
通过一个类的全限定名来获取一个二进制字节流、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
验证Verification:
确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机的自身安全。
准备Preparation:
正式为类变量分配内存并设置类变量初始值。
解析Resolution:
虚拟机将常量池内的符号引用替换为直接引用的过程。
初始化Initialization:
类加载过程的最后一步,到了这个阶段才真正开始执行类中定义的Java程序代码。
使用Using:
根据你写的程序代码定义的行为执行。
卸载Unloading:
GC负责卸载,这部分一般不用讨论。
以上这些抛砖引玉,欢迎留言更清晰的类加载过程,相关文章可以阅读:
强引用、软引用、弱引用、虚引用与GC的关系
强引用:new出的对象之类的引用,只要强引用还在,永远不会回收。
软引用:引用但非必须的对象,内存溢出异常之前回收。
弱引用:非必须的对象,对象只能生存到下一次垃圾收集发生之前。
虚引用:对生存时间无影响,在垃圾回收时得到通知。
这个相对好理解了,相关阅读如下: