在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失一般性,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了。这种方式成为引用计数法。
这种方式的特点是实现简单,而且效率较高,但是它无法解决循环引用的问题,因此在Java中并没有采用这种方式(Python采用的是引用计数法)。
为了解决这个问题,在Java中采取了 可达性分析法。
该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
垃圾回收算法:
1,mark-sweep标记清楚算法,最容易实现,但是有可能导致过多的内存碎片;
2,copying算法,实现简单,运行高效,对内存空间对使用造成浪费
3,Mark-compact 标记整理,不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理边界以外的内存;
4,Generational Collection 算法,是目前大多数JVM垃圾收集器,采用的算法,核心是根据对象存活的周期长度分为若干个不同的区域,将堆区分为Tenured Generation和Young Generation,T的特点是只有少量对象才会被gc大部分用Mark-compact,Y大量,大部分用Copying;
5,在堆区之外还有一个代就是永久代(Permanet Generation),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类。