强引用 类似 Object o = new Object();这类的引用。只要引用还在,垃圾回收器就不会回收掉被引用的对象。
软引用 SoftReference类 只有在内存不足的时候JVM才会回收该对象 在系统即将发生内存溢出异常之前,会将这些对象列入回收范围。 应用场景: java里面一般你可以用于图像的bitmap流,特别是照片很多的时候。
弱引用 WeakReference类 当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象 应用场景:如果一个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么应该用 Weak Reference 来记住此对象。
4.虚引用 PhantomReference类 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获得一个对象实例。
存储自身对象的运行时数据(eg:哈希码(hashcode)),GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等 这部分数据在长度为32位虚拟机跟64位的虚拟机中分别是32bit 64bit
1.2.类型指针
对象指向它的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。(注意一点的是:如果对象是java数组,那么对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通的java对象的元数据确认java对象大小但是从数组的元数据中却无法确定数组的大小)
2.对齐填充 padding
不是必然存在,也没有特别的含义。仅仅作占位符的作用。 因为HotSpot VM的自动内存管理系统要求对象的其实地址必须是8字节的整数倍。而对象头刚好是八的倍数 因此,当对象的实例数据部分没有对其时,它用来填充补全。
3.实例数据
真正对象存储的有效信息,也是对程序代码中所定义的各种类型的字段内容。父类继承下来的或者子类定义的都需要记录。存储的顺序受 虚拟机的分配策略参数跟字段在java源码中定义的顺序影响。
好处:存储稳定的句柄地址,在对象别移动的时候(垃圾收集时移动对象很普遍)时只会改变句柄中的实例数据指针,而reference本身不需要修改。
好处:最大的好处就是快,直接指向对象实例数据(对象实例数据再优质镇)。节省了一次对象的指针的定位
分为 标记跟清除阶段:标记要收回收的对象,然后统一回收。 缺点: 1 效率问题 标记跟清除两个过程效率都不高; 2 标记清除后,产生大量不连续的内存碎片; 3 空间碎片导致分配较大内存对象的时候,无法找到足够的内存连续空间导致提前另外触发另一次垃圾收集动作。
一般商业虚拟机使用这种收集算法来回收新生代。 一般将其分为 Eden : survivor : survivor 8:1:1 一般使用 Eden 跟其中一个survivor,等到回收的时候将存活的对象复制到没有使用的survivor内存区域。 有时候不能保证10%的survivor内存足够,依赖于其他的内存(老年代)进行分配担保 3. 标记 - 整理算法
跟标记清楚算法差不多,但是第二步骤不是清楚,而是移动,将所有存活的对象向一边移动,然后清空其他的内存。 4. 分代收集算法
根据对象存货周期不同将内存进行划分为几块。 一般划为:新生代跟老年代。 新声代:有大批对象死去,只有少量存活,选用复制算法。(只需付出少量存活对象的复制成本就可以完成收集) 老年代:对象存活率高,没有二外的空间对它进行担保。就必须使用标记 - 整理算法 或者 标记 - 清除算法
七种垃圾收集器的 连线上的可以互相搭配