Synchronization Mode 同步模型 是一种最基本的传统计算模型.基本特征就是,主线程必须要停下来,等待外部调用返回,然后才能继续执行主线程的代码. 1234567891011121314public class Main { private static String externalService() throws InterruptedException { Thread.sleep(50 2021-12-31 development #java #asynchronization
Concurrent Mark Sweep algorithm CMS是一个针对 #老生代 的 #并发 #分代收集器从这一收集器开始,我们迈入了 #并发 时代,就是说,某些时刻用户线程和GC线程可以一起运行.本收集器可以和 [[Parallel New]]一起使用 1java -XX:+UseConcMarkSweepGC -jar Main.java 收集器是以获取最少的 #STW ,它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程 2021-09-26 development #jvm #gc
Core Issue of GC 垃圾回收的理念确实非常棒,但判断一个垃圾回收算法和垃圾回收器优劣应该有以下几个标准. 应用程序暂停的时间#STW 砸瓦鲁多是GC中的一个专有名词,特指为了使得内存状态稳定,需要将所有应用线程全部停下,这期间GC线程进行工作.短暂的STW可能不会让用户察觉到,但长时间的STW会导致极差的用户体验,是一个GC算法和收集器应该极力避免的. 即一次GC所导致的 #STW 时间应该尽量少.例如 #ZGC 收 2021-09-26 development #java #jvm #gc
Garbage First algorithm G1即垃圾优先收集器,理念是以不完全的GC来降低的 #STW尽管G1收集器有分代的概念,但本质上是一个 #分区收集器 在整个堆中,以一个大小的单位分割成很多小的规则的块.和其他例如[[Serial]], [[Parallel Scavenge]]等收集器不同,G1中的 #新生代 和 #老生代 并不是连续的,而是散落开的,一块一块散落在整个堆里 因此每次回收不需要扫描整个堆,而只需要查看几个需要 2021-09-26 development #jvm #gc
Garbage Collector Overview 上图展示了不同垃圾收集器之间的可组合关系. G1 ZGC Shenandoah Parallel Scavenge Parallel Old Parallel New Serial CMS 2021-09-26 development #jvm #gc
Java Reference Type 从Java 1.2版本开始引入了java.lang.ref这个包,里面定义了总共三种引用类型 虚引用 弱引用 软引用 接下来我们把Java中所有的引用可能性都来讲解一遍.顺序是从最弱到最强. 无引用如字面意思,就是说这个对象,完全没有任何引用能访问到它,因此该对象可以被GC. 12345// 分配内存var o = new Object();// 从此开始该对象就不再有引用可以访问到它o = 2021-09-26 development #java
Mark Compact algorithm 和 #mark-sweep 一样 首先需要 #STW 从 #gcroot 出发遍历所有对象,将不可达的对象标记上 然后将标记过的对象全都进行回收 #STW 将剩下的存活对象整理好并排布在内存的前端 #mark-compact 的特点就是可以消除内存碎片问题,大幅提高内存完整度,但也正因为这个整理的操作,该算法需要更多 #STW 来整理内存,并将原来的引用指向新的对象地址 2021-09-26 development #jvm #gc
Mark Copy algorithm 某些文档里会称copy为 #scavenge 和 #mark-sweep #mark-compact 两个算法不太一样的是,在 #mark-copy 算法中,我们将内存我们需要操作的内存分成两个区域,分别称为from和to区域,但其实他们的意义和名字 并没有直接关系,因为他们两个是等价的,只使用名字做一个区分而已. 因此有的文档上也将这两个区域称为survivor 1和survivor 2,统称 2021-09-26 development #jvm #gc
Mark Sweep algorithm 首先需要 #STW 从 #gcroot 出发遍历所有对象,将不可达的对象标记上 然后将标记过的对象全都进行回收 #mark-sweep 法作为最最基础的算法是非常符合直觉的,也非常容易实现.但非常明显的一个问题就是,容易造成内存碎片化,到最后明明内存有的是,但由于每个内存之间不连续,无法一次性分配出足量的连续内存,导致系统崩溃 2021-09-26 development #jvm #gc
Object Generational Assumption 根据统计显示,绝大部分创建出来的对象都符合如下图般的规律. 大部分对象的存活时间都非常短,刚创建出来一会儿就不再有引用了.例如在做计算的过程中所创建出来的对象,在一个计算公式结束后计算过程中所有的中间临时变量都不再有用了. 而另外,有一小半对象的存活时间会非常长,甚至是一直存在于进程之中的.例如系统配置变量等需要全局引用的对象等. 剩下的那些存活时间不长也不短的对象,则仅仅占据了非常小的比例. 2021-09-26 development #java #jvm #gc