- 停止-复制算法:
将可用的内存按容量划分为大小相等的两块(from,to),每次只是用其中一块(总有一块是空的【to区域】)。当这一苦熬的内存用完了,就将还存活着的对象复制到另外一块上面,然后把已使用过的内存空间一次清理完。
HotSpot虚拟机默认Eden和Survivor大小的比例是8:1,也就是每次新生代中可用的内存空间为整个新生代容量的90%,只有10%的内存时被浪费的。
缺点:浪费内存空间,如果对象存活率较高时要执行较多的复制操作,效率降低。
图解:有一块内存区域是空的,一般是to区域。保留区域每次回收后都因为复制的时候让他们变为连续的地址空间,所有不产生内存碎片。 - 标记-清除算法:
先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
缺点:回收了被标记的对象后,由于未经过整理,所以导致很多内存碎片
图解:绿色是被标记为可回收的,当回收后,未使用的内存空间非常零碎,产生内存碎片。 - 标记-整理算法:
标记整理算法的“标记”过程和标记-清除算法一致,只是后面并不是直接对可回收对象进行整理,而是让所有存活的对象都向一段移动,然后直接清理掉端边界意外的内存。
图解:由于标记后继续整理,可以很明显的看出未使用的地址空间都是连续的,不会产生内存碎片。
垃圾回收是JAVA虚拟机垃圾回收期提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制
引用:如果Reference类型的数据中存储的数值代表的是另外一块内存的其实地址,就称这块内存代表着一个引用
1.强引用:只要强引用还存在,垃圾回收期就永远不会回收掉被引用的对象
2.软引用:它用来描述一些可能还有用,但并非必须的对象,在系统内存不够用时,这类引用关联的对象将被垃圾回收器回收
3.弱引用:它也是用来描述废墟对象,但她的强度比软引用更若邪,被弱引用关联的对象只能生存到下一次垃圾回收器发生之前,当垃圾回收器发生工作的时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象
4.虚引用:最弱的一种引用,不会对对象的生命周期造成任何印象,也无法通过虚引用来取得一个对象的实例,把对象设置虚引用关联的唯一目的是希望能在这个对象呗收集器回收时收到一个系统通知。
JAVA的垃圾回收器
1.串行垃圾回收器(年轻代/老年代)
2.并行垃圾回收器(年轻代/老年代)
3.ParNew(串行的多线程版本)
4.CMS(WEB项目常用的垃圾回收器)
5.G1(年轻代老年代都可用,减少用户的响应时间,给用户良好的体验)