• 内存以及垃圾回收


    一、直接内存

    属于系统内存

    常见于NIO操作,用于数据缓冲区

    分配回收成本比较高,但读写性能高

    不受JVM垃圾回收管理

    2、分配和回收的原理

    会出现内存溢出

    调用free.memory方法使内存释放,使用了unsafe对象完成直接内存的分配回收,并且回收需要主动调用free.memory方法

    ByteBuffer的实现类内部,使用了Cleaner(虚引用)来监测ByteBuffer对象,一旦ByteBuffer对象被垃圾回收,那么就会由ReferenceHandler线程通过Cleaner的clean方法调用freemomory来释放直接内存

    二、垃圾回收

    1、引用计数法:有弊端,有的线程相互调用,形成循环,计数器始终不为0,无法被回收

    2、可达性分析法:java虚拟机判断对象是否是垃圾(扫描堆中的对象,看是否能沿着Gc Root 对象为起点的引用链找到该对象,找不到,表示可以回收)

    哪些对象可视为Gc Root?

    通过可视化对象去看

    三、四种引用

    1、强引用

    只有所有Gc Root 对象都不通过强引用引用该对象,该对象才能被回收

    2、软引用

    仅有软引用 引用该对象时,在垃圾回收后,内存仍不足时会再次出现垃圾回收,回收软引用对象

    可以配合引用队列来释放软引用本身

    3、弱引用

    仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象

    可以配合引用队列来释放弱引用本身

    4、虚引用

    必须配合引用队列来使用,主要配合ByteBuffer使用,被引用对象回收时,会将虚引用入列,由Reference Handler线程调用虚引用相关方法释放直接内存

    5、终结器引用无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收,再由finalizer线程通过终结器引用找到被引用对象,并调用它的finalize方法,第二次Gc时才能回收被引用对象)

    四、垃圾回收算法

    1、标记清除法:速度快,但是会造成空间不连续(找到那些不被引用的对象)

    2、标记整理:不会产生内存碎片,整理牵扯到了对象的移动,速度较慢

    3、复制:内存区域划分成大小相等的两个区

    优点:不产生内存碎片

    缺点:需要占用双倍内存空间

    4、分代回收:结合3种算法,协同工作

    对象首先分配在伊甸园区,新生代空间不足时,触发minor gc ,伊甸园和 from存活的对象使用copy复制到to,存活的对象年龄加1,并交换 from 和 to 这两个内存区

    minor gc 会引发 stw , 使其他的用户或线程暂停,让垃圾回收先工作,等垃圾回收结束,用户线程才恢复

    当对象寿命超过阈值时,会晋升到老年代,最大寿命是15(4bit)

    当minor gc 回收后,当老年代空间不足,会先尝试触发 minor gc ,如果之后空间仍不足,那么触发full gc,stw 的时间会更长

  • 相关阅读:
    华为云云服务器云耀L实例评测 | 在华为云耀L实例上搭建电商店铺管理系统:一次场景体验
    java算法学习索引之数组矩阵问题
    阿里云Elasticsearch搜索
    汽车云算力“竞速”,个性化进阶成新风向
    测试外包服务 | 从人员外包到测试工具、测试平台,提供全方位的测试解决方案~
    Linux下 gdb调试打印数组元素说明
    深度神经网络是谁开发的,神经网络专业硕士就业
    Chatbot(五)
    基于Proteus平台的TEC-5H模型计算机电路设计与仿真
    计算机专业毕设课设选题攻略
  • 原文地址:https://blog.csdn.net/m0_70905607/article/details/127447805