对象的四种引用类型java
怎么判断对象是否仍在使用?算法
可做为GC Roots的对象有哪几类?缓存
方法区回收的必要条件安全
主要回收两部份内容:废弃的常量和再也不使用的类型。性价比很低架构
安全点和安全区域并发
HotSpot没有为每一条指令生成OopMap,只在“特定位置”记录了这些信息(OopMap可理解成附加信息,对栈内的数据进行说明),这些位置称为安全点,线程在安全点能够被肯定,从而肯定GC Roots信息。布局
安全点特定位置性能
安全区域线程
安全区域是指一段代码片中,引用关系不会发生变化,在这个区域任何地方 GC 都是安全的,安全区域能够看作是安全点的一个扩展code
并发状况下的可达性变更解决算法(G1和cms)
标记-清除算法
标记须要回收的对象或不须要回收的对象,再统一清除。
缺点:
标记-复制算法
把内存空间分为两块,每次只使用其中一块,当该块内存不足后,把存活的对象复制到另外一块,再把原空间一次性清除。
优势:没有内存碎片。
缺点:内存空间利用率低;当存活对象较多时,效率变低
标记-整理算法
标记完成后,将存活的对象向一端移动,清除边界之外的内容
优势:内存规整,对象赋值/建立速度快
缺点:标记、清理效率不高
分代收集
分代收集是将对象按照存活时间进行分代(新生代和老年代),根据不一样区域的特色结合前三种算法进行收集
新生代复制算法的改进:许多新生代的对象存活时间较短,不须要按照1:1的比例进行复制算法内存分配,可将内存分为较大的Eden区和两块较小的Survivor,回收时将Eden 和 Survivor 中还存活着的对象一次性地复制到另一块 Survivor 空间上,最后清理掉 Eden 和刚才用过的 Survivor 空间
新生代
老年代
CMS
响应时间优先,标记清除算法。多用于B/S架构的服务端上
G1
面向整个堆空间的Region布局形式,每一个Region均可以扮演Eden、Survivor或老年代空间。容许设定收集停顿时间