黑马Java虚拟机JVM(三)

黑马Java虚拟机JVM(三),第1张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5661294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存