Java 8 内存管理原理解析及内存故障排查实践( 四 )

TLAB作用原理:Java在内存新生代Eden区域开辟了一小块线程私有区域,这块区域为TLAB,默认占Eden区域大小的1% ,  作用于小对象,因为小对象用完即丢,不存在线程共享,快速消亡GC,JVM优先将小对象分配在TLAB是线程私有的,所以没有锁的开销 , 效率高,每次只需要线程在自己的缓冲区分配即可,不需要进行锁同步堆。
对象除了基本类型的不一定是在堆内存分配 , 在JVM拥有逃逸分析,能够分析出一个新的对象所拥有的范围,从而决定是否要将这个对象分配到堆上,是JVM的默认行为;Java 逃逸分析是一种优化技术,可以通过分析 Java 对象的作用域和生命周期,确定对象的内存分配位置和生命周期 , 从而减少不必要的内存分配和垃圾回收 。可以在栈上分配,可以在栈帧上创建和销毁,分离对象或标量替换,同步消除 。
public class TaoYiFenxi {Object obj;public void setObj() {obj = new Object();}public Object getObject() {Object obj1 = new Object();return obj1;}public void test1() {synchronized (new Object()) {}} }2.2.6 JVM垃圾收集器特点与原理
(1)Serial垃圾收集器、Serial Old垃圾收集器

Java 8 内存管理原理解析及内存故障排查实践

文章插图
Serial收集器采用复制算法 ,  作用在年轻代的一款垃圾收集器,串行运行,执行过程中会STW , 是使用单个线程进行垃圾回收 , 响应速度优先 。
Serial Old 收集器采用标记整理算法,作用在老年代的一款收集器,串行运行,执行过程中会暂停所有用户线程,会STW,使用单个线程进行垃圾回收,响应速度优先 。
使用场景:
适合内存小几十兆以内,比较适合简单的服务或者单CPU服务,避免了线程交互的开销 。
优点:
小堆内存且单核CPU执行效率高 。
缺点:
堆内存大,多核CPU不适合,回收时长非常长 。
(2)Parallel Scavenge垃圾收集器、Parallel Old垃圾收集器
Java 8 内存管理原理解析及内存故障排查实践

文章插图
Parallel Scavenge垃圾收集器采用了复制算法 , 作用在年轻代的一款垃圾收集器,是并行的多线程运行,执行过程中会发生STW,关注与程序吞吐量 。
Parallel Old垃圾收集器采用标记整理算法,作用,作用在老年代的一款垃圾收集器,是并行的多线程运行 , 执行过程中会发生STW , 关注与程序吞吐量 。
Parallel Scavenge + Parallel Old组合是Java8当中默认使用的一个组合垃圾回收 。
所谓的吞吐量是CPU用于运行用户代码时间与CPU总消耗时间的比值,也就是说吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集器时间),录入程序运行了100分钟 , 垃圾收集器花费时间1分钟 , 则吞吐量达到了99% 。
使用场景:
适用于内存在几个G之间 , 适用于后台计算服务或者不需要太多交互的服务,保证吞吐量的服务 。
优点:
可控吞吐量、保证吞吐量,并行收集 。
缺点:
回收期间STW,随着堆内存增大 , 回收暂停时间增大 。
(3)Par New垃圾收集器
Par New垃圾收集器采用了复制算法 , 作用在年轻代的一款垃圾收集器 ,  也是并行多线程运行 , 跟Parallel非常相似 , 是它的增强版本,或者说是Serial收集器的多线程版本,是搭配CMS垃圾收集器特制的一个收集器 。
使用场景:
搭配CMS使用
(4)CMS垃圾收集器
CMS是一款多线程+分段操作的一款垃圾收集器 。其最大的优点就是将一次完整的回收过程拆分成多个步骤,并且在执行的某些过程中可以使用户线程可以继续运行 , 分别有初始标记,并发标记,重新标记,并发清理和并发重置 。
Java 8 内存管理原理解析及内存故障排查实践

文章插图
CMS是一款多线程+分段操作的一款垃圾收集器 。其最大的优点就是将一次完整的回收过程拆分成多个步骤,并且在执行的某些过程中可以使用户线程可以继续运行,分别有初始标记,并发标记,重新标记,并发清理和并发重置 。
CMS分段