对象引用和垃圾回收器
强引用:
只要对象有强引用关系,GC就不会对他进行清除.
即使内存不够,也只会抛出异常OOM
软引用:(内存不够即回收)
虚拟机尽量让软引用存活时间长一些,只有在内存不够时,才会进行回收.
第一次回收是不可达对象,当系统内存不够时,对有着软引用关联的对象进行回收,在抛出内存溢出异常前,进行回收.如果内存还是不够,抛出内存溢出异常.
弱引用:
在GC时,只要发现弱引用,就会直接进行回收,不管内存是否足够.
虚引用:(对象回收跟踪)
又称为"幽灵引用",是引用类型中最弱的一个.
通过虚引用的get方法无法获得数据,它的唯一目的是跟踪垃圾回收过程.
GC时如果发现虚引用,就会将他加入引用队列,以便于通知应用程序对象的回收情况
可以将一些资源释放操作放在虚引用中执行和记录.
垃圾回收器
按线程数分: 串行垃圾回收器和并行垃圾回收器
串行:在同一个时间段内只有一个CPU用于执行垃圾回收操作,此时工作线程暂停,直到GC完成.
按工作模式分:分为独立式垃圾回收器和并发式垃圾回收器
并发式与应用程序交替执行,减少应用程序的停顿时间
独立式一旦运行,停止所有的应用程序线程,直到结束.
按工作区间分:年轻代垃圾回收器和老年代垃圾回收器
性能指标:
**吞吐量:**代码运行时间占总时间的比例(总运行时间:程序运行时间和内存回收时间)
**暂停时间:**执行GC时,工作线程的暂停时间
垃圾收集开销:垃圾收集时间占总时间的比例
收集频率:相比于应用程序,收集操作发生的频率
内存占用:java堆区所占用的大小
快速:一个对象从创建到被回收的时间
CMS回收器(低延迟)
以获取停顿时间最短为目标的收集器
优点:
并发收集
低延迟
缺点:
1.会产生内存碎片
2.对CPU资源比较敏感:
占用一部分线程导致应用程序变慢.总吞吐量降低
3.无法处理浮动垃圾
在并发标记时如果出现新的垃圾对象,无法对象其进行标记
G1回收器(区域划分代式)
需要做三件事:
分配内存
确保存活的对象
回收垃圾对象
从整体上看: 它是基于"标记-整理"算法实现的收集器
从局部上看:他是基于"复制"算法实现的 ;这就意味着没有内存碎片.
流程:
- 标记阶段,不断循环进行
- Evacuation phase:该阶段是把region中一部分活的对象拷贝到空的region中,回收原本的region空间.该阶段是SWT的.
特点:
- 收集尽可能多的垃圾,不是一次性回收所有的垃圾
- 将内存划分为多个大小相等内存分区
- 属于分代收集器,年轻代和老年代都会回收