GC:垃圾收集算法
1,引用计数法:引用的时候计数器+1,引用失效计数器—1,弊端:循环引用无法解决,加减操作使得性能降低
2,标记清除法,引用时标记,失去引用时清除标记,存在空间碎片问题,空间不连续
优化方法
3,复制算法:其核心思想就是将内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中所有的对象,反复去交换两个内存的角色,完成垃圾收集。(java中新生代的from和to空间就是使用的这个算法)
4,标记压缩法:在标记清除法的基础上做了优化,把存活的对象压缩到内存的一端,而后进行垃圾清理(java中老年代使用的是标记压缩法)
- 分代算法:就是根据对象的特点把内存分成N块,而后根据每个内存的特点使用不同的算法。
- 对于新生代和老年代来说,新生代回收频率很高,但是每次回收耗时都很短,而老年代回收频率低,但是耗时会相对较长,所以应该尽量减少老年代的GC.
- 分区算法:其主要就是将整个内存分为N多个小的独立空间,每个小空间都可以独立使用,这样细粒度的控制一次回收多少个小空间和那些个小空间,而不是对整个空间进行GC,从而提升性能,并减少GC的停顿时间。
垃圾回收时的停顿现象
垃圾回收器的任务是识别和回收垃圾对象进行内存清理,为了让垃圾回收器可以高效的执行,大部分情况下,会要求系统进入一个停顿的状态。停顿的目的是终止所有应用线程,只有这样系统才不会有新的垃圾产生,同时停顿保证了系统状态在某一个瞬间的一致性,也有益于更好的标记垃圾对象。因此在垃圾回收时,都会产生应用程序的停顿。