串行( Serial GC垃圾回收器 ):
串行是一个时代过了很久的一个垃圾回收器,串行被jdk1.3所支持
串行是一个单线程(一个人工作)
串行的工作流程:
新生代内存达到一定的阈值了就引发了垃圾回收( minor GC )把标记的回收掉
然后复制到 这时就会阻塞线程(STW)把其他线程也进行阻塞 然后一个垃圾回收线程进行 垃圾回收 垃圾回收完之后就 恢复正常运行
吞吐量优先(Parellel GC 垃圾回收器)并行回收: 会STW( stop the word)
jvm的参数:顾名思义
-XX:+UseParallelGC (新生代) -XX:+UseParallelOldGC (老年代) (这是个开关 开启任意一个就会把另一个开启)
-XX:+UseAdaotiveSizePolicy ( 用来动态的管理堆内存中 的 新生代和老年代 还有 伊甸园(Eden) 幸存区 (survivor) )
-XX:+ParallelGCThreads=n ( 用来设置线程数量的)
-XX:+GCTimeRatio 吞吐量的计算公式 : 吞吐量 = 用户线程 / (用户线程 + 垃圾回收时间)
比如: 回收垃圾100分钟只有1分钟来回收垃圾
-XX:+MaxGcpauseMillis=ms (每次回收的时间 默认200ms)
吞吐量优先是一个多线程(多个人一起工作)
吞吐量优先是jdk 1.8 引入进来的 并且还是jdk8默认的垃圾回收器
吞吐量优先的基本流程:
首先内存不足时就会 引发垃圾回收 Minor GC 把一些没有被GC Roots 所引用的对象标记起来,然后就复制到 幸存区中
响应时间优先(CMS GC垃圾回收器)并发回收:只要是并发 都不会stop the word(STW)暂停其他线程
响应时间优先是一个多线程(多个人一起工作)
响应时间优先的执行流程:
当老年代的内存不足时 会进入安全点 然后进行初始标记(会STW)暂停其他线程 ,
完了之后就进行并发标记(因为是并发标记 用户线程和垃圾回收线程并发执行)不会干扰其他用户线程 过了这并发标记之后
就会进行重新标记(会STW)在做重新标记之前会把新生代的 垃圾做一次垃圾回收 免得全部都重新标记一下就效率就低了很多
最后做一个并发清理 不会干扰到其他用户线程
G1 GC( garbage first 垃圾回收器 )区域分代:每个区域都划分为相同大的区域
分别为3个部分 young Collection -->> young Collection + Concurrent Mark -->> Mined Collection 然后又回来 young Collection
可以看到这三个部分是循环的
G1 是jdk9默认的垃圾回收器 ,将堆内存划分为多个相同的大小的区域(region)
而这些区域包含新生代(伊甸园 Eden 幸存区 survivor)老年代