JVM及垃圾收集相关

一、垃圾收集器

1、Serial收集器是基础,历史最悠久的收集器。适合运行在客户端模式下的虚拟机。
2、ParNew收集器实际上是Serial收集器的多线程并行版本。适合运行在服务器端虚拟机的新生代垃圾回收器。
Parallel Scavenge收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器。
Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能 地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。
Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。
Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。这个收集器是直到JDK 6时才开始提供的,在此之前,新生代的Parallel Scavenge收集器一直处于相当尴尬的状态,原因是如果新生代选择了Parallel Scavenge收集器,老年代除了Serial Old(PS MarkSweep)收集器以外别无选择,其他表现良好的老年代收集器,如CMS无法与它配合工作。
3、除了Serial外,只有ParNew能与CMS配合工作。
4、CMS,基于标记清除算法,有空间碎片产生,第一款真正意义上支持并发的垃圾收集器,让垃圾收集器与用户线程(基本上)同时工作。用于回收老年代。CMS的出现巩固了ParNew的地位。
5、G1,Garbage First面向全堆的垃圾收集器,优先处理回收垃圾最大的那些Region。不会产生空间碎片。
6、哪些变量是GC ROOTS:虚拟机栈中引用的对象,在本地方法栈中引用的对象,方法区静态属性引用的对象,方法区常量引用的对象,所有被同步锁持有的对象。
当使用Serial、ParNew等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,既简单又高效;当使用CMS这种基于清除算法的收集器时,理论上就只能采用较为复杂的空闲列表来分配内存。

二、Java虚拟机

1、运行时数据区(虚拟机栈、本地方法栈、程序计数器、堆、方法区(运行时常量池)),直接内存。
2、如何new一个对象:
当Java虚拟机遇到一条字节码new 指令时,①首先将去检查这个指令的参数是否能在常量池中定位到一个类的引用符号,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程;②在类加载检查通过后,接下来虚拟机将为新生对象分配内存(指针碰撞和空闲列表两种划分可用空间的方式,线程安全问题);③内存分配完成后,虚拟机必须将分配到的内存空间(但不包括对象头)都初始化为零值,这步操作保证了对象的实例字段在Java代码中不赋初始值就直接使用;④内存分配完成后,设置对象的对象头;⑤在以上四步都完成后,从虚拟机的角度看,一个新的对象已经产生了。但new指令之后会接着执行<init>()方法,按照程序员的意愿对对象进行初始化,这样一个真正可用的对象才算完全被构造出来。

三、垃圾回收

1、垃圾回收算法:哪些内存需要回收?什么时候回收?如何回收?
①什么是垃圾:已经死去的对象,即不可能再被任何途径使用的对象。
②如何判断是否是待回收的垃圾:引用计数法,可达性分析算法。
强引用、软引用、弱引用、虚引用。
③分代收集理论:
弱分代假说,绝大多数对象都是朝生夕灭的;强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。这两个分代假说共同奠定了常用垃圾收集器的一致的设计原则,收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。这样可以同时兼顾垃圾收集的时间开销和内存空间的有效利用。
④垃圾回收算法:
标记-清除算法:首先标记处所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程。
标记-复制算法(新生代):为了解决标记-清除算法面对大量可回收对象时执行效率低的问题,以半区复制算法为例说明,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。
在此基础上,考虑到新生代的对象有98%熬不过第一轮收集,因此并不需要按照1:1的比例来划分新生代的内存空间。提出了一种更优化的半区复制分代策略,具体做法是把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块survivor,发生垃圾收集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已使用过的那块Survivor。
标记-整理算法(老年代):标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。针对老年代对象的死亡特征,提出一种有针对性的标记-整理算法,它的标记过程和标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。Stop The World。



全部评论

相关推荐

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