红色好看的网站,中山网站建设工作室,阿里云虚拟机怎么做多个网站,设计类专业哪个好金三银四马上到了#xff0c;即将进入面试的高峰期。在BAT面试中#xff0c;JVM基本都是必考的系列。你至少需要掌握JVM内存模型与JVM参数详细配置#xff0c;JVM的4种垃圾回收算法、垃圾回收机制与总结#xff0c;以及今天重点谈到的JVM垃圾回收算法的实现#xff1a;JVM… 金三银四马上到了即将进入面试的高峰期。在BAT面试中JVM基本都是必考的系列。你至少需要掌握JVM内存模型与JVM参数详细配置JVM的4种垃圾回收算法、垃圾回收机制与总结以及今天重点谈到的JVM垃圾回收算法的实现JVM垃圾收集器。 我先从JVM收集器的发展过程谈起然后再聚焦在G1收集器从G1的内存模型再到G1的回收流程最后再谈谈G1的实际应用场景。 JVM垃圾收集器发展历程 JVM垃圾收集器发展历程 第一阶段Serial串行收集器 在jdk1.3.1之前java虚拟机仅仅能使用Serial收集器。 Serial收集器是一个单线程的收集器但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作更重要的是在它进行垃圾收集时必须暂停其他所有的工作线程直到它收集结束。 第二阶段Parallel并行收集器 Parallel收集器也称吞吐量收集器相比Serial收集器Parallel最主要的优势在于使用多线程去完成垃圾清理工作这样可以充分利用多核的特性大幅降低gc时间。 第三阶段CMS并发收集器 CMS收集器在Minor GC时会暂停所有的应用线程并以多线程的方式进行垃圾回收。在Full GC时不再暂停应用线程而是使用若干个后台线程定期的对老年代空间进行扫描及时回收其中不再使用的对象。 第四阶段G1并发收集器 G1收集器或者垃圾优先收集器的设计初衷是为了尽量缩短处理超大堆大于4GB时产生的停顿。相对于CMS的优势而言是内存碎片的产生率大大降低。 JVM垃圾收集器种类 JVM垃圾收集器 1.新生代 Serial 第一代 PraNew 第二代 Parallel Scavenge 第三代 G1收集器第四代 2.老年代 Serial Old 第一代 Parallel Old 第二代 CMS 第三代 G1收集器 第四代 详细的垃圾收集器比较具体可以查看直通BAT必考题系列7种JVM垃圾收集器特点优劣势、及使用场景 JDK1.7后全新的JVM垃圾收集器G1收集器, 目标用于取代CMS收集器。 G1收集器概述 从JDK1.3开始HotSpot团队一直努力朝着高效收集、减少停顿STW: Stop The World的方向努力也贡献了从串行Serial收集器、到并行收集器Parallerl收集器再到CMS并发收集器乃至如今的G1在内的一系列优秀的垃圾收集器。 G1Garbage First垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家庭中成为HotSpot重点发展的垃圾回收技术。同优秀的CMS垃圾回收器一样G1也是关注最小时延的垃圾回收器也同样适合大尺寸堆内存的垃圾收集官方也推荐使用G1来代替选择CMS。 1.G1收集器的最大特点 G1最大的特点是引入分区的思路弱化了分代的概念。 合理利用垃圾收集各个周期的资源解决了其他收集器甚至CMS的众多缺陷。 2.G1相比较CMS的改进 算法 G1基于标记-整理算法, 不会产生空间碎片分配大对象时不会无法得到连续的空间而提前触发一次FULL GC。 停顿时间可控 G1可以通过设置预期停顿时间Pause Time来控制垃圾收集时间避免应用雪崩现象。 并行与并发G1能更充分的利用CPU多核环境下的硬件优势来缩短stop the world的停顿时间。 3.CMS和G1的区别 CMS中堆被分为PermGenYoungGenOldGen而YoungGen又分了两个survivo区域。在G1中堆被平均分成几个区域region在每个区域中虽然也保留了新老代的概念但是收集器是以整个区域为单位收集的。 G1在回收内存后会马上同时做合并空闲内存的工作、而CMS默认是在STWstop the world的时候做。 G1会在Young GC中使用、而CMS只能在O区使用。 4.G1收集器的应用场景 G1垃圾收集算法主要应用在多CPU大内存的服务中在满足高吞吐量的同时尽可能的满足垃圾回收时的暂停时间。 就目前而言、CMS还是默认首选的GC策略、可能在以下场景下G1更适合 服务端多核CPU、JVM内存占用较大的应用至少大于4G 应用在运行过程中会产生大量内存碎片、需要经常压缩空间 想要更可控、可预期的GC停顿周期防止高并发下应用雪崩现象 G1的堆内存算法 1.G1之前的JVM内存模型 新生代伊甸园区eden space 2个幸存区 老年代 持久代perm spaceJDK1.8之前 元空间metaspaceJDK1.8之后取代持久代 2.G1收集器的内存模型 1G1堆内存结构 堆内存会被切分成为很多个固定大小区域Region每个是连续范围的虚拟内存。 堆内存中一个区域Region的大小可以通过-XX:G1HeapRegionSize参数指定大小区间最小1M、最大32M总之是2的幂次方。 默认把堆内存按照2048份均分。 2G1堆内存分配 每个Region被标记了E、S、O和H这些区域在逻辑上被映射为EdenSurvivor和老年代。 存活的对象从一个区域转移即复制或移动到另一个区域。区域被设计为并行收集垃圾可能会暂停所有应用线程。 如上图所示区域可以分配到Edensurvivor和老年代。此外还有第四种类型被称为巨型区域Humongous Region。Humongous区域是为了那些存储超过50%标准region大小的对象而设计的它用来专门存放巨型对象。如果一个H区装不下一个巨型对象那么G1会寻找连续的H分区来存储。为了能找到连续的H区有时候不得不启动Full GC。 G1回收流程 在执行垃圾收集时G1以类似于CMS收集器的方式运行。 1.G1收集器的阶段分以下几个步骤 1G1执行的第一阶段初始标记Initial Marking 这个阶段是STWStop the World 的所有应用线程会被暂停标记出从GC Root开始直接可达的对象。 2G1执行的第二阶段并发标记 从GC Roots开始对堆中对象进行可达性分析找出存活对象耗时较长。当并发标记完成后开始最终标记Final Marking 阶段 3最终标记标记那些在并发标记阶段发生变化的对象将被回收 4筛选回收首先对各个Regin的回收价值和成本进行排序根据用户所期待的GC停顿时间指定回收计划回收一部分Region 最后G1中提供了两种模式垃圾回收模式Young GC和Mixed GC两种都是Stop The WorldSTW的。 G1的GC模式 1.YoungGC年轻代收集 在分配一般对象非巨型对象时当所有eden region使用达到最大阀值并且无法申请足够内存时会触发一次YoungGC。每次younggc会回收所有Eden以及Survivor区并且将存活对象复制到Old区以及另一部分的Survivor区。 YoungGC的回收过程如下 根扫描,跟CMS类似Stop the world扫描GC Roots对象。 处理Dirty card,更新RSet. 扫描RSet,扫描RSet中所有old区对扫描到的young区或者survivor去的引用。 拷贝扫描出的存活的对象到survivor2/old区 处理引用队列软引用弱引用虚引用 2.mixed gc 当越来越多的对象晋升到老年代old region时为了避免堆内存被耗尽虚拟机会触发一个混合的垃圾收集器即mixed gc该算法并不是一个old gc除了回收整个young region还会回收一部分的old region这里需要注意是一部分老年代而不是全部老年代可以选择哪些old region进行收集从而可以对垃圾回收的耗时时间进行控制。 G1没有fullGC概念需要fullGC时调用serialOldGC进行全堆扫描包括eden、survivor、o、perm。 G1的推荐用例 G1的第一个重要特点是为用户的应用程序的提供一个低GC延时和大内存GC的解决方案。这意味着堆大小6GB或更大稳定和可预测的暂停时间将低于0.5秒。 如果应用程序使用CMS或ParallelOld垃圾回收器具有一个或多个以下特征将有利于切换到G1 Full GC持续时间太长或太频繁 对象分配率或年轻代升级老年代很频繁 不期望的很长的垃圾收集时间或压缩暂停超过0.5至1秒 注意如果你正在使用CMS或ParallelOld收集器并且你的应用程序没有遇到长时间的垃圾收集暂停则保持与您的当前收集器是很好的升级JDK并不必要更新收集器为G1。 你可能也喜欢: 直通BAT必考题系列7种JVM垃圾收集器特点优劣势、及使用场景直通BAT必考题系列深入详解JVM内存模型与JVM参数详细配置直通BAT必考题系列JVM的4种垃圾回收算法、垃圾回收机制与总结直通BAT JVM必考题Minor GC、Major GC、Full GC的区别 直通BAT必考题系列JVM性能调优的6大步骤及关键调优参数详解阿里P8架构师谈JVM的内存分配、运行原理、回收算法机制