网站收录和反链都正常关键词却没有排名的原因,简答题网络营销是什么,成都市住房和城乡建设厅官网,电商数据查询平台为解决CMS算法产生空间碎片和其它一系列的问题缺陷#xff0c;HotSpot提供了另外一种垃圾回收策略#xff0c;G1#xff08;Garbage First#xff09;算法#xff0c;通过参数-XX:UseG1GC来启用#xff0c;该算法在JDK 7u4版本被正式推出#xff0c;官网对此描述如下HotSpot提供了另外一种垃圾回收策略G1Garbage First算法通过参数-XX:UseG1GC来启用该算法在JDK 7u4版本被正式推出官网对此描述如下
The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories. It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbage collector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:Can operate concurrently with applications threads like the CMS collector.
Compact free space without lengthy GC induced pause times.
Need more predictable GC pause durations.
Do not want to sacrifice a lot of throughput performance.
Do not require a much larger Java heap.G1垃圾收集算法主要应用在多CPU大内存的服务中在满足高吞吐量的同时尽可能的满足垃圾回收时的暂停时间该设计主要针对如下应用场景
垃圾收集线程和应用线程并发执行和CMS一样空闲内存压缩时避免冗长的暂停时间应用需要更多可预测的GC暂停时间不希望牺牲太多的吞吐性能不需要很大的Java堆 翻译的有点虚多大才算大
堆内存结构
1、以往的垃圾回收算法如CMS使用的堆内存结构如下
新生代eden space 2个survivor老年代old space持久代1.8之前的perm space元空间1.8之后的metaspace
这些space必须是地址连续的空间。
2、在G1算法中采用了另外一种完全不同的方式组织堆内存堆内存被划分为多个大小相等的内存块Region每个Region是逻辑连续的一段内存结构如下 每个Region被标记了E、S、O和H说明每个Region在运行时都充当了一种角色其中H是以往算法中没有的它代表Humongous这表示这些Region存储的是巨型对象humongous objectH-obj当新建对象大小超过Region大小一半时直接在新的一个或多个连续Region中分配并标记为H。
Region
堆内存中一个Region的大小可以通过-XX:G1HeapRegionSize参数指定大小区间只能是1M、2M、4M、8M、16M和32M总之是2的幂次方如果G1HeapRegionSize为默认值则在堆初始化时计算Region的实践大小具体实现如下 默认把堆内存按照2048份均分最后得到一个合理的大小。
GC模式
G1中提供了三种模式垃圾回收模式young gc、mixed gc 和 full gc在不同的条件下被触发。
young gc
发生在年轻代的GC算法一般对象除了巨型对象都是在eden region中分配内存当所有eden region被耗尽无法申请内存时就会触发一次young gc这种触发机制和之前的young gc差不多执行完一次young gc活跃对象会被拷贝到survivor region或者晋升到old region中空闲的region会被放入空闲列表中等待下次被使用。
参数含义-XX:MaxGCPauseMillis设置G1收集过程目标时间默认值200ms-XX:G1NewSizePercent新生代最小值默认值5%-XX:G1MaxNewSizePercent新生代最大值默认值60%
mixed gc
当越来越多的对象晋升到老年代old region时为了避免堆内存被耗尽虚拟机会触发一个混合的垃圾收集器即mixed gc该算法并不是一个old gc除了回收整个young region还会回收一部分的old region这里需要注意是一部分老年代而不是全部老年代可以选择哪些old region进行收集从而可以对垃圾回收的耗时时间进行控制。
那么mixed gc什么时候被触发
先回顾一下cms的触发机制如果添加了以下参数
-XX:CMSInitiatingOccupancyFraction80
-XX:UseCMSInitiatingOccupancyOnly当老年代的使用率达到80%时就会触发一次cms gc。相对的mixed gc中也有一个阈值参数 -XX:InitiatingHeapOccupancyPercent当老年代大小占整个堆大小百分比达到该阈值时会触发一次mixed gc.
mixed gc的执行过程有点类似cms主要分为以下几个步骤
1、initial mark: 初始标记过程整个过程STW标记了从GC Root可达的对象 2、concurrent marking: 并发标记过程整个过程gc collector线程与应用线程可以并行执行标记出GC Root可达对象衍生出去的存活对象并收集各个Region的存活对象信息 3、remark: 最终标记过程整个过程STW标记出那些在并发标记过程中遗漏的或者内部引用发生变化的对象 4、clean up: 垃圾清除过程如果发现一个Region中没有存活对象则把该Region加入到空闲列表中
full gc
如果对象内存分配速度过快mixed gc来不及回收导致老年代被填满就会触发一次full gcG1的full gc算法就是单线程执行的serial old gc会导致异常长时间的暂停时间需要进行不断的调优尽可能的避免full gc.