java引用的 功能 和 意义:
java引用 分为 强引用,软引用,弱引用,虚引用。
强引用 :直接 用变量指定 java对象,该变量一直存在于 内存,直到 该 java对象 消失回收,那么变量一起回收。
软引用: 用变量指定 java对象,使用完变量后,将变量的值置为 null,如果 此时内存紧张,那么会将 该变量回收。
弱引用: 用SoftReference实现, 具体查看 API, 典型的实例有 WeakHashMap 。
虚引用: 必须和 其他几种引用一起使用。引用队列由 ReferenceQueue实现,虚引用通过 PhantomReference 类实现。
java对象 在内存中 的 不同状态:
可达,可恢复,不可达 三种状态 。
可达: 当有 变量引用到 java 对象时,是 可达状态。
可恢复: 当对象 没有 被变量引用到 时,会 先回收 放到 可恢复状态。
不可达 :当对象所有关联都被切断,且系统调用所有对象的 finalize 方法依然没有使其变成可达状态,那这个对象将 永久 失去 引用,变成 不可达状态。
java 垃圾回收机制的基本算法:
三种算法: 复制, 标记,压缩标记。
复制算法: 分配和原来内存空间一样大小的空间,将原内存空间内,所有可达对象复制到 新内存空间中。再删除原内存空间。
标记算法: 标记内存空间中,可达的对象,将没有标记的对象 删除。
标记压缩算法 : 结合以上两种算法。
堆内存的分代回收:
Young代,Old代,Permanent代 :
Young代: 执行最频繁,不断遍历可达对象,如果可达对象事实上 已经不可达了,那么回收调。
Old代 : 通过Young代的多次回收,依然是 可达状态的对象,那么垃圾回收机制将 这个对象 转移到 Old代。执行频率不会很高,因为很少有对象会死掉。
Permanent代 :主要用于装在class,静态方法等信息,垃圾回收机制 一般不会回收Permanent中的对象。