动易网站设计方案,郑州营销网站建设,网站建设公司经营,企业邮箱登录入口学习笔记系列开头惯例发布一些寻亲消息
链接#xff1a;https://baobeihuijia.com/bbhj/contents/3/190801.html
java垃圾回收#xff08;stop the world#xff09;
专注于堆和方法区的垃圾回收#xff0c;年轻代#xff0c;老年代#xff0c;永久代判断对象是否还存…学习笔记系列开头惯例发布一些寻亲消息
链接https://baobeihuijia.com/bbhj/contents/3/190801.html
java垃圾回收stop the world
专注于堆和方法区的垃圾回收年轻代老年代永久代判断对象是否还存活区分尸体 引用计数算法 给每个对象保存一个整型的引用计数器类型用于记录对象被引用的情况缺点就是无法处理循环引用的情况导致内存泄漏 可达性分析算法 找到GC ROOT对象从根节点开始扩展访问 finalization机制死前挣扎机制 用于在对象被回收时进行资源释放比如关闭文件套接字和数据库连接等。由于finalize的存在对象有三种状态 可触及的活着可复活的finalize重写过并且还没有执行因此有机会进行死亡逃脱不可触及的直接打死 垃圾回收三种算法清理尸体 复制算法常用在新生代这种回收率较高的块上有一块是专门用来备用的清除的时候将存活对象复制到备用上然后清除当前使用的内存块交换两个的块的角色标记-清除算法挨个清理容易产生内存碎片维护一个空闲列表是一种非移动式的回收算法标记-压缩清除在标记清除的基础上加上了内存碎片的整理而不是维护一个列表因此是一种移动式的回收算法 增量收集算法解决stop the world 每次垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。使用这种方式由于在垃圾回收过程中间断性地还执行了应用程序代码所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。 分代算法和分区算法针对不同情况用不同的垃圾回收算法 内存溢出OOM和内存泄漏ML stop the world,所有的GC都会有这种情况 GC的并发和并行 concurrent 并发多个事情在同一段时间内同时发生用户线程和垃圾回收线程同时执行不会停顿用户进程 STW 并行多个事情在用一个时间点上同时发生多条垃圾回收并行用户处于等待状态串行相对于并行单线程运行 安全点: 数量需要适中安全点实质上是一条指令(一般选择执行时间较长的指令作为安全点) 抢先式中断控制权在安全点把所有线程挂起没有运行到安全点的就恢复让运行到安全点主动式中断线程运行到这里主动询问主动挂起 安全区是扩展的安全点在区域的任何位置GC都是安全的安全区的对象引用关系不会变化 JVM会忽略标记进入到安全区的线程线程还可以自主运行没有被停因为其中的每句都是安全的但等到线程出来的时候就检查GC是否完成完成了就可以走没完成就得等着要是进入了不安全区域而且这个线程还没有被停住就容易让JVM和改变后的引用关系发生冲突 引用是有引用的可触及的对象所以不会被判定为尸体但是不一定有引用就会存活也分情况 强引用有用 只要引用关系存在JVM宁愿OOM也不会回收对象是造成内存泄漏的原因之一强引用可以直接访问目标对象 软引用有用但是非必须 即将内存溢出时回收这些软可达对象回收后内存还是不够才抛出异常 weak弱引用(非必须) 不管堆空间使用情况下一次垃圾回收器工作一定会回收掉GC的优先级很低一般很久才能拿到线程所以也能保有很久当系统内存不足时这些缓存数据会被回收不会导致内存溢出。而当内存资源充足时这些缓存数据又可以存在相当长的时间从而起到加速系统的作用。软引用、弱引用都非常适合来保存那些可有可无的缓存数据。 虚引用虚引用不会对对象的生存造成影响如果只有虚引用那么和没有引用是一样的 唯一作用就是对象回收时会收到一个系统通知可以用来跟踪对象回收时间 终结器引用并不是一种对象还被别的对象需要的信号而是将所有需要执行finalize的对象全都加进来 Finalizer线程通过终结器引用找到对象并执行finalize方法