花店网站建设构思,六安发布,ssh做的网站,wordpress oracle目录 前言一、垃圾回收器分类二、垃圾回收器介绍1、Serial 收集器2、ParNew 收集器3、Parallel Scavenge 收集器4、Serial Old 收集器5、Parallel Old 收集器6、CMS 收集器#xff08;多线程标记清除算法#xff09;7、G1 收集器 三、项目中垃圾收集器选型 前言 Java的垃圾回… 目录 前言一、垃圾回收器分类二、垃圾回收器介绍1、Serial 收集器2、ParNew 收集器3、Parallel Scavenge 收集器4、Serial Old 收集器5、Parallel Old 收集器6、CMS 收集器多线程标记清除算法7、G1 收集器 三、项目中垃圾收集器选型 前言 Java的垃圾回收器其作用是用于回收程序在运行时所产生的垃圾对象无引用的对象因为Java程序一般情况下不用自己释放内存会交由垃圾回收器处理针对不同业务可以选择不同的垃圾回收器本文会对Java常见的几种垃圾回收器做介绍
一、垃圾回收器分类
Java的垃圾回收器大致可以按照三个维度划分每种垃圾回收器都有自己的特点。 按照所负责回收区域划分新生代回收器老年代回收器 按照GC执行的资源成本划分单线程回收多线程回收 按照与用户线程关系划分需暂停用户线程与用户线程并发
收集器回收区域收集算法回收器特征Serial新生代标记-复制单线程ParNew新生代标记-复制单线程Parallel Scavenge新生代标记-复制单线程Serial Old老年代标记-整理单线程Parallel Old老年代标记-整理多线程CMS老年代标记-清除并发多线程G1JDK1.7推出JDK1.9默认垃圾回收器跨代回收整体标记-整理 局部Region标记-复制并发多线程 二、垃圾回收器介绍
1、Serial 收集器 这是一个单线程的垃圾回收器即执行垃圾回收操作时只有一个GC线程工作最重要的是在他执行GC过程中必须全程暂停用户线程也就是经常说的STWStop the world问题这是jvm最早期的收集器虽然STW问题是确实是一个诟病但是这种方案实现起来较简单占用资源也是最小的对应新生代内存比较小的应用中相对比较适用比如运行在客户端模式下的Java程序。
2、ParNew 收集器 和Serial 收集器不同的是这是一款多线程收集器即有多条GC线程同时进行垃圾回收工作剩余其他的特点和Serial 收集器基本无异比如控制参数回收算法STW问题等作为一款新生代收集器常用来和CMS搭配使用ParNew是激活CMS后默认的新生代收集器由于多线程执行的原因在单核CPU下由于线程上下文的切换该收集器的效果甚至不如Serial收集器在多核CPU中才推荐使用。
3、Parallel Scavenge 收集器 Parallel Scavenge与ParNew实现上差别不大不同的是该收集器的侧重点是虚拟机的吞吐量吞吐量很好理解即用户代码的执行时间占整个系统运行时间的比重其中就包括GC时间。如果虚拟机运行期间GC消耗的时间占用的资源相对较高那吞吐量自然也就会下降。而Parallel Scavenge关注的就是吞吐量的可控尽可能的减少GC时间让用户线程执行更长的时间一些交互性比较弱的应用比如科学计算、批处理任务、订单流转等。 为了实现这个目标Parallel Scavenge提供了一些参数 -XX:MaxGCPauseMills 即“最大GC停顿毫秒值” 该值设置的大小是以新生代回收空间为代价的设置的值越小意味着所能回收的空间也会越小相应的GC频率自然会提高这个时候未必会提高吞吐量具体的设置多少需要根据应用的实际场景来决定 -XX:GCTimeRatio 该参数的范围是大于0小于100的整数意义是用户程序的运行时间和垃圾回收时间的比例比如设置为99那最大允许的垃圾回收时间为1%。 -XX:UseAdaptiveSizePolicy 直译过来就是“自适应大小策略”当这个参数被激活后就不需要指定新生代、Eden和Survivor区的比例-XX:SurvivorRatio、晋升老年代对象大小-XX:PretenureSizeThreshold等参数虚拟机会根据当前的运行状态收集性能监控信息动态调整这些参数以提供最合适的停顿时间和最大吞吐量。
4、Serial Old 收集器 Serial Old 是 Serial 垃圾收集器年老代版本它同样是个单线程的收集器使用标记-整理算法这个收集器也主要是运行在 Client 默认的 java 虚拟机默认的年老代垃圾收集器。 在 Server 模式下主要有两个用途1. 在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。2. 作为年老代中使用 CMS 收集器的后备垃圾收集方案
新生代 Serial 与年老代 Serial Old 搭配垃圾收集过程 新生代 Parallel Scavenge/ParNew 与年老代 Serial Old 搭配垃圾收集过程
5、Parallel Old 收集器 Parallel Old 收集器是Parallel Scavenge的年老代版本使用多线程的标记-整理算法在 JDK1.6才开始提供。在 JDK1.6 之前新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器只能保证新生代的吞吐量优先无法保证整体的吞吐量Parallel Old 正是为了在年老代同样提供吞吐量优先的垃圾收集器如果系统对吞吐量要求比较高可以优先考虑新生代 Parallel Scavenge和年老代 Parallel Old 收集器的搭配策略。
6、CMS 收集器多线程标记清除算法 Concurrent mark sweep(CMS) 收集器是一种周期性老年代垃圾收集器其最主要目标是获取最短垃圾回收停顿时间和其他年老代使用标记-整理算法不同它使用多线程的标记-清除算法。最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验。
CMS垃圾回收器垃圾回收主要分为4个阶段 1、初始标记只是标记一下 GC Roots 能直接关联的对象速度很快仍然需要暂停所有的工作线程。2、并发标记该阶段GC线程和应用线程并发执行遍历初始标记阶段标记出来的存活对象然后继续递归标记这些对象可达的对象。3、重新标记为了修正在并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录仍然需要暂停所有的工作线程但是因为在前面两个阶段已经将大部分对象已经标记这一步虽然需要暂停用户线程但是这个暂停时间也不会很长。4、并发清除这个阶段就是真正的清除垃圾对象的阶段和用户线程一起工作不需要暂停工作线程会将前几步标记的垃圾对象清除。
7、G1 收集器 Garbage firstG1 垃圾收集器采用了分区(Region)的思路将整个堆空间分成若干个大小相等的内存区域(1MB~32MB且必须是2的幂)每个Region根据需要都可以称为新生代的Eden区、Suivivor区或者老年代区收集器能够对扮演不同角色的Region采用不同的策略去处理这样无论是新创建的对象还是已经存活了一段时间的对象都能获得良好的收集效果。 同时Region还有一类特殊的humongous区域专门用来存储大对象只要超过了一个Region容量的一半就会被认为是大对象如果对象长度超过了Region的大小则会使用多个连续的humongous来存放G1的大多数行为会把该区域当做老年代来看待。 G1依然保留了新生代和老年代的概念逻辑上分代物理上分区内存中新生代和老年代不是固定的他们是一系列的“动态集合”通过这个动态集合建立一个可预测的停顿时间模型换句话说G1的回收是建立在这个停顿时间模型上的。每次回收都是以Region为单位让G1去跟踪每一个Region中垃圾的“价值大小”比如回收空间大小和回收所需的时间然后通过这个价值大小维护一个优先级的列表每次根据用户设定允许的收集停顿时间优先处理回收价值最大的那些Region这种划分Region空间以及具有优先级的区域回收方式使得G1在有限时间内尽可能获得更高的收集效率。
G1垃圾回收执行过程可分为以下四步 初始标记标记gc roots直接关联的对象修改TAMS指针的值目的是下阶段并发回收时能够继续正常的分配对象。这个阶段需要停顿用户线程但是相对比较短暂。并发标记从gc roots开始对对象图进行可达性分析找到有回收的对象这个阶段与用户线程并发。最终标记对并发标记时引用发生变化的对象重新标记通过原始快照的方式毫无疑问这阶段需要短暂暂停用户线程筛选回收负责更新Region的统计数据对各个Region的回收价值和成本进行排序结合用户指定的停顿时间制定回收计划可以自由选择任意多个region构成回收集然后把决定回收的那一部分region中存活的对象复制到空的region中再清理掉整个旧region空间由于要移动对象所以这个阶段也必须暂停用户线程有多个收集器线程并行完成 。 通过以上过程可以看出除了并发标记阶段其他阶段都需要暂停用户线程所以G1主要目标是在延迟可控的情况下获得尽可能高的吞吐量希望在延迟和吞吐量之间达到一个平衡。
三、项目中垃圾收集器选型
如何合理选择收集器项目配置堆内存有关系 1、入门级别网站 0.5-1GB可以使用单线程新生代Serial、老年代Serial Old2、有一定的访问量 1-4G新生代ParNew | Parallel Scavenge、老年代Parallel Old3、并发适中 4G左右新生代ParNew | Parallel Scavenge、老年代CMS响应式优先4、高并发项目8G以上G1收集器注重吞吐和响应时间