参考文章
串行,单线程垃圾收集器,STOP the World现象. client 默认新生代算法,实现简单,单核环境效率高复制算法:新生代 8:1:1 minorGc, 1/10分配给suviror幸存者。
多线程版本的Serial收集器,多用在server端的新生代收集器
G1 是一款面向服务端应用的垃圾收集器,它没有新生代和老年代的概念,而是将堆划分为一块块独立的 Region。当要进行垃圾收集时,首先估计每个 Region 中垃圾的数量,每次都从垃圾回收价值最大的 Region 开始回收,因此可以获得最大的回收效率。从整体上看, G1 是基于“标记-整理”算法实现的收集器,从局部(两个 Region 之间)上看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。
每个 Region 都有一个 Remembered Set,用于记录本区域中所有对象引用的对象所在的区域
• MinorGC 的过程(复制->清空->互换),年龄+1,
• 16次还存活移到old区。
• Eden
• from Survivor
• to survivor
• MajorGC 采用标记清除算法
• 大对象、对象的年龄达到老年的标准
• 存放 Class 和 Meta(元数据)的信息
• 垃圾确认
• 引用计数法-循环引用问题
• 可达性分析,GC root两次标记确认
• Mark Sweep-标记、清除两个阶段
• 内存碎片化严重
• 内存一分为二,满则移动存活的对象到另一半内存,清除当前。
• 利用率低,存活对象多,效率低。
• 标记阶段
• 整理阶段把存活的对象移动到一端
• 新生代
• 复制算法,大部分对象要回收,复制的数据量少
• 老年代
• 标记复制算法,回收的对象少,移动的数据少。
线程内存:java内存模型中的线程的工作内存是CPU的寄存器和高速缓存的一个抽象描述
主内存
数据总线 一致性协议
为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。
链接
内存模型解决并发问题主要采用两种方式:限制处理器优化和使用内存屏障
JMM
零拷贝(Zero-copy)及其应用详解
参考文章
通过参数 -XX:GCTimeRadio 设置垃圾回收时间占总 CPU 时间的百分比。
通过参数 -XX:MaxGCPauseMillis 设置垃圾处理过程最久停顿时间。
通过命令 -XX:+UseAdaptiveSizePolicy 开启自适应策略。
只要设置好堆的大小和 MaxGCPauseMillis 或 GCTimeRadio,收集器会自动调整新生代的大小、Eden 和 Survivor 的比例、对象进入老年代的年龄,以最大程度上接近我们设置的 MaxGCPauseMillis 或 GCTimeRadio。
参考文章