- 常见于NIO *** 作时,用于数据缓冲区
- 分配回收成本较高,但读写性能高
- 不受JVM内存回收管理
- 只要一个对象被其它变量所引用,则计数加一,如果被引用了两次,则计数变为二,如果某个变量不再引用它,则计数减一。如果计数变为零,会被回收。
- 存在循环引用的问题。如下图,A B不会被回收
- 根对象:可理解为肯定不会被回收的对象
- 在垃圾回收之前,先对堆中所有对象进行扫描,看看每个对象是否被跟对象直接或者间接引用,如果被引用,则不能回收,否则将被回收
- Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
- 扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收
- 强引用
- 只有所有GC Roots对象都不通过强引用引用该对象,该对象才能被垃圾回收
- 软引用(SoftReference)
- 仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次触发垃圾回收,回收软引用对象
- 可以配合引用队列来释放软引用自身
- 弱引用(WeakRefence)
- 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
- 可以配合引用队列来释放弱引用自身
- 虚引用(Phantom Reference)
- 必须配合引用队列使用,主要配合ByteBuffer使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存
- 终结器引用(Final Reference)
- 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用对象
- 标记清除 (Mark Sweep)
- 速度较快
- 会造成内存碎片
- 标记整理(Mark Compact)
- 速度慢
- 没有内存碎片
- 复制(Copy)
- 不会有内存碎片
- 需要占用双倍内存空间
- 对象首先分配在伊甸园区
- 新生代空间不足时,触发minor gc,伊甸园和from存活的对象使用copy复制到to中,存活的对象年龄加1并且交换from to
- minor gc会引发stop the world,暂停其它用户线程,等垃圾回收结束后,用户线程才恢复运行
- 当对象寿命超过阈值时,会晋升至老年代,最大寿命是15(4bit)
- 当老年代空间不足,会先尝试触发minor gc,如果之后空间仍不足,那么触发full gc,STW的时间更长
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)