引用计数算法
判断的标准:
通过判断对象的引用数量来决定对象是否可以被回收。
每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。
任何引用计数为0的对象实例可以被当作垃圾收集。
优点: 执行效率高,程序执行受影响较小
缺点: 无法检测岀循环引用的情况,导致内存泄露
可达性算法:
通过判断对象的引用链是否可达来决定对象是否可以被回收
可以用作GC Root的对象?
标记—清除算法(Mark and Sweep)
标记: 从根集合进行扫描,对存活的对象进行标记
清除: 对堆内存从头到尾进行线性遍历,回收不可达对象内存
缺点: 会导致碎片化。
复制算法(Copying)
优点:
标记—整理算法(Compacting)(老年代)
标记:从根集合进行扫描,对存活的对象进行标记。
清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。
优点:
分代收集算法(Generational Conllector)
垃圾回收算法的组合拳
按照对象生命周期的不同划分区域以采用不同的垃圾回收算法
目的:提高JVM的回收效率
GC的分类:
Minor GC:(新生代清除算法)
Full GC:(老年代清除算法)
当达到15岁以后,会存到老年代,或者Eden区和Survivor装不下,也会到老年代
对象如何晋升到老年代
新生成的大对象(-XX+ Pretenuer Size threshold)(达到15岁以后)
—XX:Survivorratio:Eden和 Surviⅳor的比值,默认8:1。
—XX:Newratio:老年代和年轻代内存大小的比例。
—XX:MaxTenuringThreshold:对象从年轻代晋升到老生代经过GC次数的最大阈值。
老年代:(存放声明周期较长的对象)
使用算法:
标记—清理算法
标记—整理算法
对整个堆内存进行垃圾回收:
Full GC 和Major GC
Full GC比 Minor GC慢,10倍左右,但执行频率低
触发Full GC的条件
Stop-the-World(停止服务)
Safepoint(安全位置)
常见的垃圾收集器
JVM的运行模式:
Server:重量级虚拟机,启动慢,但是启动后快。
Client:轻量级虚拟机,奇动快,但是启动后慢。
java -version
垃圾收集器之间的联系
年轻代常见的垃圾收集器
Seria收集器(-XX:+ Use SerialGC,复制算法)
单线程收集,进行垃圾收集时,必须暂停所有工作线程。
简单高效,Client模式下默认的年轻代收集器。
几十至几百兆基本需要几十到几百毫秒。可以忍受。
ParDew收集器(-XX+ Use ParNewGC,复制算法)
多线程收集,其余的行为、特点和 Seria收集器一样。
单核执行效率不如 Serial,在多核下执行才有优势。
开启的线程数和你的CPU核数相关。
Parallel Scavenge收集器(-XX:+ UseParallelgc,复制算法)
比起关注用户线程停顿时间,更关注系统的吞吐量。
在多核下执行才有优势,Server模式下默认的年轻代收集器。
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
Serial Old收集器(-XX:+UseSerialOldGC,标记—整理算法)
Parallel old收集器(-XX:+UseParalleloldgC,标记-整理算法)
多线程,吞吐量优先。
CMS收集器(-XX+ Use ConcMarkSweepGC,标记清除算法)(最主要的)
几乎能与用户线程同时工作(减少停顿时间)
回收的步骤:(1.4会让JVM停止工作)
CMS有3个明显的缺点:
G1收集器(既用于年轻代,又用于老年代)(-XX:+UseG1GC,复制+标记-整理算法)
特点:
将整个Java堆划分为多个大小相等的Region。
年轻代和老年代不再物理隔离。
1)Object的finalize()方法的作用是否与C++的析构函数作用相同
2)、Java中的强引用,软引用,弱引用,虚引用有什么用?
强引用:(Strong Reference)
软引用:(Soft Reference)
String str = new String(“abc”);
SoftReference softReference = new SoftReference<>(str);
弱引用:(Weak Reference)
String str = new String(“abc”);
WeakReference weakReference = new WeakReference<>(str);
虚引用:(PhantomReference)
String str = new String(“abc”);
ReferenceQueue queue = new ReferenceQueue<>();
PhantomReference ref = new PhantomReference<>(str, queue);
四种引用的区别?
强引用>软引用>弱引用>虚引用
类层次结构
引用队列(Reference Queue)