![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java虚拟机学习
文章平均质量分 83
Java虚拟机学习
shangjg3
这个作者很懒,什么都没留下…
展开
-
G1垃圾收集器的回收过程
上页提到的Remebered Set就是上述Reset,上页提到的Reference类型就是引用类型,其中Reset的作用是记录当前Region中哪些对象被外部引用指向,比如Old区中的对象会指向Eden区的对象,然后当我们要回收某个Region的时候,直接遍历当前Region中的所有对象就可以了,然后针对性的去找到那些指向当前对象的其他对象,最终确定当前对象是否是根可达的。如果垃圾占比太低,意味着存活的对象占比高,在复制的时候会花费更多的时间,则该region不会被回收。4、第四阶段,复制对象。原创 2024-06-20 14:45:35 · 563 阅读 · 0 评论 -
G1垃圾收集器
使用G1收集器时,它将整个Java堆划分成约2048个大小相同的独立Region块,每个Region块大小根据堆空间的实际大小而定,整体被控制在1MB到32MB之间,且为2的N次幂,即1MB,2MB,4MB,8MB,16MB,32MB。内存的回收是以region作为基本单位的。HotSpot垃圾收集器里,除了G1以外,其他的垃圾收集器使用内置的JVM线程执行GC的多线程操作,而G1 GC可以采用应用线程承担后台运行的GC工作,即当JVM的GC线程处理速度慢时,系统会调用应用程序线程帮助加速垃圾回收过程。原创 2024-06-20 14:44:41 · 554 阅读 · 0 评论 -
CMS 垃圾收集器
CMS收集器的垃圾收集算法采用的是标记-清除算法,这意味着每次执行完内存回收后,由于被执行内存回收的无用对象所占用的内存空间极有可能是不连续的一些内存块,不可避免地将会产生一些内存碎片。要保证用户线程能继续执行,前提的它运行的资源不受影响。重新标记(Remark)阶段:由于在并发标记阶段中,程序的工作线程会和垃圾收集线程同时运行或者交叉运行,因此为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短。原创 2024-06-19 18:39:55 · 857 阅读 · 0 评论 -
图解ZGC
为了获得更好的 GC 表现,JDK 16 在支持就地搬移的同时,也支持预留(Reserve)堆内存的方式,并且 ZGC 不需要真的预留空闲的堆内存。默认情况下,只要有空闲的 region,ZGC 就会使用预留堆内存的方式,如果没有空闲的 region,否则 ZGC 就会启用就地搬移。不过就地搬移也有一定的挑战。● GC 标记线程访问对象时,如果对象地址视图是 Remapped,就把对象地址视图切换到 Marked0,如果对象地址视图已经是 Marked0,说明已经被其他标记线程访问过了,跳过不处理。原创 2024-06-18 19:06:39 · 754 阅读 · 0 评论 -
ZGC原理
并发转移阶段:在并发转移阶段,ZGC会将剩余的对象转移到新的ZPage中,并在转移后将新旧对象的地址对记录到转移映射表中。如果发现引用的对象已经完成了转移(例如,对象5已经转移到了新的位置),它会更新这个引用,使其指向对象5的新位置,并将remap标记为1,表示已经完成了重新映射。因此,在ZGC的并发转移阶段,通过用户线程和GC线程之间的智能协作,确保了垃圾收集过程的顺利进行和系统的高效运行。这种放弃不是简单的停止操作,而是GC线程的一种智能决策,它基于ZGC的并发转移策略和对系统状态的理解。原创 2024-06-18 17:42:30 · 314 阅读 · 0 评论 -
JVM垃圾收集器总结
CMS默认晋升老年代为6的原因: 简单来说,CMS对内存尤其敏感,且会导致单线程Serial FullGC 这个是非常严重的后果,而从结果上说越大的MaxTenuringThreshold会更快的导致heap的碎片化(不光old 区,首先要明白对于内存的分配并不是真的一个对象一个对象紧密排列的),所以历代CMS 默认这个值都会比较小(JDK8以前是4,之后调整为6)用户线程和垃圾收集线程同时执行(但并不一定是并行的,可能是交替执行的),垃圾收集线程在执行的时候不会停顿用户线程的运行。原创 2024-06-18 03:00:00 · 786 阅读 · 0 评论 -
JVM 垃圾收集算法
动态对象年龄判定:(虚拟机并不会永远地要求对象的年龄都必须达到MaxTenuringThreshold才能晋升老年代,如果Survivor空间中相同年龄的所有对象的大小总和大于Survivor的一半,年龄大于或等于该年龄的对象就可以直接进入老年代),空间分配担保,老年代的连续空间大于(新生代所有对象的总大小或者历次晋升的平均大小)就会进行minor GC,否则会进行full GC。首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,也可以反过来标记存活的对象,然后回收违背标记的对象。原创 2024-06-17 17:17:13 · 569 阅读 · 0 评论 -
JVM新生代老年代永久代的划分
如果Eden区放不下这个对象,虚拟机会使用复制算法发生一次Minor GC,清除掉无用对象,同时将存活对象移动到Survivor的其中一个区(fromspace区或者tospace区)。发生MinorGC,对象会从Eden区进入Survivor区,如果Survivor区放不下从Eden区过来的对象时,此时会使用分配担保机制将对象直接移动到年老代。1.第一次Yong GC(Minor GC)后,Eden区还存活的对象复制到Surviver区的“To”区,“From”区还存活的对象也复制到“To”区,原创 2024-06-17 10:31:25 · 445 阅读 · 0 评论