GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc()。
JVM在进行GC时,并不是对这三个区域统一回收。大部分的时候是回收新生代。引用计数算法是为每个对象一个计数器用来保存对象被引用的次数,如果该对象被其他对象引用,计数器加1,对该对象引用结束则计数器减1,当计数器为0时认为该对象已经没有任何引用,就会被回收。
复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另外一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾回收。如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合。优点:在垃圾对象多的情况下,效率较高。清理后,内存无碎片。缺点:在垃圾对象少的情况下,不适用,如:老年代内存。分配的2块内存空间,在同一个时刻,只能使用一般,内存使用率较低。
标记清除
标记清除算法的执行过程分为两个阶段:标记阶段、清除阶段。标记阶段会通过可达性分析将不可达的对象标记出来。清除阶段会将标记阶段标记的垃圾对象清除。
两次扫描严重浪费时间,会产生内存碎片不需要额外的空间
标记压缩
标记压缩算法可以解决标记清除算法的内存碎片问题。其算法可以看作三步:标记垃圾对象清除垃圾对象内存碎片整理
标记压缩清除
先标记清除几次
再压缩
内存效率:复制算法>标记清除算法>标记压缩算法(时间复制符)内存整齐度:复制算法=标记压缩算法>标记清除算法内存利用率:标记压缩算法=标记清除算法>复制算法 年轻代:存活率低------------复制算法老年代:区域大,存活率高 ----------标记清除(内存碎片不是太多)+标记压缩混合 实现
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删