<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>NotionNext BLOG</title>
        <link>https://www.calfgz.cn//</link>
        <description>这是一个由NotionNext生成的站点</description>
        <lastBuildDate>Thu, 15 Jun 2023 09:35:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2023, calfgz</copyright>
        <item>
            <title><![CDATA[大型分布式网站架构技术总结]]></title>
            <link>https://www.calfgz.cn//article/architecture-summary.html</link>
            <guid>https://www.calfgz.cn//article/architecture-summary.html</guid>
            <pubDate>Tue, 22 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[大型网站的特点]]></description>
            <content:encoded><![CDATA[<div id="container" class="mx-auto undefined"><main class="notion light-mode notion-page notion-full-width notion-block-9feb7364286e477db4dd4c9335e82428"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-2818b7cddb0d431c8f30013af9e7e8fe" data-id="2818b7cddb0d431c8f30013af9e7e8fe"><span><div id="2818b7cddb0d431c8f30013af9e7e8fe" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2818b7cddb0d431c8f30013af9e7e8fe" title="大型网站的特点"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">大型网站的特点</span></span></h3><ul class="notion-list notion-list-disc notion-block-4c01c45f8b9d48abaff66cf1d0139c1d"><li>用户多，分布广泛</li></ul><ul class="notion-list notion-list-disc notion-block-0f34a75aae4046b382851846c33db1aa"><li>大流量，高并发</li></ul><ul class="notion-list notion-list-disc notion-block-7ce3d241b7fc40d3a1a6e91874cac645"><li>海量数据，服务高可用</li></ul><ul class="notion-list notion-list-disc notion-block-ade00a61453b4cb39f8fbc722278543a"><li>安全环境恶劣，易受网络攻击</li></ul><ul class="notion-list notion-list-disc notion-block-d064230bf1af4022864382ae9b053c9e"><li>功能多，变更快，频繁发布</li></ul><ul class="notion-list notion-list-disc notion-block-92d43fc80fef4b7a9a3036f764e1aa36"><li>从小到大，渐进发展</li></ul><ul class="notion-list notion-list-disc notion-block-84c598d0dc844ebab54abbbd58e41e11"><li>以用户为中心</li></ul><ul class="notion-list notion-list-disc notion-block-808bcfc7b3334ded9e8d0c5ef8656f09"><li>免费服务，付费体验</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-7953338d93814d32ba6c6de9790f00bf" data-id="7953338d93814d32ba6c6de9790f00bf"><span><div id="7953338d93814d32ba6c6de9790f00bf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#7953338d93814d32ba6c6de9790f00bf" title="大型网站架构目标"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">大型网站架构目标</span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-854a6b6aee4047bd998b71eee46e87fa"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="http://tva1.sinaimg.cn/large/006ZfUPvgy1herxt4s2owj30eq06xq5d.jpg" alt="notion image" loading="lazy" decoding="async"/></div></figure><ul class="notion-list notion-list-disc notion-block-7113d43bac3b45029506e624027cabb9"><li>高性能：提供快速的访问体验。</li></ul><ul class="notion-list notion-list-disc notion-block-651fb747b0b743458d27a702c821b753"><li>高可用：网站服务一直可以正常访问。</li></ul><ul class="notion-list notion-list-disc notion-block-8af3c4c81d564c0a960791c7b86b0bf6"><li>可伸缩：通过硬件增加/减少，提高/降低处理能力。</li></ul><ul class="notion-list notion-list-disc notion-block-8b3919ac29d642f8838080026327604e"><li>安全性：提供网站安全访问和数据加密，安全存储等策略。</li></ul><ul class="notion-list notion-list-disc notion-block-5ae17e79d3714fb99d99cdcc16a11364"><li>扩展性：方便的通过新增/移除方式，增加/减少新的功能/模块。</li></ul><ul class="notion-list notion-list-disc notion-block-27834cf9730245c6a8feff8604341519"><li>敏捷性：随需应变，快速响应；</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-65172c582dbd4278baa500284168e580" data-id="65172c582dbd4278baa500284168e580"><span><div id="65172c582dbd4278baa500284168e580" class="notion-header-anchor"></div><a class="notion-hash-link" href="#65172c582dbd4278baa500284168e580" title="大型网站架构模式"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">大型网站架构模式</span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-a1f3a170dc1f4f40844df41a6ba3834c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="http://tva1.sinaimg.cn/large/006ZfUPvgy1herxt4sbsvj30h2064din.jpg" alt="notion image" loading="lazy" decoding="async"/></div></figure><ul class="notion-list notion-list-disc notion-block-5a1388517eec4b36a2999da7962fdc14"><li>分层：一般可分为，应用层，服务层，数据层，管理层，分析层；</li></ul><ul class="notion-list notion-list-disc notion-block-902dbff450ff4a2a9191a4653a518131"><li>分割：一般按照业务/模块/功能特点进行划分，比如应用层分为首页，用户中心。</li></ul><ul class="notion-list notion-list-disc notion-block-9a6a85245b114316b725fc88bbd9e89f"><li>分布式：将应用分开部署（比如多台物理机），通过远程调用协同工作。</li></ul><ul class="notion-list notion-list-disc notion-block-2ef67624aab7439aadfc4d1bae0bf18f"><li>集群：一个应用/模块/功能部署多份（如：多台物理机），通过负载均衡共同提供对外访问。</li></ul><ul class="notion-list notion-list-disc notion-block-d11b8bb7848441b4b01397ee8cd62324"><li>缓存：将数据放在距离应用或用户最近的位置，加快访问速度。</li></ul><ul class="notion-list notion-list-disc notion-block-47ec5085ea964756953ac6df88ef3317"><li>异步：将同步的操作异步化。客户端发出请求，不等待服务端响应，等服务端处理完毕后，使用通知或轮询的方式告知请求方。一般指：请求——响应——通知 模式。</li></ul><ul class="notion-list notion-list-disc notion-block-061b2fc6673045a6b7c5435caae5071d"><li>冗余：增加副本，提高可用性，安全性，性能。</li></ul><ul class="notion-list notion-list-disc notion-block-6010884aff1547da84b849a75b79d86c"><li>安全：对已知问题有有效的解决方案，对未知/潜在问题建立发现和防御机制。</li></ul><ul class="notion-list notion-list-disc notion-block-969e1f31b52f4c8697f95b703a0412c9"><li>自动化：将重复的，不需要人工参与的事情，通过工具的方式，使用机器完成。</li></ul><ul class="notion-list notion-list-disc notion-block-954ec0e98fa049749a08290b3b081b35"><li>敏捷性：积极接受需求变更，快速响应业务发展需求。</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-ad2bd1af36cb49cbbbc4d53de2acdb67" data-id="ad2bd1af36cb49cbbbc4d53de2acdb67"><span><div id="ad2bd1af36cb49cbbbc4d53de2acdb67" class="notion-header-anchor"></div><a class="notion-hash-link" href="#ad2bd1af36cb49cbbbc4d53de2acdb67" title="高性能架构"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">高性能架构</span></span></h3><div class="notion-text notion-block-72c868d1671e4592a7fba3f1a9846d50">以用户为中心，提供快速的网页访问体验。主要参数有较短的响应时间，较大的并发处理能力，较高的吞吐量，稳定的性能参数。
可分为前端优化，应用层优化，代码层优化，存储层优化。</div><ul class="notion-list notion-list-disc notion-block-4648393d314e4ad5ba2e520605c5011b"><li>前端优化：网站业务逻辑之前的部分；</li></ul><ul class="notion-list notion-list-disc notion-block-1d05f779554d4457a483ad300f3da819"><li>浏览器优化：减少Http请求数，使用浏览器缓存，启用压缩，Css Js位置，Js异步，减少Cookie传输；</li></ul><ul class="notion-list notion-list-disc notion-block-a5e2c892f8db41cea0c81f6f647b1853"><li>CDN加速，反向代理；</li></ul><ul class="notion-list notion-list-disc notion-block-688c6ca2d0d94e40a25120625af6e05d"><li>应用层优化：处理网站业务的服务器。使用缓存，异步，集群</li></ul><ul class="notion-list notion-list-disc notion-block-e99a0328bb0049838b4232cb34c0e5fa"><li>代码优化：合理的架构，多线程，资源复用（对象池，线程池等），良好的数据结构，JVM调优，单例，Cache等；</li></ul><ul class="notion-list notion-list-disc notion-block-18c6360f9cec4f389d67d865d28ccfcd"><li>存储优化：缓存，固态硬盘，光纤传输，优化读写，磁盘冗余，分布式存储（HDFS），NOSQL等；</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-d413cfae99cf4528851e72c328c30544" data-id="d413cfae99cf4528851e72c328c30544"><span><div id="d413cfae99cf4528851e72c328c30544" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d413cfae99cf4528851e72c328c30544" title="高可用架构"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">高可用架构</span></span></h3><div class="notion-text notion-block-3f117a1d1c494e27a820f396d12c6f1e">大型网站应该在任何时候都可以正常访问。正常提供对外服务。因为大型网站的复杂性，分布式，廉价服务器，开源数据库，操作系统等特点。要保证高可用是很困难的，也就是说网站的故障是不可避免的。
如何提高可用性，就是需要迫切解决的问题。首先，需要从架构级别，在规划的时候，就考虑可用性。行业内一般用几个9表示可用性指标。比如四个9（99.99），一年内允许的不可用时间是53分钟。
不同层级使用的策略不同，一般采用冗余备份和失效转移解决高可用问题。</div><ul class="notion-list notion-list-disc notion-block-6fd0bf89d6c94fe2a2a33d16dd857837"><li>应用层：一般设计为无状态的，对于每次请求，使用哪一台服务器处理是没有影响的。一般使用负载均衡技术（需要解决Session同步问题），实现高可用。</li></ul><ul class="notion-list notion-list-disc notion-block-6107b10114c84f4b8d9f9dc7255f3fab"><li>服务层：负载均衡，分级管理，快速失败（超时设置），异步调用，服务降级，幂等设计等。</li></ul><ul class="notion-list notion-list-disc notion-block-96f0ee4274ff444fbf947f2c05a74d3f"><li>数据层：冗余备份（冷，热备[同步，异步]，温备），失效转移（确认，转移，恢复）。数据高可用方面著名的理论基础是CAP理论（持久性，可用性，数据一致性[强一致，用户一致，最终一致]）</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-e8831157549441d8ba23f7aa2925730b" data-id="e8831157549441d8ba23f7aa2925730b"><span><div id="e8831157549441d8ba23f7aa2925730b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#e8831157549441d8ba23f7aa2925730b" title="可伸缩架构"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">可伸缩架构</span></span></h3><div class="notion-text notion-block-a7b5601d9dbe4fe8bb2df84c5e058c8f">伸缩性是指在不改变原有架构设计的基础上，通过添加/减少硬件（服务器）的方式，提高/降低系统的处理能力。</div><ul class="notion-list notion-list-disc notion-block-1cfef64d51f64136a81af0c67ba7f645"><li>应用层：对应用进行垂直或水平切分。然后针对单一功能进行负载均衡（DNS,HTTP[反向代理],IP,链路层）。</li></ul><ul class="notion-list notion-list-disc notion-block-d770d52e6b03412c9e3f4152af19780b"><li>服务层：与应用层类似；</li></ul><ul class="notion-list notion-list-disc notion-block-196978324f534769b7d01f10eb3d2dc3"><li>数据层：分库，分表，NOSQL等；常用算法Hash，一致性Hash。</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-d359ef6bfdb445e6af6663be71e9a489" data-id="d359ef6bfdb445e6af6663be71e9a489"><span><div id="d359ef6bfdb445e6af6663be71e9a489" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d359ef6bfdb445e6af6663be71e9a489" title="可扩展架构"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">可扩展架构</span></span></h3><div class="notion-text notion-block-369c3015f8324f6ba89dbca17b1e7a89">可以方便的进行功能模块的新增/移除，提供代码/模块级别良好的可扩展性。</div><ul class="notion-list notion-list-disc notion-block-206948bc6c91472fb51c56c3b21f268b"><li>模块化，组件化：高内聚，内耦合，提高复用性，扩展性。</li></ul><ul class="notion-list notion-list-disc notion-block-69a1c9ef7f924bd5bd3b947a71d2b717"><li>稳定接口：定义稳定的接口，在接口不变的情况下，内部结构可以“随意”变化。</li></ul><ul class="notion-list notion-list-disc notion-block-edc9c25e3aa64c48834f2e9984d51919"><li>设计模式：应用面向对象思想，原则，使用设计模式，进行代码层面的设计。</li></ul><ul class="notion-list notion-list-disc notion-block-8e64aa7ead084f1db4950f332f7ba1ac"><li>消息队列：模块化的系统，通过消息队列进行交互，使模块之间的依赖解耦。</li></ul><ul class="notion-list notion-list-disc notion-block-05e846b0a4f8451ca1e34065b3bccd4b"><li>分布式服务：公用模块服务化，提供其他系统使用，提高可重用性，扩展性。</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-5c9fbd4e735f41b2a4d16f8b3d9000c8" data-id="5c9fbd4e735f41b2a4d16f8b3d9000c8"><span><div id="5c9fbd4e735f41b2a4d16f8b3d9000c8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#5c9fbd4e735f41b2a4d16f8b3d9000c8" title="安全架构"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">安全架构</span></span></h3><div class="notion-text notion-block-9723077a3fc14952aef7f4fe8e6e37f0">对已知问题有有效的解决方案，对未知/潜在问题建立发现和防御机制。对于安全问题，首先要提高安全意识，建立一个安全的有效机制，从政策层面，组织层面进行保障。比如服务器密码不能泄露，密码每月更新，并且三次内不能重复；每周安全扫描等。以制度化的方式，加强安全体系的建设。同时，需要注意与安全有关的各个环节。安全问题不容忽视。包括基础设施安全，应用系统安全，数据保密安全等。</div><ul class="notion-list notion-list-disc notion-block-f48acb4ec0ba484c831147dab5ca2b9b"><li>基础设施安全：硬件采购，操作系统，网络环境方面的安全。一般采用，正规渠道购买高质量的产品，选择安全的操作系统，及时修补漏洞，安装杀毒软件防火墙。防范病毒，后门。设置防火墙策略，建立DDOS防御系统，使用攻击检测系统，进行 子网隔离等手段。</li></ul><ul class="notion-list notion-list-disc notion-block-7f407001052b4089896a4c70c638e9cf"><li>应用系统安全：在程序开发时，对已知常用问题，使用正确的方式，在代码层面解决掉。防止跨站脚本攻击（XSS），注入攻击，跨站请求伪造（CSRF），错误信息，HTML注释，文件上传，路径遍历等。还可以使用Web应用防火墙（比如：ModSecurity），进行安全漏洞扫描等措施，加强应用级别的安全。</li></ul><ul class="notion-list notion-list-disc notion-block-491324fded9e489a916e94a852a0c221"><li>数据保密安全：存储安全（存在在可靠的设备，实时，定时备份），保存安全（重要的信息加密保存，选择合适的人员复杂保存和检测等），传输安全（防止数据窃取和数据篡改）；</li></ul><ul class="notion-list notion-list-disc notion-block-c0cf8a17c3b3486f9d076da68f0b2b7b"><li>常用的加解密算法（单项散列加密[MD5,SHA]，对称加密[DES,3DES,RC]），非对称加密[RSA]等。</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-7a33d7db4300456c812ef4120434e4be" data-id="7a33d7db4300456c812ef4120434e4be"><span><div id="7a33d7db4300456c812ef4120434e4be" class="notion-header-anchor"></div><a class="notion-hash-link" href="#7a33d7db4300456c812ef4120434e4be" title="敏捷性"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">敏捷性</span></span></h3><div class="notion-text notion-block-d9e7428913504c80a911d16398212e28">网站的架构设计，运维管理要适应变化，提供高伸缩性，高扩展性。方便的应对快速的业务发展，突增高流量访问等要求。
除上面介绍的架构要素外，还需要引入敏捷管理，敏捷开发的思想。使业务，产品，技术，运维统一起来，随需应变，快速响应。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-efb7f8cae3034221b8cf47530eb4eb96" data-id="efb7f8cae3034221b8cf47530eb4eb96"><span><div id="efb7f8cae3034221b8cf47530eb4eb96" class="notion-header-anchor"></div><a class="notion-hash-link" href="#efb7f8cae3034221b8cf47530eb4eb96" title="大型架构举例"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">大型架构举例</span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-76b7658774b4472780ae8ee088a9e311"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="http://tva1.sinaimg.cn/large/006ZfUPvgy1herxt4u1ijj30ug0ejafp.jpg" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-e10d1ae4188c4c39bf9b8802ce86f2fe">以上采用七层逻辑架构，第一层客户层，第二层前端优化层，第三层应用层，第四层服务层，第五层数据存储层，第六层大数据存储层，第七层大数据处理层。</div><ul class="notion-list notion-list-disc notion-block-2822f82b31304154b9d84aa1f46f105b"><li>客户层：支持PC浏览器和手机APP。差别是手机APP可以直接访问通过IP访问，反向代理服务器。</li></ul><ul class="notion-list notion-list-disc notion-block-3f755e09b07e45b6a5d556dff4e45b25"><li>前端层：使用DNS负载均衡，CDN本地加速以及反向代理服务；</li></ul><ul class="notion-list notion-list-disc notion-block-cdea4d3c7a92466bbb71a3df34e4e8da"><li>应用层：网站应用集群；按照业务进行垂直拆分，比如商品应用，会员中心等；</li></ul><ul class="notion-list notion-list-disc notion-block-0a739e7fdd1b458f86e2cb3915ac7cb4"><li>服务层：提供公用服务，比如用户服务，订单服务，支付服务等；</li></ul><ul class="notion-list notion-list-disc notion-block-7de834ae3be04ded932510e0c545b3ad"><li>数据层：支持关系型数据库集群（支持读写分离），NOSQL集群，分布式文件系统集群；以及分布式Cache；</li></ul><ul class="notion-list notion-list-disc notion-block-32b136fa0d97494ebab0438b7eefb5da"><li>大数据存储层：支持应用层和服务层的日志数据收集，关系数据库和NOSQL数据库的结构化和半结构化数据收集；</li></ul><ul class="notion-list notion-list-disc notion-block-acd32a4b97ea41f8b683d7a54229a516"><li>大数据处理层：通过Mapreduce进行离线数据分析或Storm实时数据分析，并将处理后的数据存入关系型数据库。（实际使用中，离线数据和实时数据会按照业务要求进行分类处理，并存入不同的数据库中，供应用层或服务层使用）。</li></ul><div class="notion-text notion-block-a733524691d843b788976ec44ac4541f">转载: <a target="_blank" rel="noopener noreferrer" class="notion-link" href="http://www.cnblogs.com/itfly8/p/4967966.html">ITFLY8架构师之家</a></div><div class="notion-blank notion-block-c91fb4a5b2184d0b8e8677ac75c55ccd"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[记一次JVM调优过程]]></title>
            <link>https://www.calfgz.cn//article/jvm-optimize.html</link>
            <guid>https://www.calfgz.cn//article/jvm-optimize.html</guid>
            <pubDate>Fri, 18 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[最近发现线上某应用从8月初开始重启越来越频繁，折腾了近一周，过程有点曲折，这里记录一下大概过程。]]></description>
            <content:encoded><![CDATA[<div id="container" class="mx-auto undefined"><main class="notion light-mode notion-page notion-full-width notion-block-f4ca4a94659b4e65a0e3765f0bcd83ea"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-a1c523d94b7348bc877c40524a0685bc" data-id="a1c523d94b7348bc877c40524a0685bc"><span><div id="a1c523d94b7348bc877c40524a0685bc" class="notion-header-anchor"></div><a class="notion-hash-link" href="#a1c523d94b7348bc877c40524a0685bc" title="背景"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">背景</span></span></h3><div class="notion-text notion-block-9a375e458318401c9b5a2a63f36eb9c3">最近发现线上某应用从8月初开始重启越来越频繁，折腾了近一周，过程有点曲折，这里记录一下大概过程。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-90ac3d36f7f645fc99361135845fff3b" data-id="90ac3d36f7f645fc99361135845fff3b"><span><div id="90ac3d36f7f645fc99361135845fff3b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#90ac3d36f7f645fc99361135845fff3b" title="线上情况"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">线上情况</span></span></h3><div class="notion-text notion-block-268cf182efd64d6ba913f3bb7f10b077">线上服务器平时运行良好，只是在某个瞬间服务器负载突然飙升，检测脚本检测应用请求无响应自动对应用进行重启操作。
重启瞬间服务器负载突然升高，得并不太高，流量也比平时高一倍左右，后台日志并无报错信息。
线上虚拟机配置：4核CPU，5G内存；
JDK版本：1.6</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-d9677e4e0375422b9778f47410b313a7" data-id="d9677e4e0375422b9778f47410b313a7"><span><div id="d9677e4e0375422b9778f47410b313a7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d9677e4e0375422b9778f47410b313a7" title="排查"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">排查</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-c6d46235b7724f64ac0d69b5f31fd625" data-id="c6d46235b7724f64ac0d69b5f31fd625"><span><div id="c6d46235b7724f64ac0d69b5f31fd625" class="notion-header-anchor"></div><a class="notion-hash-link" href="#c6d46235b7724f64ac0d69b5f31fd625" title="DUMP日志分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">DUMP日志分析</span></span></h4><div class="notion-text notion-block-424acedfb63f4ba3b37d4fa41c4b1789">根据dump下来的文件分析95%的线程都在等待同一个资源。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-fbad373551b4459d9990e87b2ae30486"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="http://tva1.sinaimg.cn/large/006ZfUPvgy1herxn789spj30r408fwo8.jpg" alt="notion image" loading="lazy" decoding="async"/></div></figure><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">&quot;http-app-a-8080-145$893127005&quot; daemon prio=10 tid=0x00002aab4c0f3400 nid=0x4b36 in Object.wait() [0x0000000044719000..0x000000004471ac10]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on &lt;0x00002aaacfd05698&gt; (a java.util.ArrayList)
	at com.caucho.jca.ConnectionPool.create(ConnectionPool.java:913)
	- locked &lt;0x00002aaacfd05698&gt; (a java.util.ArrayList)
	at com.caucho.jca.ConnectionPool.allocatePool(ConnectionPool.java:795)
	at com.caucho.jca.ConnectionPool.allocate(ConnectionPool.java:756)
	at com.caucho.jca.ConnectionPool.allocateConnection(ConnectionPool.java:567)
	at com.caucho.sql.DataSourceImpl.getConnection(DataSourceImpl.java:65)
	at com.caucho.sql.DBPool.getConnection(DBPool.java:701)
	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
	at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:577)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:641)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:670)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:678)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:710)
	at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.query(SimpleJdbcTemplate.java:187)
   Locked ownable synchronizers:
	- None</code></pre><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-b1454f83189b440c95d9839c8f2a72b3" data-id="b1454f83189b440c95d9839c8f2a72b3"><span><div id="b1454f83189b440c95d9839c8f2a72b3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b1454f83189b440c95d9839c8f2a72b3" title="GC分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">GC分析</span></span></h4><div class="notion-text notion-block-db818395a098421f827509ff1e1a5dcc">从GC统计看，Eden区和Old代都是100%。</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0     92 377528 186180 1639548    0    0     0    22    0    0  8  2 90  0  0
 1  0     92 377536 186180 1639588    0    0     0    15 1714  794 26  2 72  0  0
 1  0     92 377884 186180 1639612    0    0     0    87 1759 7236 44  5 51  0  0
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
100.00   0.00 100.00 100.00  53.23    805  206.792    85  315.321  522.113
100.00   0.00 100.00 100.00  53.23    805  206.792    86  326.422  533.214
100.00   0.00 100.00 100.00  53.23    805  206.792    86  326.422  533.214</code></pre><div class="notion-text notion-block-2c8752297b2542bb88ec010483126936">打开JVM的GC详情日志后发现，GC日志偶尔会出现并发模式失败(<code class="notion-inline-code">concurrent mode failure</code>)的错误，在应用重启前Old代使用比例迅速升高，然后频繁进行Full GC操作，Full GC伴随着 <code class="notion-inline-code">concurrent mode failure</code>错误，Old代使用空间一直没法缩小，最终造成应用无响应而重启。</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">165481.820: [CMS-concurrent-mark-start]
165481.847: [GC 165481.847: [ParNew: 419456K-&gt;52416K(471872K), 0.1388080 secs] 1678939K-&gt;1315679K(2044736K), 0.1389840 secs] [Times: user=0.30 sys=0.00, real=0.14 secs]
165482.711: [GC 165482.711: [ParNew: 471872K-&gt;52416K(471872K), 0.2897670 secs] 1735135K-&gt;1415603K(2044736K), 0.2901120 secs] [Times: user=0.68 sys=0.04, real=0.30 secs]
165484.160: [GC 165484.160: [ParNew: 471872K-&gt;52416K(471872K), 0.1511710 secs] 1835059K-&gt;1468617K(2044736K), 0.1514160 secs] [Times: user=0.35 sys=0.01, real=0.15 secs]
165485.025: [GC 165485.025: [ParNew: 471872K-&gt;52416K(471872K), 0.1989200 secs] 1888073K-&gt;1513178K(2044736K), 0.1991520 secs] [Times: user=0.48 sys=0.02, real=0.20 secs]
165485.499: [CMS-concurrent-mark: 2.867/3.678 secs] [Times: user=10.39 sys=0.60, real=3.68 secs]
165485.499: [CMS-concurrent-preclean-start]
165485.597: [CMS-concurrent-preclean: 0.095/0.098 secs] [Times: user=0.29 sys=0.05, real=0.10 secs]
165485.597: [CMS-concurrent-abortable-preclean-start]
165486.287: [GC 165486.287: [ParNew: 471872K-&gt;52416K(471872K), 0.4610860 secs] 1932634K-&gt;1567513K(2044736K), 0.4614320 secs] [Times: user=1.01 sys=0.05, real=0.46 secs]
165486.938: [CMS-concurrent-abortable-preclean: 0.580/1.341 secs] [Times: user=4.14 sys=0.28, real=1.34 secs]
165486.941: [GC[YG occupancy: 128659 K (471872 K)]165486.941: [Rescan (parallel) , 0.2358900 secs]165487.177: [weak refs processing, 0.0020640 secs] [1 CMS-remark: 1515097K(1572864K)] 1643757K(2044736K), 0.2381370 secs] [Times: user=0.47 sys=0.01, real=0.24 secs]
165487.181: [CMS-concurrent-sweep-start]
165488.042: [Full GC 165488.043: [CMS165488.518: [CMS-concurrent-sweep: 1.213/1.337 secs] [Times: user=3.37 sys=0.23, real=1.34 secs]
 (concurrent mode failure) (concurrent mode failure): 1514835K-&gt;1485873K(1572864K), 0.4853610 secs] 1986707K-&gt;1957745K(2044736K), [CMS Perm : 81695K-&gt;81695K(136412K)], 0.4856970 secs] [Times: user=0.37 sys=0.01, real=0.48 secs]
165488.532: [GC 165488.532: [ParNew: 471872K-&gt;44512K(471872K), 0.3130160 secs] 1957745K-&gt;1573798K(2044736K), 0.3133460 secs] [Times: user=0.75 sys=0.02, real=0.31 secs]
165489.568: [Full GC 165489.568: [CMS[Unloading class sun.reflect.GeneratedMethodAccessor1602]
[Unloading class sun.reflect.GeneratedMethodAccessor1597]
[Unloading class sun.reflect.GeneratedMethodAccessor1592]
[Unloading class sun.reflect.GeneratedMethodAccessor1594]
[Unloading class sun.reflect.GeneratedMethodAccessor1598]
[Unloading class sun.reflect.GeneratedMethodAccessor1555]
[Unloading class sun.reflect.GeneratedMethodAccessor1599]
[Unloading class sun.reflect.GeneratedMethodAccessor1600]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor77]
[Unloading class sun.reflect.GeneratedMethodAccessor1604]
[Unloading class sun.reflect.GeneratedMethodAccessor1593]
[Unloading class sun.reflect.GeneratedMethodAccessor1603]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor75]
[Unloading class sun.reflect.GeneratedMethodAccessor1596]
[Unloading class sun.reflect.GeneratedMethodAccessor1595]
[Unloading class sun.reflect.GeneratedMethodAccessor1567]
[Unloading class sun.reflect.GeneratedMethodAccessor395]
[Unloading class sun.reflect.GeneratedMethodAccessor1601]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor26]
: 1529286K-&gt;1392790K(1572864K), 4.5172760 secs] 1993254K-&gt;1392790K(2044736K), [CMS Perm : 81695K-&gt;81629K(136412K)], 4.5176710 secs] [Times: user=4.44 sys=0.02, real=4.52 secs]
165494.145: [GC [1 CMS-initial-mark: 1392790K(1572864K)] 1414063K(2044736K), 0.2010890 secs] [Times: user=0.20 sys=0.00, real=0.20 secs]
165494.347: [CMS-concurrent-mark-start]
165495.237: [GC 165495.237: [ParNew: 419456K-&gt;52416K(471872K), 0.2333590 secs] 1812246K-&gt;1460179K(2044736K), 0.2337080 secs] [Times: user=0.50 sys=0.01, real=0.23 secs]
165496.118: [GC 165496.118: [ParNew: 471872K-&gt;52416K(471872K), 0.1903580 secs] 1879635K-&gt;1515864K(2044736K), 0.1905860 secs] [Times: user=0.44 sys=0.03, real=0.19 secs]
165496.715: [GC 165496.715: [ParNew: 471872K-&gt;52416K(471872K), 0.2422860 secs] 1935320K-&gt;1563468K(2044736K), 0.2425610 secs] [Times: user=0.58 sys=0.02, real=0.24 secs]
165497.487: [Full GC 165497.487: [CMS165498.311: [CMS-concurrent-mark: 3.262/3.965 secs] [Times: user=11.02 sys=0.73, real=3.96 secs]
 (concurrent mode failure): 1511052K-&gt;1366128K(1572864K), 5.3419340 secs] 1982924K-&gt;1366128K(2044736K), [CMS Perm : 81638K-&gt;81638K(136412K)], 5.3422540 secs] [Times: user=5.28 sys=0.00, real=5.34 secs]
165503.637: [GC 165503.637: [ParNew: 419456K-&gt;52416K(471872K), 0.1635850 secs] 1785584K-&gt;1421481K(2044736K), 0.1638860 secs] [Times: user=0.39 sys=0.01, real=0.16 secs]
165503.804: [GC [1 CMS-initial-mark: 1369065K(1572864K)] 1424544K(2044736K), 0.1566690 secs] [Times: user=0.15 sys=0.00, real=0.15 secs]
165503.961: [CMS-concurrent-mark-start]
165505.133: [GC 165505.133: [ParNew: 471866K-&gt;52416K(471872K), 0.4184870 secs] 1840931K-&gt;1480980K(2044736K), 0.4188850 secs] [Times: user=0.91 sys=0.04, real=0.42 secs]
165506.175: [GC 165506.176: [ParNew: 471872K-&gt;52416K(471872K), 0.2192270 secs] 1900436K-&gt;1525506K(2044736K), 0.2194620 secs] [Times: user=0.49 sys=0.01, real=0.22 secs]
165507.094: [GC 165507.094: [ParNew: 471872K-&gt;52416K(471872K), 0.2391910 secs] 1944962K-&gt;1569157K(2044736K), 0.2394130 secs] [Times: user=0.49 sys=0.02, real=0.24 secs]
165508.178: [Full GC 165508.178: [CMS165509.030: [CMS-concurrent-mark: 4.169/5.068 secs] [Times: user=14.16 sys=1.11, real=5.07 secs]
 (concurrent mode failure): 1516741K-&gt;1484032K(1572864K), 8.9510320 secs] 1988613K-&gt;1484032K(2044736K), [CMS Perm : 81663K-&gt;81634K(136412K)], 8.9515060 secs] [Times: user=7.56 sys=0.15, real=8.95 secs]
165517.659: [GC 165517.659: [ParNew: 419456K-&gt;52416K(471872K), 0.1610900 secs] 1903488K-&gt;1541664K(2044736K), 0.1613260 secs] [Times: user=0.31 sys=0.00, real=0.16 secs]
165518.036: [GC [1 CMS-initial-mark: 1489248K(1572864K)] 1717780K(2044736K), 0.5143650 secs] [Times: user=0.51 sys=0.00, real=0.51 secs]
165518.552: [CMS-concurrent-mark-start]
165519.175: [GC 165519.175: [ParNew: 471872K-&gt;52416K(471872K), 0.5417870 secs] 1961120K-&gt;1606922K(2044736K), 0.5421660 secs] [Times: user=1.07 sys=0.04, real=0.54 secs]
165520.553: [Full GC 165520.553: [CMS165521.788: [CMS-concurrent-mark: 2.683/3.236 secs] [Times: user=7.05 sys=0.65, real=3.24 secs]
 (concurrent mode failure): 1554506K-&gt;1522781K(1572864K), 6.0295590 secs] 2026378K-&gt;1522781K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 6.0298480 secs] [Times: user=5.97 sys=0.01, real=6.03 secs]
165526.774: [GC 165526.774: [ParNew: 227496K-&gt;227496K(471872K), 0.0000320 secs] 1750278K-&gt;1750278K(2044736K), 0.0001730 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
GC locker: Trying a full collection because scavenge failed
165526.774: [Full GC 165526.774: [CMS: 1522781K-&gt;1532156K(1572864K), 5.7417660 secs] 1750278K-&gt;1532156K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.7420650 secs] [Times: user=5.67 sys=0.01, real=5.74 secs]
165532.560: [GC [1 CMS-initial-mark: 1532156K(1572864K)] 1559772K(2044736K), 0.3628570 secs] [Times: user=0.33 sys=0.02, real=0.37 secs]
165532.923: [CMS-concurrent-mark-start]
165533.668: [GC 165533.668: [ParNew: 419456K-&gt;419456K(471872K), 0.0000250 secs]165533.668: [CMS165535.512: [CMS-concurrent-mark: 2.581/2.589 secs] [Times: user=4.38 sys=0.27, real=2.59 secs]
 (concurrent mode failure): 1532156K-&gt;1544103K(1572864K), 7.4693280 secs] 1951612K-&gt;1544103K(2044736K), 7.4697110 secs] [Times: user=7.30 sys=0.04, real=7.47 secs]
165542.182: [GC 165542.183: [ParNew: 419456K-&gt;419456K(471872K), 0.0000450 secs]165542.183: [CMS: 1544103K-&gt;1546768K(1572864K), 4.2923010 secs] 1963559K-&gt;1546768K(2044736K), 4.2927530 secs] [Times: user=4.25 sys=0.00, real=4.29 secs]
165546.939: [GC [1 CMS-initial-mark: 1546768K(1572864K)] 1966224K(2044736K), 0.3814880 secs] [Times: user=0.37 sys=0.00, real=0.38 secs]
165547.321: [CMS-concurrent-mark-start]
165547.322: [GC 165547.323: [ParNew: 419456K-&gt;419456K(471872K), 0.0000240 secs]165547.323: [CMS165549.212: [CMS-concurrent-mark: 1.885/1.891 secs] [Times: user=1.88 sys=0.00, real=1.90 secs]
 (concurrent mode failure): 1546768K-&gt;1558536K(1572864K), 7.2698510 secs] 1966224K-&gt;1558536K(2044736K), 7.2701150 secs] [Times: user=7.20 sys=0.00, real=7.27 secs]
165555.162: [GC 165555.162: [ParNew: 419456K-&gt;419456K(471872K), 0.0000440 secs]165555.162: [CMS: 1558536K-&gt;1572419K(1572864K), 4.6586080 secs] 1977992K-&gt;1572419K(2044736K), 4.6590020 secs] [Times: user=4.59 sys=0.00, real=4.65 secs]
165559.919: [GC [1 CMS-initial-mark: 1572419K(1572864K)] 1693916K(2044736K), 0.3145610 secs] [Times: user=0.31 sys=0.00, real=0.32 secs]
165560.236: [CMS-concurrent-mark-start]
165560.628: [GC 165560.628: [ParNew: 419456K-&gt;419456K(471872K), 0.0000280 secs]165560.628: [CMS165562.196: [CMS-concurrent-mark: 1.954/1.961 secs] [Times: user=2.84 sys=0.19, real=1.96 secs]
 (concurrent mode failure): 1572419K-&gt;1572863K(1572864K), 8.8879030 secs] 1991875K-&gt;1607194K(2044736K), 8.8882080 secs] [Times: user=8.80 sys=0.00, real=8.89 secs]
165569.881: [Full GC 165569.881: [CMS: 1572863K-&gt;1572863K(1572864K), 4.8703640 secs] 1992319K-&gt;1634385K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 4.8706150 secs] [Times: user=4.82 sys=0.00, real=4.88 secs]
165574.775: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1656915K(2044736K), 0.1364280 secs] [Times: user=0.14 sys=0.00, real=0.14 secs]
165574.911: [CMS-concurrent-mark-start]
165575.648: [Full GC 165575.649: [CMS165576.932: [CMS-concurrent-mark: 2.013/2.020 secs] [Times: user=3.41 sys=0.21, real=2.01 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 5.9651530 secs] 2044735K-&gt;1682474K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.9654160 secs] [Times: user=5.91 sys=0.00, real=5.97 secs]
165582.423: [Full GC 165582.423: [CMS: 1572863K-&gt;1572864K(1572864K), 5.0236220 secs] 2044735K-&gt;1695427K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.0239250 secs] [Times: user=4.98 sys=0.00, real=5.02 secs]
165587.448: [GC [1 CMS-initial-mark: 1572864K(1572864K)] 1697093K(2044736K), 0.1697460 secs] [Times: user=0.17 sys=0.00, real=0.17 secs]
165587.618: [CMS-concurrent-mark-start]
165588.609: [Full GC 165588.609: [CMS165589.719: [CMS-concurrent-mark: 2.093/2.100 secs] [Times: user=4.07 sys=0.63, real=2.10 secs]
 (concurrent mode failure): 1572864K-&gt;1572864K(1572864K), 6.7291670 secs] 2044735K-&gt;1724617K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 6.7294860 secs] [Times: user=6.62 sys=0.03, real=6.73 secs]
165596.592: [Full GC 165596.592: [CMS: 1572864K-&gt;1572864K(1572864K), 4.4670560 secs] 2044735K-&gt;1735633K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 4.4673550 secs] [Times: user=4.43 sys=0.00, real=4.47 secs]
165601.346: [GC [1 CMS-initial-mark: 1572864K(1572864K)] 1992320K(2044736K), 0.5660880 secs] [Times: user=0.56 sys=0.00, real=0.57 secs]
165601.913: [CMS-concurrent-mark-start]
165602.192: [Full GC 165602.192: [CMS165603.600: [CMS-concurrent-mark: 1.681/1.687 secs] [Times: user=2.27 sys=0.20, real=1.68 secs]
 (concurrent mode failure): 1572864K-&gt;1572863K(1572864K), 7.8641150 secs] 2044734K-&gt;1739724K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 7.8643680 secs] [Times: user=7.78 sys=0.00, real=7.86 secs]
165610.597: [Full GC 165610.597: [CMS: 1572863K-&gt;1572864K(1572864K), 4.9612280 secs] 2044735K-&gt;1738303K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 4.9614800 secs] [Times: user=4.92 sys=0.00, real=4.96 secs]
165615.797: [GC [1 CMS-initial-mark: 1572864K(1572864K)] 1992913K(2044736K), 0.3312260 secs] [Times: user=0.32 sys=0.00, real=0.33 secs]
165616.129: [CMS-concurrent-mark-start]
165616.507: [Full GC 165616.507: [CMS165618.227: [CMS-concurrent-mark: 2.085/2.098 secs] [Times: user=2.89 sys=0.26, real=2.10 secs]
 (concurrent mode failure): 1572864K-&gt;1572863K(1572864K), 8.0011150 secs] 2044735K-&gt;1733747K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 8.0014230 secs] [Times: user=7.91 sys=0.00, real=8.00 secs]
165624.791: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1997838K(2044736K), 0.3768850 secs] [Times: user=0.38 sys=0.00, real=0.38 secs]
165625.168: [CMS-concurrent-mark-start]
165625.514: [Full GC 165625.514: [CMS165627.373: [CMS-concurrent-mark: 2.191/2.204 secs] [Times: user=2.95 sys=0.23, real=2.21 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 8.6134440 secs] 2044735K-&gt;1745403K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 8.6138280 secs] [Times: user=8.50 sys=0.02, real=8.61 secs]
165634.940: [Full GC 165634.940: [CMS: 1572863K-&gt;1572863K(1572864K), 5.7606810 secs] 2044735K-&gt;1763133K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.7610340 secs] [Times: user=5.70 sys=0.00, real=5.76 secs]
165640.853: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992760K(2044736K), 0.5402960 secs] [Times: user=0.54 sys=0.00, real=0.54 secs]
165641.394: [CMS-concurrent-mark-start]
165641.711: [Full GC 165641.711: [CMS165643.146: [CMS-concurrent-mark: 1.745/1.752 secs] [Times: user=2.40 sys=0.24, real=1.75 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 7.6559090 secs] 2044735K-&gt;1806228K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 7.6561430 secs] [Times: user=7.58 sys=0.00, real=7.66 secs]
165649.836: [Full GC 165649.836: [CMS: 1572863K-&gt;1572863K(1572864K), 6.5024530 secs] 2044735K-&gt;1808957K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 6.5028710 secs] [Times: user=6.42 sys=0.00, real=6.50 secs]
165656.702: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992334K(2044736K), 0.6510610 secs] [Times: user=0.65 sys=0.00, real=0.65 secs]
165657.354: [CMS-concurrent-mark-start]
165657.768: [Full GC 165657.768: [CMS165659.289: [CMS-concurrent-mark: 1.926/1.935 secs] [Times: user=2.79 sys=0.33, real=1.93 secs]
 (concurrent mode failure): 1572864K-&gt;1572863K(1572864K), 9.4778960 secs] 2044735K-&gt;1817502K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 9.4782160 secs] [Times: user=9.15 sys=0.00, real=9.48 secs]
165668.339: [Full GC 165668.339: [CMS[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor82]
: 1572864K-&gt;1572863K(1572864K), 9.3393990 secs] 2044736K-&gt;1848935K(2044736K), [CMS Perm : 81634K-&gt;81631K(136412K)], 9.3398270 secs] [Times: user=9.25 sys=0.00, real=9.34 secs]
165677.949: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1993871K(2044736K), 0.6954050 secs] [Times: user=0.69 sys=0.00, real=0.70 secs]
165678.644: [CMS-concurrent-mark-start]
165679.539: [Full GC 165679.540: [CMS165681.669: [CMS-concurrent-mark: 3.012/3.025 secs] [Times: user=4.80 sys=0.64, real=3.02 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 11.9368790 secs] 2044735K-&gt;1859006K(2044736K), [CMS Perm : 81631K-&gt;81631K(136412K)], 11.9372800 secs] [Times: user=11.61 sys=0.00, real=11.94 secs]
165692.759: [Full GC 165692.759: [CMS[Unloading class sun.reflect.GeneratedConstructorAccessor240]
: 1572863K-&gt;1572863K(1572864K), 11.2508310 secs] 2044735K-&gt;1874250K(2044736K), [CMS Perm : 81631K-&gt;81628K(136412K)], 11.2511750 secs] [Times: user=9.91 sys=0.00, real=11.25 secs]
165704.100: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992415K(2044736K), 0.3157090 secs] [Times: user=0.31 sys=0.00, real=0.32 secs]
165704.416: [CMS-concurrent-mark-start]
165704.825: [Full GC 165704.825: [CMS165706.129: [CMS-concurrent-mark: 1.703/1.713 secs] [Times: user=2.54 sys=0.34, real=1.71 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 6.3984280 secs] 2044732K-&gt;1866289K(2044736K), [CMS Perm : 81628K-&gt;81628K(136412K)], 6.3986960 secs] [Times: user=6.34 sys=0.01, real=6.40 secs]
165711.728: [Full GC 165711.728: [CMS: 1572863K-&gt;1572863K(1572864K), 5.4379380 secs] 2044735K-&gt;1880349K(2044736K), [CMS Perm : 81628K-&gt;81628K(136412K)], 5.4382730 secs] [Times: user=5.39 sys=0.00, real=5.44 secs]
165717.351: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992539K(2044736K), 0.6038490 secs] [Times: user=0.60 sys=0.00, real=0.61 secs]
165717.955: [CMS-concurrent-mark-start]
165718.302: [Full GC 165718.302: [CMS165719.904: [CMS-concurrent-mark: 1.943/1.949 secs] [Times: user=2.69 sys=0.24, real=1.95 secs]
 (concurrent mode failure)[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor25]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor18]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor17]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor22]
[Unloading class sun.reflect.GeneratedMethodAccessor1445]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor24]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor10]
[Unloading class sun.reflect.GeneratedMethodAccessor441]
[Unloading class sun.reflect.GeneratedMethodAccessor854]
: 1572863K-&gt;1572863K(1572864K), 7.1694470 secs] 2044735K-&gt;1862162K(2044736K), [CMS Perm : 81628K-&gt;81598K(136412K)], 7.1696770 secs] [Times: user=7.09 sys=0.00, real=7.17 secs]
165726.106: [Full GC 165726.106: [CMS: 1572863K-&gt;1572862K(1572864K), 4.8448050 secs] 2044735K-&gt;1877599K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 4.8451090 secs] [Times: user=4.80 sys=0.00, real=4.84 secs]
165731.084: [GC [1 CMS-initial-mark: 1572862K(1572864K)] 1992928K(2044736K), 0.3369610 secs] [Times: user=0.34 sys=0.00, real=0.33 secs]
165731.421: [CMS-concurrent-mark-start]
165731.716: [Full GC 165731.716: [CMS165733.347: [CMS-concurrent-mark: 1.919/1.925 secs] [Times: user=2.56 sys=0.20, real=1.92 secs]
 (concurrent mode failure): 1572862K-&gt;1572252K(1572864K), 10.0779900 secs] 2044734K-&gt;1873718K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 10.0782250 secs] [Times: user=9.64 sys=0.00, real=10.08 secs]
165742.925: [Full GC 165742.925: [CMS: 1572776K-&gt;1572408K(1572864K), 6.1126860 secs] 2044648K-&gt;1887999K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 6.1130120 secs] [Times: user=6.05 sys=0.00, real=6.11 secs]
165749.202: [GC [1 CMS-initial-mark: 1572408K(1572864K)] 1991990K(2044736K), 0.7009320 secs] [Times: user=0.69 sys=0.00, real=0.71 secs]
165749.903: [CMS-concurrent-mark-start]
165750.271: [Full GC 165750.271: [CMS165751.834: [CMS-concurrent-mark: 1.920/1.931 secs] [Times: user=2.65 sys=0.30, real=1.93 secs]
 (concurrent mode failure): 1572647K-&gt;1572863K(1572864K), 8.3700350 secs] 2044519K-&gt;1900106K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 8.3703090 secs] [Times: user=8.25 sys=0.00, real=8.38 secs]
165759.574: [Full GC 165759.574: [CMS[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor19]
: 1572863K-&gt;1572863K(1572864K), 5.2368120 secs] 2044735K-&gt;1906019K(2044736K), [CMS Perm : 81598K-&gt;81594K(136412K)], 5.2371710 secs] [Times: user=5.17 sys=0.01, real=5.24 secs]
165764.957: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992752K(2044736K), 0.5464550 secs] [Times: user=0.54 sys=0.00, real=0.55 secs]
165765.504: [CMS-concurrent-mark-start]
165765.849: [Full GC 165765.849: [CMS165767.557: [CMS-concurrent-mark: 2.043/2.053 secs] [Times: user=2.59 sys=0.28, real=2.05 secs]
 (concurrent mode failure)</code></pre><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-4da06153c4184fd88ccd22ebdafc9207" data-id="4da06153c4184fd88ccd22ebdafc9207"><span><div id="4da06153c4184fd88ccd22ebdafc9207" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4da06153c4184fd88ccd22ebdafc9207" title="分析原因"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">分析原因</span></span></h4><div class="notion-text notion-block-fc461658d59e4ba69fae87fa972cfbdb">根据<a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://calfgz.github.io/blog/2017/08/java-jvm.html">JVM调优—GC 长时间停顿问题及解决方法</a>分析，出现这种情况基本可以定位两种原因：</div><ul class="notion-list notion-list-disc notion-block-4dfad6a56a244e3694ed7484eed2c56c"><li>在 CMS 启动过程中，新生代提升速度过快，老年代收集速度赶不上新生代提升速度</li></ul><ul class="notion-list notion-list-disc notion-block-f6e97b265b5c4c4bb627fb045c882443"><li>在 CMS 启动过程中，老年代碎片化严重，无法容纳新生代提升上来的大对象</li></ul><div class="notion-text notion-block-d50d78c3bfcb4f2b97f8d7ce976dfaa3">发生这种情况，应用线程将会全部停止（相当于网站这段时间无法响应用户请求），进行压缩式垃圾收集（回退到 Serial Old 算法）。</div><div class="notion-text notion-block-934892433860444f8658ef6a15b85c92">根据建议先进行JVM参数调整，然后再分析内存存放的数据状况。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-4ff4c2494c124d9990f017a57d5e0847" data-id="4ff4c2494c124d9990f017a57d5e0847"><span><div id="4ff4c2494c124d9990f017a57d5e0847" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4ff4c2494c124d9990f017a57d5e0847" title="JVM参数调整"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">JVM参数调整</span></span></h4><div class="notion-text notion-block-24c13954b3614eb081fb0787f4d66037">增加三个参数:</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-xml">      &lt;jvm-arg&gt;-XX:+UseCMSInitiatingOccupancyOnly&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:CMSInitiatingOccupancyFraction=60&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:CMSFullGCsBeforeCompaction=1&lt;/jvm-arg&gt;</code></pre><div class="notion-text notion-block-8ddb54dcd5ec4738be49cd2d3756354e">调整前：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-xml">      &lt;jvm-arg&gt;-Xms2048m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-Xmx2048m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-Xmn512m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-Xss256k&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseConcMarkSweepGC&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseParNewGC&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+CMSParallelRemarkEnabled&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseCMSCompactAtFullCollection&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:PermSize=128m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:MaxPermSize=256m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+PrintGCTimeStamps&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+PrintGCDetails&lt;/jvm-arg&gt;</code></pre><div class="notion-text notion-block-4ba081f236824715b89a47ee4562fff8">调整后：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-xml">      &lt;jvm-arg&gt;-Xms2048m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-Xmx2048m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-Xmn512m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-Xss256k&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseConcMarkSweepGC&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseParNewGC&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+CMSParallelRemarkEnabled&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseCMSCompactAtFullCollection&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+UseCMSInitiatingOccupancyOnly&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:CMSInitiatingOccupancyFraction=60&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:CMSFullGCsBeforeCompaction=1&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:PermSize=128m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:MaxPermSize=256m&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+PrintGCTimeStamps&lt;/jvm-arg&gt;
      &lt;jvm-arg&gt;-XX:+PrintGCDetails&lt;/jvm-arg&gt;</code></pre><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-daddefa7e94f4f519af0c86868ac360f" data-id="daddefa7e94f4f519af0c86868ac360f"><span><div id="daddefa7e94f4f519af0c86868ac360f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#daddefa7e94f4f519af0c86868ac360f" title="JVM参数调整后观察"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">JVM参数调整后观察</span></span></h4><div class="notion-text notion-block-b0aeaab2fea5403b8675368e8d7dfb02">调整后观察服务器比调整前稳定多了，重启情况减少，但偶尔还是会并发模式失败(<code class="notion-inline-code">concurrent mode failure</code>)的错误并重启。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-477d64de244a4965b8def810794fb6e8" data-id="477d64de244a4965b8def810794fb6e8"><span><div id="477d64de244a4965b8def810794fb6e8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#477d64de244a4965b8def810794fb6e8" title="分析JVM内存对象"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">分析JVM内存对象</span></span></h4><div class="notion-text notion-block-1891e45ec6ae46db9ecf4469a511575c">直接上图：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-4612ec64770141afa00e1e62f1db87eb"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="http://tva1.sinaimg.cn/large/006ZfUPvgy1herxn77dl5j30nr0egn1q.jpg" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-162e60cb334842ed8e5203a752c41012"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="http://tva1.sinaimg.cn/large/006ZfUPvgy1herxn76pk7j30kp0ccwhe.jpg" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-dda1528e5c5e4835a2e4b3972ad5bc8d">从上图可以很容易发现红框内的对象占比非常大，分析代码发现此处产品筛选页面中的索引文件生成和调用设计有问题，每个分类都会生成单独的一份索引文件，几千个分类就得生成几千个分类，当爬虫过来频繁爬取未有页面缓存内容时，此处频繁加载索引文件到内存中，瞬间把JVM内存中Old代占满而无法释放。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-e71ab3b59780471a8bb69b0eb800367e" data-id="e71ab3b59780471a8bb69b0eb800367e"><span><div id="e71ab3b59780471a8bb69b0eb800367e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#e71ab3b59780471a8bb69b0eb800367e" title="优化解决"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">优化解决</span></span></h3><div class="notion-text notion-block-f95b8ce51f6740c18813798652132001">重新调整索引方案，分析整理各分类下不同属性之间的关系，将所有分类的索引文件整合成一个。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-023e61f135284ff4addcc07656483032" data-id="023e61f135284ff4addcc07656483032"><span><div id="023e61f135284ff4addcc07656483032" class="notion-header-anchor"></div><a class="notion-hash-link" href="#023e61f135284ff4addcc07656483032" title="优化后效果"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">优化后效果</span></span></h3><div class="notion-text notion-block-82c2d2964c854fa5abc2d5aca11d835f">优化后观察系统稳定，JVM日志也没发现再有并发模式失败(<code class="notion-inline-code">concurrent mode failure</code>)的错误。</div><div class="notion-blank notion-block-ce2a45da11654c9e8aeae92e7f1f08ff"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JVM GC算法 CMS 详解]]></title>
            <link>https://www.calfgz.cn//article/jvm-cms.html</link>
            <guid>https://www.calfgz.cn//article/jvm-cms.html</guid>
            <pubDate>Fri, 11 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[CMS，全称 Concurrent Low Pause Collector，是jdk1.4后期版本开始引入的新gc算法，在jdk5和jdk6中得到了进一步改进，它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求，能够承受垃圾回收线程和应用线程共享处理器资源，并且应用中存在比较多的长生命周期的对象的应用。]]></description>
            <content:encoded><![CDATA[<div id="container" class="mx-auto undefined"><main class="notion light-mode notion-page notion-full-width notion-block-192bc005eb0e49498bc061746b403be9"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-4d79f2949f76411888440848d4dee7bc" data-id="4d79f2949f76411888440848d4dee7bc"><span><div id="4d79f2949f76411888440848d4dee7bc" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4d79f2949f76411888440848d4dee7bc" title="简介"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">简介</span></span></h3><div class="notion-text notion-block-f052c7dfe9ab4794b2b33307f0096937">CMS，全称 <code class="notion-inline-code">Concurrent Low Pause Collector</code>，是jdk1.4后期版本开始引入的新gc算法，在jdk5和jdk6中得到了进一步改进，它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求，能够承受垃圾回收线程和应用线程共享处理器资源，并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对 <code class="notion-inline-code">tenured generation</code>的回收，也就是年老代的回收，目标是尽量减少应用的暂停时间，减少full gc发生的几率，利用和应用程序线程并发的垃圾回收线程来标记清除年老代。在我们的应用中，因为有缓存的存在，并且对于响应时间也有比较高的要求，因此希 望能尝试使用CMS来替代默认的server型JVM使用的并行收集器，以便获得更短的垃圾回收的暂停时间，提高程序的响应性。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-f39b8576bf1147008b93ad793bf07817" data-id="f39b8576bf1147008b93ad793bf07817"><span><div id="f39b8576bf1147008b93ad793bf07817" class="notion-header-anchor"></div><a class="notion-hash-link" href="#f39b8576bf1147008b93ad793bf07817" title="CMS收集周期"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">CMS收集周期</span></span></h3><div class="notion-text notion-block-b424549ab708489cbbc702866cc6caac">CMS并非没有暂停，而是用两次短暂停来替代串行标记整理算法的长暂停，它的收集周期是这样：</div><div class="notion-text notion-block-9ae4b0c2ac6d40b0b878511cd4717e03">初始标记(<code class="notion-inline-code">CMS-initial-mark</code>) -&gt; 并发标记(<code class="notion-inline-code">CMS-concurrent-mark</code>) -&gt; 重新标记(<code class="notion-inline-code">CMS-remark</code>) -&gt; 并发清除(<code class="notion-inline-code">CMS-concurrent-sweep</code>) -&gt;并发重设状态等待下次CMS的触发(<code class="notion-inline-code">CMS-concurrent-reset</code>)。</div><div class="notion-text notion-block-0cee095da9d54b23b35cb80799749e4c">其中的1，3两个步骤需要暂停所有的应用程序线程的。第一次暂停从root对象开始标记存活的对象，这个阶段称为初始标记；第二次暂停是在并发标记之后， 暂停所有应用程序线程，重新标记并发标记阶段遗漏的对象（在并发标记阶段结束后对象状态的更新导致）。第一次暂停会比较短，第二次暂停通常会比较长，并且 remark这个阶段可以并行标记。</div><div class="notion-text notion-block-31599ec361424a8d85109a86615fe08f">而并发标记、并发清除、并发重设阶段的所谓并发，是指一个或者多个垃圾回收线程和应用程序线程并发地运行，垃圾回收线程不会暂停应用程序的执行，如果你有多于一个处理器，那么并发收集线程将与应用线程在不同的处理器上运行，显然，这样的开销就是会降低应用的吞吐量。Remark阶段的并行，是指暂停了所有应用程序后，启动一定数目的垃圾回收进程进行并行标记，此时的应用线程是暂停的。</div><div class="notion-text notion-block-a5180f9220184719b6e33287017212a0">CMS的 <code class="notion-inline-code">young generation</code>的回收采用的仍然是并行复制收集器，这个跟 <code class="notion-inline-code">Paralle gc</code>算法是一致的。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-708c1a9bd64e47c3adae266b2b46b5ee" data-id="708c1a9bd64e47c3adae266b2b46b5ee"><span><div id="708c1a9bd64e47c3adae266b2b46b5ee" class="notion-header-anchor"></div><a class="notion-hash-link" href="#708c1a9bd64e47c3adae266b2b46b5ee" title="参数介绍"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">参数介绍</span></span></h3><ul class="notion-list notion-list-disc notion-block-0c2804a0e6434455879c2a503299a8f2"><li>启用CMS：<code class="notion-inline-code">XX:+UseConcMarkSweepGC</code>。</li></ul><ul class="notion-list notion-list-disc notion-block-e29a7e0eac124e5baa4b935f7e7d5432"><li>CMS默认启动的回收线程数目是 <code class="notion-inline-code">(ParallelGCThreads + 3)/4)</code> ，如果你需要明确设定，可以通过 <code class="notion-inline-code">XX:ParallelCMSThreads=20</code>来设定,其中 <code class="notion-inline-code">ParallelGCThreads</code>是年轻代的并行收集线程数</li></ul><ul class="notion-list notion-list-disc notion-block-8a4cd1099fc8444ba4c55ec6c9512830"><li>CMS是不会整理堆碎片的，因此为了防止堆碎片引起 <code class="notion-inline-code">full gc</code>，通过会开启CMS阶段进行合并碎片选项：<code class="notion-inline-code">XX:+UseCMSCompactAtFullCollection</code>，开启这个选项一定程度上会影响性能，阿宝的blog里说也许可以通过配置适当的 <code class="notion-inline-code">CMSFullGCsBeforeCompaction</code>来调整性能，未实践。</li></ul><ul class="notion-list notion-list-disc notion-block-b608a6f84d4a4db2b4bc742a91979789"><li>为了减少第二次暂停的时间，开启并行remark: <code class="notion-inline-code">XX:+CMSParallelRemarkEnabled</code>。如果remark还是过长的话，可以开启 <code class="notion-inline-code">XX:+CMSScavengeBeforeRemark</code>选项，强制remark之前开始一次 <code class="notion-inline-code">minor gc</code>，减少remark的暂停时间，但是在remark之后也将立即开始又一次 <code class="notion-inline-code">minor gc</code>。</li></ul><ul class="notion-list notion-list-disc notion-block-489e856b782b4b52a3c87442169dcfee"><li>为了避免Perm区满引起的full gc，建议开启CMS回收Perm区选项：</li></ul><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled</code></pre><ul class="notion-list notion-list-disc notion-block-a7289f5e3c3144b380f6c5aac706ccb4"><li>默认CMS是在 <code class="notion-inline-code">tenured generation</code>沾满68%的时候开始进行CMS收集，如果你的年老代增长不是那么快，并且希望降低CMS次数的话，可以适当调高此值：</li></ul><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">-XX:CMSInitiatingOccupancyFraction=80  这里修改成80%沾满的时候才开始CMS回收。</code></pre><ul class="notion-list notion-list-disc notion-block-3d08805e7adb4ecc8e841b4631d1039d"><li>年轻代的并行收集线程数默认是 <code class="notion-inline-code">(cpu &lt;= 8) ? cpu : 3 + ((cpu * 5) / 8)</code>，如果你希望降低这个线程数，可以通过 <code class="notion-inline-code">XX:ParallelGCThreads= N</code> 来调整。</li></ul><ul class="notion-list notion-list-disc notion-block-8b0846a5126343439c271aef191d0ae7"><li>进入重点，在初步设置了一些参数后，例如：</li></ul><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">-server
-Xms1536m
-Xmx1536m
-XX:NewSize=256m
-XX:MaxNewSize=256m
-XX:PermSize=64m
-XX:MaxPermSize=64m
-XX:-UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSInitiatingOccupancyFraction=80
-XX:+CMSParallelRemarkEnabled
-XX:SoftRefLRUPolicyMSPerMB=0</code></pre><div class="notion-text notion-block-c275e78f98244735880255863e8e3946">需要在生产环境或者压测环境中测量这些参数下系统的表现，这时候需要打开GC日志查看具体的信息，因此加上参数：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">-verbose:gc
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/home/test/logs/gc.log</code></pre><div class="notion-text notion-block-aba3e7976c3e4dfd9c34c1a1481c65d4">在运行相当长一段时间内查看CMS的表现情况，CMS的日志输出类似这样：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">4391.322: [GC [1 CMS-initial-mark: 655374K(1310720K)] 662197K(1546688K), 0.0303050 secs] [Times: user=0.02 sys=0.02, real=0.03 secs]
4391.352: [CMS-concurrent-mark-start]
4391.779: [CMS-concurrent-mark: 0.427/0.427 secs] [Times: user=1.24 sys=0.31, real=0.42 secs]
4391.779: [CMS-concurrent-preclean-start]
4391.821: [CMS-concurrent-preclean: 0.040/0.042 secs] [Times: user=0.13 sys=0.03, real=0.05 secs]
4391.821: [CMS-concurrent-abortable-preclean-start]
4392.511: [CMS-concurrent-abortable-preclean: 0.349/0.690 secs] [Times: user=2.02 sys=0.51, real=0.69 secs]
4392.516: [GC[YG occupancy: 111001 K (235968 K)]4392.516: [Rescan (parallel) , 0.0309960 secs]4392.547: [weak refs processing, 0.0417710 secs] [1 CMS-remark: 655734K(1310720K)] 766736K(1546688K), 0.0932010 secs] [Times: user=0.17 sys=0.00, real=0.09 secs]
4392.609: [CMS-concurrent-sweep-start]
4394.310: [CMS-concurrent-sweep: 1.595/1.701 secs] [Times: user=4.78 sys=1.05, real=1.70 secs]
4394.310: [CMS-concurrent-reset-start]
4394.364: [CMS-concurrent-reset: 0.054/0.054 secs] [Times: user=0.14 sys=0.06, real=0.06 secs]</code></pre><div class="notion-text notion-block-c7cd8cf31f724fadb25bb67e16df9148">其中可以看到``CMS-initial-mark``阶段暂停了0.0303050秒，而 ``CMS-remark``阶段暂停了0.0932010秒，因此两次暂停的总共时间是0.123506秒，也就是123毫秒左右。两次短暂停的时间之和在200以下可以称为正常现象。</div><div class="notion-text notion-block-126d626d25c1417da542e81f7d47d3a2">但是你很可能遇到两种fail引起 <code class="notion-inline-code">full gc：Prommotion failed</code>和 <code class="notion-inline-code">Concurrent mode failed</code>。</div><div class="notion-text notion-block-e8216eba70984a23bca9c6e63b92ff33">Prommotion failed的日志输出大概是这样：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">[ParNew (promotion failed): 320138K-&gt;320138K(353920K), 0.2365970 secs]42576.951: [CMS: 1139969K-&gt;1120688K(
166784K), 9.2214860 secs] 1458785K-&gt;1120688K(2520704K), 9.4584090 secs]</code></pre><div class="notion-text notion-block-a5cf4177bc2f4d3f96ab33a5b7402f53">这个问题的产生是由于救助空间不够，从而向年老代转移对象，年老代没有足够的空间来容纳这些对象，导致一次 <code class="notion-inline-code">full gc</code>的产生。</div><div class="notion-text notion-block-f8049da62de74a798cd6c1eb63f10f21">解决这个问题的办法有两种完全相反的倾向：</div><ul class="notion-list notion-list-disc notion-block-6cbe74e0d4c74ec4bd473e1d51b50f1e"><li>增大救助空间、增大年老代或者去掉救助空间。 增大救助空间就是调整 <code class="notion-inline-code">XX:SurvivorRatio</code>参数，这个参数是Eden区和Survivor区的大小比值，默认是32，也就是说Eden区是 Survivor区的32倍大小，要注意Survivo是有两个区的，因此Surivivor其实占整个 <code class="notion-inline-code">young genertation</code>的1/34。</li></ul><ul class="notion-list notion-list-disc notion-block-85992a3e25fd4c0b96dbd6f7e179356b"><li>调小这个参数将增大survivor区，让对象尽量在survitor区呆长一点，减少进入年老代的对象。去掉救助空 间的想法是让大部分不能马上回收的数据尽快进入年老代，加快年老代的回收频率，减少年老代暴涨的可能性，这个是通过将 <code class="notion-inline-code">XX:SurvivorRatio</code> 设置成比较大的值（比如65536)来做到。在我们的应用中，将 <code class="notion-inline-code">young generation</code>设置成256M，这个值相对来说比较大了，而救助空间设置成默认大小(1/34)，从压测情况来看，没有出现 <code class="notion-inline-code">prommotion failed</code>的现象，年轻代比较大，从GC日志来看，minor gc的时间也在5-20毫秒内，还可以接受，因此暂不调整。</li></ul><div class="notion-text notion-block-5ea42d406f054fffbea0e341155c0109"><code class="notion-inline-code">Concurrent mode failed</code>的产生是由于CMS回收年老代的速度太慢，导致年老代在CMS完成前就被沾满，引起full gc，避免这个现象的产生就是调小 <code class="notion-inline-code">-XX:CMSInitiatingOccupancyFraction</code>参数的值，让CMS更早更频繁的触发，降低年老代被沾满的可能。我们的应用暂时负载比较低，在生产环境上年老代的增长非常缓慢，因此暂时设置此参数为80。在压测环境下，这个参数的表现还可以，没有出现过 <code class="notion-inline-code">Concurrent mode failed</code>。</div><div class="notion-text notion-block-1fa3451f8c464a49983aa370598bcda1">转载：<a target="_blank" rel="noopener noreferrer" class="notion-link" href="http://www.cnblogs.com/ggjucheng/p/3977612.html">ggjucheng</a></div><div class="notion-blank notion-block-40a4a7f25b7e486587606843480aeb97"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JVM调优—GC 长时间停顿问题及解决方法]]></title>
            <link>https://www.calfgz.cn//article/java-jvm.html</link>
            <guid>https://www.calfgz.cn//article/java-jvm.html</guid>
            <pubDate>Fri, 11 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[垃圾收集器长时间停顿，表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题，如果是个支付过程可能会导致支付失败，将造成公司的直接经济损失，程序员要尽量避免或者说减少此类情况发生。]]></description>
            <content:encoded><![CDATA[<div id="container" class="mx-auto undefined"><main class="notion light-mode notion-page notion-full-width notion-block-e57eaa0e1ce24f0ca503327d4d4d804f"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-adb8e74abb0a45a2abfd5e9eba044efc" data-id="adb8e74abb0a45a2abfd5e9eba044efc"><span><div id="adb8e74abb0a45a2abfd5e9eba044efc" class="notion-header-anchor"></div><a class="notion-hash-link" href="#adb8e74abb0a45a2abfd5e9eba044efc" title="简介"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">简介</span></span></h3><div class="notion-text notion-block-ed07d0f66f0049a09dda5cd8a7922518">垃圾收集器长时间停顿，表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题，如果是个支付过程可能会导致支付失败，将造成公司的直接经济损失，程序员要尽量避免或者说减少此类情况发生。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-4a83705f21b2413ab9e72227c8717f02" data-id="4a83705f21b2413ab9e72227c8717f02"><span><div id="4a83705f21b2413ab9e72227c8717f02" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4a83705f21b2413ab9e72227c8717f02" title="并发模式失败（concurrent mode failure）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">并发模式失败（concurrent mode failure）</span></span></h3><div class="notion-text notion-block-350bf8c8f8d34424964bcbf06753bb37">并发模式失败日志：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">165481.820: [CMS-concurrent-mark-start]
165481.847: [GC 165481.847: [ParNew: 419456K-&gt;52416K(471872K), 0.1388080 secs] 1678939K-&gt;1315679K(2044736K), 0.1389840 secs] [Times: user=0.30 sys=0.00, real=0.14 secs]
165482.711: [GC 165482.711: [ParNew: 471872K-&gt;52416K(471872K), 0.2897670 secs] 1735135K-&gt;1415603K(2044736K), 0.2901120 secs] [Times: user=0.68 sys=0.04, real=0.30 secs]
165484.160: [GC 165484.160: [ParNew: 471872K-&gt;52416K(471872K), 0.1511710 secs] 1835059K-&gt;1468617K(2044736K), 0.1514160 secs] [Times: user=0.35 sys=0.01, real=0.15 secs]
165485.025: [GC 165485.025: [ParNew: 471872K-&gt;52416K(471872K), 0.1989200 secs] 1888073K-&gt;1513178K(2044736K), 0.1991520 secs] [Times: user=0.48 sys=0.02, real=0.20 secs]
165485.499: [CMS-concurrent-mark: 2.867/3.678 secs] [Times: user=10.39 sys=0.60, real=3.68 secs]
165485.499: [CMS-concurrent-preclean-start]
165485.597: [CMS-concurrent-preclean: 0.095/0.098 secs] [Times: user=0.29 sys=0.05, real=0.10 secs]
165485.597: [CMS-concurrent-abortable-preclean-start]
165486.287: [GC 165486.287: [ParNew: 471872K-&gt;52416K(471872K), 0.4610860 secs] 1932634K-&gt;1567513K(2044736K), 0.4614320 secs] [Times: user=1.01 sys=0.05, real=0.46 secs]
165486.938: [CMS-concurrent-abortable-preclean: 0.580/1.341 secs] [Times: user=4.14 sys=0.28, real=1.34 secs]
165486.941: [GC[YG occupancy: 128659 K (471872 K)]165486.941: [Rescan (parallel) , 0.2358900 secs]165487.177: [weak refs processing, 0.0020640 secs] [1 CMS-remark: 1515097K(1572864K)] 1643757K(2044736K), 0.2381370 secs] [Times: user=0.47 sys=0.01, real=0.24 secs]
165487.181: [CMS-concurrent-sweep-start]
165488.042: [Full GC 165488.043: [CMS165488.518: [CMS-concurrent-sweep: 1.213/1.337 secs] [Times: user=3.37 sys=0.23, real=1.34 secs]
 (concurrent mode failure) (concurrent mode failure): 1514835K-&gt;1485873K(1572864K), 0.4853610 secs] 1986707K-&gt;1957745K(2044736K), [CMS Perm : 81695K-&gt;81695K(136412K)], 0.4856970 secs] [Times: user=0.37 sys=0.01, real=0.48 secs]
165488.532: [GC 165488.532: [ParNew: 471872K-&gt;44512K(471872K), 0.3130160 secs] 1957745K-&gt;1573798K(2044736K), 0.3133460 secs] [Times: user=0.75 sys=0.02, real=0.31 secs]
165489.568: [Full GC 165489.568: [CMS[Unloading class sun.reflect.GeneratedMethodAccessor1602]
[Unloading class sun.reflect.GeneratedMethodAccessor1597]
[Unloading class sun.reflect.GeneratedMethodAccessor1592]
[Unloading class sun.reflect.GeneratedMethodAccessor1594]
[Unloading class sun.reflect.GeneratedMethodAccessor1598]
[Unloading class sun.reflect.GeneratedMethodAccessor1555]
[Unloading class sun.reflect.GeneratedMethodAccessor1599]
[Unloading class sun.reflect.GeneratedMethodAccessor1600]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor77]
[Unloading class sun.reflect.GeneratedMethodAccessor1604]
[Unloading class sun.reflect.GeneratedMethodAccessor1593]
[Unloading class sun.reflect.GeneratedMethodAccessor1603]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor75]
[Unloading class sun.reflect.GeneratedMethodAccessor1596]
[Unloading class sun.reflect.GeneratedMethodAccessor1595]
[Unloading class sun.reflect.GeneratedMethodAccessor1567]
[Unloading class sun.reflect.GeneratedMethodAccessor395]
[Unloading class sun.reflect.GeneratedMethodAccessor1601]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor26]
: 1529286K-&gt;1392790K(1572864K), 4.5172760 secs] 1993254K-&gt;1392790K(2044736K), [CMS Perm : 81695K-&gt;81629K(136412K)], 4.5176710 secs] [Times: user=4.44 sys=0.02, real=4.52 secs]
165494.145: [GC [1 CMS-initial-mark: 1392790K(1572864K)] 1414063K(2044736K), 0.2010890 secs] [Times: user=0.20 sys=0.00, real=0.20 secs]
165494.347: [CMS-concurrent-mark-start]
165495.237: [GC 165495.237: [ParNew: 419456K-&gt;52416K(471872K), 0.2333590 secs] 1812246K-&gt;1460179K(2044736K), 0.2337080 secs] [Times: user=0.50 sys=0.01, real=0.23 secs]
165496.118: [GC 165496.118: [ParNew: 471872K-&gt;52416K(471872K), 0.1903580 secs] 1879635K-&gt;1515864K(2044736K), 0.1905860 secs] [Times: user=0.44 sys=0.03, real=0.19 secs]
165496.715: [GC 165496.715: [ParNew: 471872K-&gt;52416K(471872K), 0.2422860 secs] 1935320K-&gt;1563468K(2044736K), 0.2425610 secs] [Times: user=0.58 sys=0.02, real=0.24 secs]
165497.487: [Full GC 165497.487: [CMS165498.311: [CMS-concurrent-mark: 3.262/3.965 secs] [Times: user=11.02 sys=0.73, real=3.96 secs]
 (concurrent mode failure): 1511052K-&gt;1366128K(1572864K), 5.3419340 secs] 1982924K-&gt;1366128K(2044736K), [CMS Perm : 81638K-&gt;81638K(136412K)], 5.3422540 secs] [Times: user=5.28 sys=0.00, real=5.34 secs]
165503.637: [GC 165503.637: [ParNew: 419456K-&gt;52416K(471872K), 0.1635850 secs] 1785584K-&gt;1421481K(2044736K), 0.1638860 secs] [Times: user=0.39 sys=0.01, real=0.16 secs]
165503.804: [GC [1 CMS-initial-mark: 1369065K(1572864K)] 1424544K(2044736K), 0.1566690 secs] [Times: user=0.15 sys=0.00, real=0.15 secs]
165503.961: [CMS-concurrent-mark-start]
165505.133: [GC 165505.133: [ParNew: 471866K-&gt;52416K(471872K), 0.4184870 secs] 1840931K-&gt;1480980K(2044736K), 0.4188850 secs] [Times: user=0.91 sys=0.04, real=0.42 secs]
165506.175: [GC 165506.176: [ParNew: 471872K-&gt;52416K(471872K), 0.2192270 secs] 1900436K-&gt;1525506K(2044736K), 0.2194620 secs] [Times: user=0.49 sys=0.01, real=0.22 secs]
165507.094: [GC 165507.094: [ParNew: 471872K-&gt;52416K(471872K), 0.2391910 secs] 1944962K-&gt;1569157K(2044736K), 0.2394130 secs] [Times: user=0.49 sys=0.02, real=0.24 secs]
165508.178: [Full GC 165508.178: [CMS165509.030: [CMS-concurrent-mark: 4.169/5.068 secs] [Times: user=14.16 sys=1.11, real=5.07 secs]
 (concurrent mode failure): 1516741K-&gt;1484032K(1572864K), 8.9510320 secs] 1988613K-&gt;1484032K(2044736K), [CMS Perm : 81663K-&gt;81634K(136412K)], 8.9515060 secs] [Times: user=7.56 sys=0.15, real=8.95 secs]
165517.659: [GC 165517.659: [ParNew: 419456K-&gt;52416K(471872K), 0.1610900 secs] 1903488K-&gt;1541664K(2044736K), 0.1613260 secs] [Times: user=0.31 sys=0.00, real=0.16 secs]
165518.036: [GC [1 CMS-initial-mark: 1489248K(1572864K)] 1717780K(2044736K), 0.5143650 secs] [Times: user=0.51 sys=0.00, real=0.51 secs]
165518.552: [CMS-concurrent-mark-start]
165519.175: [GC 165519.175: [ParNew: 471872K-&gt;52416K(471872K), 0.5417870 secs] 1961120K-&gt;1606922K(2044736K), 0.5421660 secs] [Times: user=1.07 sys=0.04, real=0.54 secs]
165520.553: [Full GC 165520.553: [CMS165521.788: [CMS-concurrent-mark: 2.683/3.236 secs] [Times: user=7.05 sys=0.65, real=3.24 secs]
 (concurrent mode failure): 1554506K-&gt;1522781K(1572864K), 6.0295590 secs] 2026378K-&gt;1522781K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 6.0298480 secs] [Times: user=5.97 sys=0.01, real=6.03 secs]
165526.774: [GC 165526.774: [ParNew: 227496K-&gt;227496K(471872K), 0.0000320 secs] 1750278K-&gt;1750278K(2044736K), 0.0001730 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
GC locker: Trying a full collection because scavenge failed
165526.774: [Full GC 165526.774: [CMS: 1522781K-&gt;1532156K(1572864K), 5.7417660 secs] 1750278K-&gt;1532156K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.7420650 secs] [Times: user=5.67 sys=0.01, real=5.74 secs]
165532.560: [GC [1 CMS-initial-mark: 1532156K(1572864K)] 1559772K(2044736K), 0.3628570 secs] [Times: user=0.33 sys=0.02, real=0.37 secs]
165532.923: [CMS-concurrent-mark-start]
165533.668: [GC 165533.668: [ParNew: 419456K-&gt;419456K(471872K), 0.0000250 secs]165533.668: [CMS165535.512: [CMS-concurrent-mark: 2.581/2.589 secs] [Times: user=4.38 sys=0.27, real=2.59 secs]
 (concurrent mode failure): 1532156K-&gt;1544103K(1572864K), 7.4693280 secs] 1951612K-&gt;1544103K(2044736K), 7.4697110 secs] [Times: user=7.30 sys=0.04, real=7.47 secs]
165542.182: [GC 165542.183: [ParNew: 419456K-&gt;419456K(471872K), 0.0000450 secs]165542.183: [CMS: 1544103K-&gt;1546768K(1572864K), 4.2923010 secs] 1963559K-&gt;1546768K(2044736K), 4.2927530 secs] [Times: user=4.25 sys=0.00, real=4.29 secs]
165546.939: [GC [1 CMS-initial-mark: 1546768K(1572864K)] 1966224K(2044736K), 0.3814880 secs] [Times: user=0.37 sys=0.00, real=0.38 secs]
165547.321: [CMS-concurrent-mark-start]
165547.322: [GC 165547.323: [ParNew: 419456K-&gt;419456K(471872K), 0.0000240 secs]165547.323: [CMS165549.212: [CMS-concurrent-mark: 1.885/1.891 secs] [Times: user=1.88 sys=0.00, real=1.90 secs]
 (concurrent mode failure): 1546768K-&gt;1558536K(1572864K), 7.2698510 secs] 1966224K-&gt;1558536K(2044736K), 7.2701150 secs] [Times: user=7.20 sys=0.00, real=7.27 secs]
165555.162: [GC 165555.162: [ParNew: 419456K-&gt;419456K(471872K), 0.0000440 secs]165555.162: [CMS: 1558536K-&gt;1572419K(1572864K), 4.6586080 secs] 1977992K-&gt;1572419K(2044736K), 4.6590020 secs] [Times: user=4.59 sys=0.00, real=4.65 secs]
165559.919: [GC [1 CMS-initial-mark: 1572419K(1572864K)] 1693916K(2044736K), 0.3145610 secs] [Times: user=0.31 sys=0.00, real=0.32 secs]
165560.236: [CMS-concurrent-mark-start]
165560.628: [GC 165560.628: [ParNew: 419456K-&gt;419456K(471872K), 0.0000280 secs]165560.628: [CMS165562.196: [CMS-concurrent-mark: 1.954/1.961 secs] [Times: user=2.84 sys=0.19, real=1.96 secs]
 (concurrent mode failure): 1572419K-&gt;1572863K(1572864K), 8.8879030 secs] 1991875K-&gt;1607194K(2044736K), 8.8882080 secs] [Times: user=8.80 sys=0.00, real=8.89 secs]
165569.881: [Full GC 165569.881: [CMS: 1572863K-&gt;1572863K(1572864K), 4.8703640 secs] 1992319K-&gt;1634385K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 4.8706150 secs] [Times: user=4.82 sys=0.00, real=4.88 secs]
165574.775: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1656915K(2044736K), 0.1364280 secs] [Times: user=0.14 sys=0.00, real=0.14 secs]
165574.911: [CMS-concurrent-mark-start]
165575.648: [Full GC 165575.649: [CMS165576.932: [CMS-concurrent-mark: 2.013/2.020 secs] [Times: user=3.41 sys=0.21, real=2.01 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 5.9651530 secs] 2044735K-&gt;1682474K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.9654160 secs] [Times: user=5.91 sys=0.00, real=5.97 secs]
165582.423: [Full GC 165582.423: [CMS: 1572863K-&gt;1572864K(1572864K), 5.0236220 secs] 2044735K-&gt;1695427K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.0239250 secs] [Times: user=4.98 sys=0.00, real=5.02 secs]
165587.448: [GC [1 CMS-initial-mark: 1572864K(1572864K)] 1697093K(2044736K), 0.1697460 secs] [Times: user=0.17 sys=0.00, real=0.17 secs]
165587.618: [CMS-concurrent-mark-start]
165588.609: [Full GC 165588.609: [CMS165589.719: [CMS-concurrent-mark: 2.093/2.100 secs] [Times: user=4.07 sys=0.63, real=2.10 secs]
 (concurrent mode failure): 1572864K-&gt;1572864K(1572864K), 6.7291670 secs] 2044735K-&gt;1724617K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 6.7294860 secs] [Times: user=6.62 sys=0.03, real=6.73 secs]
165596.592: [Full GC 165596.592: [CMS: 1572864K-&gt;1572864K(1572864K), 4.4670560 secs] 2044735K-&gt;1735633K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 4.4673550 secs] [Times: user=4.43 sys=0.00, real=4.47 secs]
165601.346: [GC [1 CMS-initial-mark: 1572864K(1572864K)] 1992320K(2044736K), 0.5660880 secs] [Times: user=0.56 sys=0.00, real=0.57 secs]
165601.913: [CMS-concurrent-mark-start]
165602.192: [Full GC 165602.192: [CMS165603.600: [CMS-concurrent-mark: 1.681/1.687 secs] [Times: user=2.27 sys=0.20, real=1.68 secs]
 (concurrent mode failure): 1572864K-&gt;1572863K(1572864K), 7.8641150 secs] 2044734K-&gt;1739724K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 7.8643680 secs] [Times: user=7.78 sys=0.00, real=7.86 secs]
165610.597: [Full GC 165610.597: [CMS: 1572863K-&gt;1572864K(1572864K), 4.9612280 secs] 2044735K-&gt;1738303K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 4.9614800 secs] [Times: user=4.92 sys=0.00, real=4.96 secs]
165615.797: [GC [1 CMS-initial-mark: 1572864K(1572864K)] 1992913K(2044736K), 0.3312260 secs] [Times: user=0.32 sys=0.00, real=0.33 secs]
165616.129: [CMS-concurrent-mark-start]
165616.507: [Full GC 165616.507: [CMS165618.227: [CMS-concurrent-mark: 2.085/2.098 secs] [Times: user=2.89 sys=0.26, real=2.10 secs]
 (concurrent mode failure): 1572864K-&gt;1572863K(1572864K), 8.0011150 secs] 2044735K-&gt;1733747K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 8.0014230 secs] [Times: user=7.91 sys=0.00, real=8.00 secs]
165624.791: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1997838K(2044736K), 0.3768850 secs] [Times: user=0.38 sys=0.00, real=0.38 secs]
165625.168: [CMS-concurrent-mark-start]
165625.514: [Full GC 165625.514: [CMS165627.373: [CMS-concurrent-mark: 2.191/2.204 secs] [Times: user=2.95 sys=0.23, real=2.21 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 8.6134440 secs] 2044735K-&gt;1745403K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 8.6138280 secs] [Times: user=8.50 sys=0.02, real=8.61 secs]
165634.940: [Full GC 165634.940: [CMS: 1572863K-&gt;1572863K(1572864K), 5.7606810 secs] 2044735K-&gt;1763133K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 5.7610340 secs] [Times: user=5.70 sys=0.00, real=5.76 secs]
165640.853: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992760K(2044736K), 0.5402960 secs] [Times: user=0.54 sys=0.00, real=0.54 secs]
165641.394: [CMS-concurrent-mark-start]
165641.711: [Full GC 165641.711: [CMS165643.146: [CMS-concurrent-mark: 1.745/1.752 secs] [Times: user=2.40 sys=0.24, real=1.75 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 7.6559090 secs] 2044735K-&gt;1806228K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 7.6561430 secs] [Times: user=7.58 sys=0.00, real=7.66 secs]
165649.836: [Full GC 165649.836: [CMS: 1572863K-&gt;1572863K(1572864K), 6.5024530 secs] 2044735K-&gt;1808957K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 6.5028710 secs] [Times: user=6.42 sys=0.00, real=6.50 secs]
165656.702: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992334K(2044736K), 0.6510610 secs] [Times: user=0.65 sys=0.00, real=0.65 secs]
165657.354: [CMS-concurrent-mark-start]
165657.768: [Full GC 165657.768: [CMS165659.289: [CMS-concurrent-mark: 1.926/1.935 secs] [Times: user=2.79 sys=0.33, real=1.93 secs]
 (concurrent mode failure): 1572864K-&gt;1572863K(1572864K), 9.4778960 secs] 2044735K-&gt;1817502K(2044736K), [CMS Perm : 81634K-&gt;81634K(136412K)], 9.4782160 secs] [Times: user=9.15 sys=0.00, real=9.48 secs]
165668.339: [Full GC 165668.339: [CMS[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor82]
: 1572864K-&gt;1572863K(1572864K), 9.3393990 secs] 2044736K-&gt;1848935K(2044736K), [CMS Perm : 81634K-&gt;81631K(136412K)], 9.3398270 secs] [Times: user=9.25 sys=0.00, real=9.34 secs]
165677.949: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1993871K(2044736K), 0.6954050 secs] [Times: user=0.69 sys=0.00, real=0.70 secs]
165678.644: [CMS-concurrent-mark-start]
165679.539: [Full GC 165679.540: [CMS165681.669: [CMS-concurrent-mark: 3.012/3.025 secs] [Times: user=4.80 sys=0.64, real=3.02 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 11.9368790 secs] 2044735K-&gt;1859006K(2044736K), [CMS Perm : 81631K-&gt;81631K(136412K)], 11.9372800 secs] [Times: user=11.61 sys=0.00, real=11.94 secs]
165692.759: [Full GC 165692.759: [CMS[Unloading class sun.reflect.GeneratedConstructorAccessor240]
: 1572863K-&gt;1572863K(1572864K), 11.2508310 secs] 2044735K-&gt;1874250K(2044736K), [CMS Perm : 81631K-&gt;81628K(136412K)], 11.2511750 secs] [Times: user=9.91 sys=0.00, real=11.25 secs]
165704.100: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992415K(2044736K), 0.3157090 secs] [Times: user=0.31 sys=0.00, real=0.32 secs]
165704.416: [CMS-concurrent-mark-start]
165704.825: [Full GC 165704.825: [CMS165706.129: [CMS-concurrent-mark: 1.703/1.713 secs] [Times: user=2.54 sys=0.34, real=1.71 secs]
 (concurrent mode failure): 1572863K-&gt;1572863K(1572864K), 6.3984280 secs] 2044732K-&gt;1866289K(2044736K), [CMS Perm : 81628K-&gt;81628K(136412K)], 6.3986960 secs] [Times: user=6.34 sys=0.01, real=6.40 secs]
165711.728: [Full GC 165711.728: [CMS: 1572863K-&gt;1572863K(1572864K), 5.4379380 secs] 2044735K-&gt;1880349K(2044736K), [CMS Perm : 81628K-&gt;81628K(136412K)], 5.4382730 secs] [Times: user=5.39 sys=0.00, real=5.44 secs]
165717.351: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992539K(2044736K), 0.6038490 secs] [Times: user=0.60 sys=0.00, real=0.61 secs]
165717.955: [CMS-concurrent-mark-start]
165718.302: [Full GC 165718.302: [CMS165719.904: [CMS-concurrent-mark: 1.943/1.949 secs] [Times: user=2.69 sys=0.24, real=1.95 secs]
 (concurrent mode failure)[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor25]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor18]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor17]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor22]
[Unloading class sun.reflect.GeneratedMethodAccessor1445]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor24]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor10]
[Unloading class sun.reflect.GeneratedMethodAccessor441]
[Unloading class sun.reflect.GeneratedMethodAccessor854]
: 1572863K-&gt;1572863K(1572864K), 7.1694470 secs] 2044735K-&gt;1862162K(2044736K), [CMS Perm : 81628K-&gt;81598K(136412K)], 7.1696770 secs] [Times: user=7.09 sys=0.00, real=7.17 secs]
165726.106: [Full GC 165726.106: [CMS: 1572863K-&gt;1572862K(1572864K), 4.8448050 secs] 2044735K-&gt;1877599K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 4.8451090 secs] [Times: user=4.80 sys=0.00, real=4.84 secs]
165731.084: [GC [1 CMS-initial-mark: 1572862K(1572864K)] 1992928K(2044736K), 0.3369610 secs] [Times: user=0.34 sys=0.00, real=0.33 secs]
165731.421: [CMS-concurrent-mark-start]
165731.716: [Full GC 165731.716: [CMS165733.347: [CMS-concurrent-mark: 1.919/1.925 secs] [Times: user=2.56 sys=0.20, real=1.92 secs]
 (concurrent mode failure): 1572862K-&gt;1572252K(1572864K), 10.0779900 secs] 2044734K-&gt;1873718K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 10.0782250 secs] [Times: user=9.64 sys=0.00, real=10.08 secs]
165742.925: [Full GC 165742.925: [CMS: 1572776K-&gt;1572408K(1572864K), 6.1126860 secs] 2044648K-&gt;1887999K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 6.1130120 secs] [Times: user=6.05 sys=0.00, real=6.11 secs]
165749.202: [GC [1 CMS-initial-mark: 1572408K(1572864K)] 1991990K(2044736K), 0.7009320 secs] [Times: user=0.69 sys=0.00, real=0.71 secs]
165749.903: [CMS-concurrent-mark-start]
165750.271: [Full GC 165750.271: [CMS165751.834: [CMS-concurrent-mark: 1.920/1.931 secs] [Times: user=2.65 sys=0.30, real=1.93 secs]
 (concurrent mode failure): 1572647K-&gt;1572863K(1572864K), 8.3700350 secs] 2044519K-&gt;1900106K(2044736K), [CMS Perm : 81598K-&gt;81598K(136412K)], 8.3703090 secs] [Times: user=8.25 sys=0.00, real=8.38 secs]
165759.574: [Full GC 165759.574: [CMS[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor19]
: 1572863K-&gt;1572863K(1572864K), 5.2368120 secs] 2044735K-&gt;1906019K(2044736K), [CMS Perm : 81598K-&gt;81594K(136412K)], 5.2371710 secs] [Times: user=5.17 sys=0.01, real=5.24 secs]
165764.957: [GC [1 CMS-initial-mark: 1572863K(1572864K)] 1992752K(2044736K), 0.5464550 secs] [Times: user=0.54 sys=0.00, real=0.55 secs]
165765.504: [CMS-concurrent-mark-start]
165765.849: [Full GC 165765.849: [CMS165767.557: [CMS-concurrent-mark: 2.043/2.053 secs] [Times: user=2.59 sys=0.28, real=2.05 secs]
 (concurrent mode failure)</code></pre><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-5700e7e2512147a4883b87f0a4393b7c" data-id="5700e7e2512147a4883b87f0a4393b7c"><span><div id="5700e7e2512147a4883b87f0a4393b7c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#5700e7e2512147a4883b87f0a4393b7c" title="两个原因："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">两个原因：</span></span></h4><ul class="notion-list notion-list-disc notion-block-46eca8628e7a473784a8ceaa4ef513fb"><li>在 CMS 启动过程中，新生代提升速度过快，老年代收集速度赶不上新生代提升速度</li></ul><ul class="notion-list notion-list-disc notion-block-7f10f90353f949e482b1d4b310fba889"><li>在 CMS 启动过程中，老年代碎片化严重，无法容纳新生代提升上来的大对象</li></ul><div class="notion-text notion-block-2bcf9023d4cf4a41b198bfd6e42187d8">发送这种情况，应用线程将会全部停止（相当于网站这段时间无法响应用户请求），进行压缩式垃圾收集（回退到 Serial Old 算法）</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-79389d3262ac4d6a8a7a26867b0ec986" data-id="79389d3262ac4d6a8a7a26867b0ec986"><span><div id="79389d3262ac4d6a8a7a26867b0ec986" class="notion-header-anchor"></div><a class="notion-hash-link" href="#79389d3262ac4d6a8a7a26867b0ec986" title="解决办法："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">解决办法：</span></span></h4><div class="notion-text notion-block-486b61e371b24a5ea2ca7ee24747ad8f">新生代提升过快问题：</div><ul class="notion-list notion-list-disc notion-block-4e360d7924324c6f9a6f6ad15017f613"><li>如果频率太快的话，说明空间不足，首先可以尝试调大新生代空间和晋升阈值。</li></ul><ul class="notion-list notion-list-disc notion-block-71c31fe660b64ad3aebcd5bdfa2479d8"><li>如果内存有限，可以设置 CMS 垃圾收集在老年代占比达到多少时启动来减少问题发生频率（越早启动问题发生频率越低，但是会降低吞吐量，具体得多调整几次找到平衡点），参数如下：如果没有第二个参数，会随着 JVM 动态调节 CMS 启动时间</li></ul><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">-XX:CMSInitiatingOccupancyFraction=68 （默认是 68）
-XX:+UseCMSInitiatingOccupancyOnly</code></pre><div class="notion-text notion-block-8e30a2c90af745a38241f63ee30e74ac">老年代碎片严重问题：</div><ul class="notion-list notion-list-disc notion-block-6b178a34216d477798719f1836a608df"><li>如果频率太快或者 Full GC 后空间释放不多的话，说明空间不足，首先可以尝试调大老年代空间</li></ul><ul class="notion-list notion-list-disc notion-block-e053a173ba204cc1b13c98db6264ac35"><li>如果内存不足，可以设置进行 n 次 CMS 后进行一次压缩式 Full GC，参数如下：</li></ul><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">-XX:+UseCMSCompactAtFullCollection：允许在 Full GC 时，启用压缩式 GC
-XX:CMSFullGCBeforeCompaction=n     在进行 n 次，CMS 后，进行一次压缩的 Full GC，用以减少 CMS 产生的碎片</code></pre><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-05d513b510534d4382301d2779677c52" data-id="05d513b510534d4382301d2779677c52"><span><div id="05d513b510534d4382301d2779677c52" class="notion-header-anchor"></div><a class="notion-hash-link" href="#05d513b510534d4382301d2779677c52" title="提升失败（promotion failed）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">提升失败（promotion failed）</span></span></h3><div class="notion-text notion-block-661743afe6af4a3b86fd0b6dbcf92397">在 <code class="notion-inline-code">Minor GC</code> 过程中，<code class="notion-inline-code">Survivor Unused</code> 可能不足以容纳 <code class="notion-inline-code">Eden</code> 和另一个 <code class="notion-inline-code">Survivor</code> 中的存活对象， 那么多余的将被移到老年代， 称为过早提升（Premature Promotion）。 这会导致老年代中短期存活对象的增长， 可能会引发严重的性能问题。  再进一步， 如果老年代满了， Minor GC 后会进行 Full GC， 这将导致遍历整个堆， 称为提升失败（Promotion Failure）。</div><div class="notion-text notion-block-5ac7939d9a3f452cbc927d8d0e9d5ea8">提升失败日志：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">2016-01-07T18:54:26.948+0800: 18782.967: [GC2016-04-07T18:54:26.948+0800: 18782.967: [ParNew (promotion failed)
Desired survivor size 117833728 bytes, new threshold 10 (max 10)
- age   1:    6141680 bytes,    6141680 total
- age   2:    6337936 bytes,   12479616 total
- age   3:     549120 bytes,   13028736 total
- age   4:      87768 bytes,   13116504 total
- age   5:     221384 bytes,   13337888 total
- age   6:     934168 bytes,   14272056 total
- age   7:     146072 bytes,   14418128 total
- age   8:     626064 bytes,   15044192 total
- age   9:     398000 bytes,   15442192 total
- age  10:     429616 bytes,   15871808 total
: 1969227K-&gt;1929200K(2071808K), 0.7452140 secs]2016-01-07T18:54:27.693+0800: 18783.713: [CMS: 1394703K-&gt;632845K(2097152K), 4.0993640 secs] 3301676K-&gt;632845K(4168960K), [CMS Perm : 77485K-&gt;77473K(159744K)], 4.8450240 secs] [Times: user=5.18 sys=0.56, real=4.84 secs]
Heap after GC invocations=5847 (full 7):
 par new generation   total 2071808K, used 0K [0x00000006e9c00000, 0x0000000776400000, 0x0000000776400000)
  eden space 1841664K,   0% used [0x00000006e9c00000, 0x00000006e9c00000, 0x000000075a280000)
  from space 230144K,   0% used [0x0000000768340000, 0x0000000768340000, 0x0000000776400000)
  to   space 230144K,   0% used [0x000000075a280000, 0x000000075a280000, 0x0000000768340000)
 concurrent mark-sweep generation total 2097152K, used 632845K [0x0000000776400000, 0x00000007f6400000, 0x00000007f6400000)
 concurrent-mark-sweep perm gen total 159744K, used 77473K [0x00000007f6400000, 0x0000000800000000, 0x0000000800000000)
}</code></pre><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-f534cd3b4c424c9c993d17153c46ad85" data-id="f534cd3b4c424c9c993d17153c46ad85"><span><div id="f534cd3b4c424c9c993d17153c46ad85" class="notion-header-anchor"></div><a class="notion-hash-link" href="#f534cd3b4c424c9c993d17153c46ad85" title="提升失败原因："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">提升失败原因：</span></span></h4><ul class="notion-list notion-list-disc notion-block-b0fd9d8a12ce42f99dc5ab41ef805c60"><li>Minor GC 时发现 Survivor 空间放不下，而老年代的空闲也不够</li></ul><ul class="notion-list notion-list-disc notion-block-2b48b1af03f6434b88da84f7bdb63412"><li>新生代提升太快</li></ul><ul class="notion-list notion-list-disc notion-block-bfe473103d8c45ff810683fea48d928f"><li>老年代碎片太多，放不下大对象提升（表现为老年代还有很多空间但是，出现了 <code class="notion-inline-code">promotion failed</code>）</li></ul><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-f30fb9d2a9584fec8159a08ccc4d5b0e" data-id="f30fb9d2a9584fec8159a08ccc4d5b0e"><span><div id="f30fb9d2a9584fec8159a08ccc4d5b0e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#f30fb9d2a9584fec8159a08ccc4d5b0e" title="解决方法："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">解决方法：</span></span></h4><ul class="notion-list notion-list-disc notion-block-bb218ce083244bdcaa0ce318bf131988"><li>两条和上面 <code class="notion-inline-code">concurrent mode failure</code> 一样</li></ul><ul class="notion-list notion-list-disc notion-block-edb6181c778144ceb84efcb04d533750"><li>另一条，是因为 <code class="notion-inline-code">Survivor Unused</code> 不足，那么可以尝试调大 <code class="notion-inline-code">Survivor</code> 来尝试下</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-60b3e0ee23fc41968eb5e4c98642b157" data-id="60b3e0ee23fc41968eb5e4c98642b157"><span><div id="60b3e0ee23fc41968eb5e4c98642b157" class="notion-header-anchor"></div><a class="notion-hash-link" href="#60b3e0ee23fc41968eb5e4c98642b157" title="在 GC 的时候其他系统活动影响"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">在 GC 的时候其他系统活动影响</span></span></h3><div class="notion-text notion-block-5d53912f1b464d2b9189096f05cccc34">有些时候系统活动诸如内存换入换出（<code class="notion-inline-code">vmstat</code>）、网络活动（<code class="notion-inline-code">netstat</code>）、I/O （<code class="notion-inline-code">iostat</code>）在 GC 过程中发生会使 GC 时间变长。</div><div class="notion-text notion-block-e3ee0a39f7dd414cb3df209bcb2d7fb8">前提是你的服务器上是有 SWAP 区域（用 top、 vmstat 等命令可以看出）用于内存的换入换出，那么操作系统可能会将 JVM 中不活跃的内存页换到 SWAP 区域用以释放内存给线程使用（这也透露出内存开始不够用了）。内存换入换出是一个开销巨大的磁盘操作，比内存访问慢好几个数量级。</div><div class="notion-text notion-block-d98a10fcdf16454eb2b0fae047e76955">看一段 GC 日志：耗时 29.47 秒</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-bash">{Heap before GC invocations=132 (full 0):
par new generation total 2696384K, used 2696384K [0xfffffffc20010000, 0xfffffffce0010000, 0xfffffffce0010000)
eden space 2247040K, 100% used [0xfffffffc20010000, 0xfffffffca9270000, 0xfffffffca9270000)
from space 449344K, 100% used [0xfffffffca9270000, 0xfffffffcc4940000, 0xfffffffcc4940000)
to space 449344K, 0% used [0xfffffffcc4940000, 0xfffffffcc4940000, 0xfffffffce0010000)
concurrent mark-sweep generation total 9437184K, used 1860619K [0xfffffffce0010000, 0xffffffff20010000, 0xffffffff20010000)
concurrent-mark-sweep perm gen total 1310720K, used 511451K [0xffffffff20010000, 0xffffffff70010000, 0xffffffff70010000)
2013-07-17T03:58:06.601-0700: 51522.120: [GC Before GC: : 2696384K-&gt;449344K(2696384K), 29.4779282 secs] 4557003K-&gt;2326821K(12133568K) ,29.4795222 secs] [Times: user=915.56 sys=6.35, real=29.48 secs]</code></pre><div class="notion-text notion-block-f879ab94449c4245bf1d071156715a7d">再看看此时的 vmstat 命令中 si、so 列的数值，如果数值大说明换入换出严重，这是内存不足的表现。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-667d308086744fe48f56bd5fa8b27b7e" data-id="667d308086744fe48f56bd5fa8b27b7e"><span><div id="667d308086744fe48f56bd5fa8b27b7e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#667d308086744fe48f56bd5fa8b27b7e" title="解决方法："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">解决方法：</span></span></h4><div class="notion-text notion-block-ecdc9304411743e3aa3569dc4c1b3499">减少线程，这样可以降低内存换入换出；增加内存；如果是 JVM 内存设置过大导致线程所用内存不足，则适当调低 <code class="notion-inline-code">-Xmx</code> 和 <code class="notion-inline-code">-Xms</code>。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-fbf384dcbb7d4d0f84a4041ad51c49e7" data-id="fbf384dcbb7d4d0f84a4041ad51c49e7"><span><div id="fbf384dcbb7d4d0f84a4041ad51c49e7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#fbf384dcbb7d4d0f84a4041ad51c49e7" title="JVM 的 bug"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">JVM 的 bug</span></span></h3><div class="notion-text notion-block-7b2ae48716164ac5bc2add6952e37853">这种原因就根据自己使用的 JDK 版本去查一下，如果是 JVM 的 bug，升级到解决的版本一般就能解决。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-7221b7f131634f238b7b7bb4f94a8f19" data-id="7221b7f131634f238b7b7bb4f94a8f19"><span><div id="7221b7f131634f238b7b7bb4f94a8f19" class="notion-header-anchor"></div><a class="notion-hash-link" href="#7221b7f131634f238b7b7bb4f94a8f19" title="总结"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">总结</span></span></h3><div class="notion-text notion-block-3855f13fc0b24f4686e4e5c6750b3b70">长时间停顿问题的排查及解决首先需要一定的信息和方法论：</div><ul class="notion-list notion-list-disc notion-block-6d2e5b4d799848c19e8fa2fc7fd9b6dc"><li>详细的 GC 日志</li></ul><ul class="notion-list notion-list-disc notion-block-2227b84f43944631817c7d385e0be491"><li>借助 Linux 平台下的 iostat、vmstat、netstat、mpstat 等命令监控系统情况</li></ul><ul class="notion-list notion-list-disc notion-block-af4b8fde20d34b0ebafb5bf37be26a4c"><li>使用 GCHisto 这个 GC 图形用户界面工具，可以统计出 Minor GC 及 Full GC 频率及时长分布</li></ul><ul class="notion-list notion-list-disc notion-block-7ea8a83934c249f18adf06e022eeb0fe"><li>查看 GC 日志中是否出现了上述的典型内存异常问题（promotion failed, concurrent mode failure），整体来说把上述两个典型内存异常情况控制在可接受的发生频率即可，对 CMS 碎片问题来说杜绝以上问题似乎不太可能，只能靠 G1 来解决了</li></ul><ul class="notion-list notion-list-disc notion-block-a1df593e1357490894c004fe8001b300"><li>是不是 JVM 本身的 bug 导致的</li></ul><ul class="notion-list notion-list-disc notion-block-38ed60f9395741dc82bb29f8c2d192aa"><li>如果程序没问题，参数调了几次还是不能解决，可能说明流量太大，需要加机器把压力分散到更多 JVM 上</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-4bcc8a3ab61b455193d5829019c8fccd" data-id="4bcc8a3ab61b455193d5829019c8fccd"><span><div id="4bcc8a3ab61b455193d5829019c8fccd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4bcc8a3ab61b455193d5829019c8fccd" title="参考资料"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">参考资料</span></span></h3><div class="notion-text notion-block-f535b32e9584408f869760a62c538fe0"><a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://blogs.oracle.com/poonam/entry/troubleshooting_long_gc_pauses">《Java 性能优化权威指南》</a></div><div class="notion-text notion-block-7ea659374bba4499b5b8378747001c35">转载 : <a target="_blank" rel="noopener noreferrer" class="notion-link" href="http://blog.csdn.net/wenniuwuren/article/details/51131741">wenniuwuren</a></div><div class="notion-blank notion-block-5c518d19977f41819f7c3c3d186d210d"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka]]></title>
            <link>https://www.calfgz.cn//article/springcloud-service-discovery-products.html</link>
            <guid>https://www.calfgz.cn//article/springcloud-service-discovery-products.html</guid>
            <pubDate>Mon, 07 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka]]></description>
            <content:encoded><![CDATA[<div id="container" class="mx-auto undefined"><main class="notion light-mode notion-page notion-block-fe6e67cb888a4bab9ef985ed39e578f7"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-text notion-block-b67104e3a110495f9644b9250c45fd2a">这里就平时经常用到的服务发现的产品进行下特性的对比，首先看下结论:</div><table class="notion-simple-table notion-block-ce8ef33984a24b8a8eb8546101cfae1f"><tbody><tr class="notion-simple-table-row notion-block-7c06271f0c0345af9b1d664b706f62cc"><td class="" style="width:120px"><div class="notion-simple-table-cell">Feature</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">Consul</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">zookeeper</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">etcd</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">euerka</div></td></tr><tr class="notion-simple-table-row notion-block-7c2686cb194d45a8922a0c11e53daf0b"><td class="" style="width:120px"><div class="notion-simple-table-cell">服务健康检查</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">服务状态，内存，硬盘等</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">(弱)长连接，keepalive</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">连接心跳</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">可配支持</div></td></tr><tr class="notion-simple-table-row notion-block-82a2965183654df9baa465b9043f7f22"><td class="" style="width:120px"><div class="notion-simple-table-cell">多数据中心</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td></tr><tr class="notion-simple-table-row notion-block-a55f089a82b24010a966e9a73d0f9751"><td class="" style="width:120px"><div class="notion-simple-table-cell">kv存储服务</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td></tr><tr class="notion-simple-table-row notion-block-c4834533133c4f24a59f8fafdcbe598f"><td class="" style="width:120px"><div class="notion-simple-table-cell">一致性</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">raft</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">paxos</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">raft</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td></tr><tr class="notion-simple-table-row notion-block-3de98db9050c4030ab6aaa97f6bcf8e2"><td class="" style="width:120px"><div class="notion-simple-table-cell">cap</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ca</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">cp</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">cp</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ap</div></td></tr><tr class="notion-simple-table-row notion-block-37044a17871d4ecca404d3c4c986eda2"><td class="" style="width:120px"><div class="notion-simple-table-cell">使用接口(多语言能力)</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持http和dns</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">客户端</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">http/grpc</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">http（sidecar）</div></td></tr><tr class="notion-simple-table-row notion-block-b195d80a893b46c5a71417ed317a61f8"><td class="" style="width:120px"><div class="notion-simple-table-cell">watch支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">全量/支持long polling</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持 long polling</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持 long polling/大部分增量</div></td></tr><tr class="notion-simple-table-row notion-block-768ead4658c14da099df81732b2d5f54"><td class="" style="width:120px"><div class="notion-simple-table-cell">自身监控</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">metrics</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">metrics</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">metrics</div></td></tr><tr class="notion-simple-table-row notion-block-c9b907b40dde47fba0e5830eebb0f90c"><td class="" style="width:120px"><div class="notion-simple-table-cell">安全</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">acl/https</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">acl</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">https支持（弱）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td></tr><tr class="notion-simple-table-row notion-block-f6b68a03cacc490893f7b90f0d7575cd"><td class="" style="width:120px"><div class="notion-simple-table-cell">spring cloud集成</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">已支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">已支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">已支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">已支持</div></td></tr></tbody></table><ul class="notion-list notion-list-disc notion-block-f2f760b2f3514c4fab78e66a1ae013e0"><li>服务的健康检查
<code class="notion-inline-code">Euraka</code> 使用时需要显式配置健康检查支持；<code class="notion-inline-code">Zookeeper</code><span style="padding:0.5em"></span><code class="notion-inline-code">Etcd</code> 则在失去了和服务进程的连接情况下任务不健康，而 <code class="notion-inline-code">Consul</code>相对更为详细点，比如内存是否已使用了90%，文件系统的空间是不是快不足了。</li></ul><ul class="notion-list notion-list-disc notion-block-71b61c12b1054d858daf5d38bbd13d78"><li>多数据中心支持
<code class="notion-inline-code">Consul</code> 通过 <code class="notion-inline-code">WAN</code> 的 <code class="notion-inline-code">Gossip</code> 协议，完成跨数据中心的同步；而且其他的产品则需要额外的开发工作来实现；</li></ul><ul class="notion-list notion-list-disc notion-block-ea80ec37d9e647a783f12675458e9095"><li>KV 存储服务
除了 <code class="notion-inline-code">Eureka</code> ,其他几款都能够对外支持 k-v 的存储服务，所以后面会讲到这几款产品追求高一致性的重要原因。而提供存储服务，也能够较好的转化为动态配置服务哦。</li></ul><ul class="notion-list notion-list-disc notion-block-a1e3735fd7e1460587f0656704d5c07f"><li>产品设计中 CAP 理论的取舍
<code class="notion-inline-code">Eureka</code> 典型的 AP,作为分布式场景下的服务发现的产品较为合适，服务发现场景的可用性优先级较高，一致性并不是特别致命。其次 CA 类型的场景 <code class="notion-inline-code">Consul</code>,也能提供较高的可用性，并能 <code class="notion-inline-code">k-v</code> <code class="notion-inline-code">store</code> 服务保证一致性。 而 <code class="notion-inline-code">Zookeeper</code><span style="padding:0.5em"></span><code class="notion-inline-code">Etcd</code>则是CP类型 牺牲可用性，在服务发现场景并没太大优势；</li></ul><ul class="notion-list notion-list-disc notion-block-9cab2e2e8015470a9b11f0ff1e4f34ac"><li>多语言能力与对外提供服务的接入协议
<code class="notion-inline-code">Zookeeper</code>的跨语言支持较弱，其他几款支持 <code class="notion-inline-code">http</code> 提供接入的可能。<code class="notion-inline-code">Euraka</code> 一般通过 <code class="notion-inline-code">sidecar</code>的方式提供多语言客户端的接入支持。<code class="notion-inline-code">Etcd</code> 还提供了 <code class="notion-inline-code">Grpc</code>的支持。 <code class="notion-inline-code">Consul</code>除了标准的Rest服务api,还提供了DNS的支持。</li></ul><ul class="notion-list notion-list-disc notion-block-c6d4c278a1cc447f9451e3485c4febe5"><li>Watch的支持（客户端观察到服务提供者变化）
<code class="notion-inline-code">Zookeeper</code> 支持服务器端推送变化，<code class="notion-inline-code">Eureka 2.0</code>(正在开发中)也计划支持。 <code class="notion-inline-code">Eureka 1</code><span style="padding:0.5em"></span><code class="notion-inline-code">Consul</code><span style="padding:0.5em"></span><code class="notion-inline-code">Etcd</code>则都通过长轮询的方式来实现变化的感知；</li></ul><ul class="notion-list notion-list-disc notion-block-dc5b07946f1b41c880ff96361887abb4"><li>自身集群的监控
除了 <code class="notion-inline-code">Zookeeper</code> ,其他几款都默认支持 <code class="notion-inline-code">metrics</code>，运维者可以搜集并报警这些度量信息达到监控目的；</li></ul><ul class="notion-list notion-list-disc notion-block-c2fbafde7b564c7ab294c2f0fd9ebfb3"><li>安全
<code class="notion-inline-code">Consul</code><span style="padding:0.5em"></span><code class="notion-inline-code">Zookeeper</code> 支持ACL，另外 <code class="notion-inline-code">Consul</code><span style="padding:0.5em"></span><code class="notion-inline-code">Etcd</code> 支持安全通道 <code class="notion-inline-code">https</code>.</li></ul><ul class="notion-list notion-list-disc notion-block-7dd3137f1c1a42c3a6e0ad0a58294109"><li>SpringCloud的集成
目前都有相对应的 <code class="notion-inline-code">boot starter</code>，提供了集成能力。</li></ul><div class="notion-text notion-block-0830571d1ce34c7a9440e75472caca04">总的来看，目前 <code class="notion-inline-code">Consul</code> 自身功能，和 <code class="notion-inline-code">SpringCloud</code> 对其集成的支持都相对较为完善，而且运维的复杂度较为简单（没有详细列出讨论），<code class="notion-inline-code">Eureka</code> 设计上比较符合场景，但还需持续的完善。</div><div class="notion-text notion-block-e08931c70831468498fd5d878f440266">转载 : <a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/">Luyi&#x27;s Blog</a></div><div class="notion-blank notion-block-46d5a4d012aa482e879bcde0368e0138"> </div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>