<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
    <title>bigfish的网络博客 - .NET</title>
    <subtitle>记录技术和生活</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.laofu.online/tags/net/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.laofu.online"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2017-09-27T10:00:00+08:00</updated>
    <id>https://blog.laofu.online/tags/net/atom.xml</id>
    <entry xml:lang="zh">
        <title>服务器 CPU 居高不下：一次 Dump 排查历程</title>
        <published>2017-09-27T10:00:00+08:00</published>
        <updated>2017-09-27T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/cpu-high-dump/"/>
        <id>https://blog.laofu.online/blog/cpu-high-dump/</id>
        
        <content type="html" xml:base="https://blog.laofu.online/blog/cpu-high-dump/">&lt;h3 id=&quot;ji-ben-de-gai-shu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ji-ben-de-gai-shu&quot; aria-label=&quot;Anchor link for: ji-ben-de-gai-shu&quot;&gt;基本的概述&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在一个服务器的集群上面，服务器的CPU长时间居高不下，响应的时间也一直很慢，即使扩容了服务器CPU的下降效果也不是很明显。&lt;/p&gt;
&lt;p&gt;对于CPU过高的原因，可以总结到以下原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;太多的循环或者死循环&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加载了过多的数据，导致产生了很多的大对象&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;产生了过多的对象，GC回收过于频繁（如：字符串拼接）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于上面的情况，难点不是优化代码，难点在于定位到问题的所在，下面我们就用Dump抓包的方式来定位到问题的所在。介绍这个内容之前，我们要先回顾下.Net中垃圾回收的基础知识和一个工具的准备。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;ji-chu-zhi-shi&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ji-chu-zhi-shi&quot; aria-label=&quot;Anchor link for: ji-chu-zhi-shi&quot;&gt;基础知识&lt;/a&gt;&lt;/h3&gt;
&lt;hr /&gt;
&lt;h4 id=&quot;la-ji-hui-shou-hong-fa-tiao-jian&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-ji-hui-shou-hong-fa-tiao-jian&quot; aria-label=&quot;Anchor link for: la-ji-hui-shou-hong-fa-tiao-jian&quot;&gt;垃圾回收触发条件&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;代码显示调用System.GC的静态方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;windows报告低内存情况&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CLR正在卸载AppDoamin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CLR正在关闭&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;da-dui-xiang-la-ji-hui-shou&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#da-dui-xiang-la-ji-hui-shou&quot; aria-label=&quot;Anchor link for: da-dui-xiang-la-ji-hui-shou&quot;&gt;大对象垃圾回收&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;CLR将对象分为大对象和小对象，认为大于85000字节或者更大的字节是大对象，CLR用不同的方式来对待大对象和小对象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大对象不是在小对象的地址空间分配，而是在进程地址空间和其他地方分配&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC不会压缩大对象，在内存中移动他们的代价过高，但这样会造成地址空间的碎片化，以至于会抛出&lt;strong&gt;OutOfMemeryException&lt;/strong&gt; 异常。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大对象总是在第二代回收。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;gong-ju-zhun-bei&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gong-ju-zhun-bei&quot; aria-label=&quot;Anchor link for: gong-ju-zhun-bei&quot;&gt;工具准备&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://learn.microsoft.com/windows-hardware/drivers/debugger/&quot;&gt;windbg文件&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相关DLL准备clr.dll和sos.dll，(都在对应.Net版本安装目录下面，我的安装目录在C:\Windows\Microsoft.NET\Framework64\v4.0.30319)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个cpu运行的较高的时期的DUMP文件（下面会说如何获取）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;准备测试代码，此处为了演示方便，简单了写了一个有潜在问题的代码：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;  class&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Common&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;    public&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt; static&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; GetList&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;        var&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;        for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt; 10000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;++&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3&quot;&gt;            list&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;Add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;i&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;ToString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; list&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;    public&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt; static&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; GetString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; list&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;        var&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; str&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;        foreach&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; l&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; list&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3&quot;&gt;            str&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; +=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt; string&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;Format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt;&amp;#39;{0}&amp;#39;,&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; l&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;str&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;Length&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt; 0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3&quot;&gt;            str&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;Remove&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;str&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;Length&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; str&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们知道在字符串的拼接的时候，每一个字符串都是一个对象，拼接后又产生了一个新对象，所以在GetString这个方法中会有大量的GC操作，下面我们就调用下这个代码，看下CPU的情况，为了模拟并发情况，我们开多个标签，每个标签每1s秒中刷新一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/01.png&quot; alt=&quot;CPU&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;zhua-qu-dump&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zhua-qu-dump&quot; aria-label=&quot;Anchor link for: zhua-qu-dump&quot;&gt;抓取Dump&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在任务管理器中选择应用程序池对应的w3wp.exe，右击--&amp;gt;创建转储文件。创建完成后，会提示出指定的路径&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/02.png&quot; alt=&quot;taskManger&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/03.png&quot; alt=&quot;taskManger&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据上面的步骤，我们准备我们分析的文件如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/04.png&quot; alt=&quot;dumpfile&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;fen-xi-dump&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fen-xi-dump&quot; aria-label=&quot;Anchor link for: fen-xi-dump&quot;&gt;分析Dump&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;打开windbg，加载对应的dump文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/05.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
&lt;img src=&quot;/img/cpu-high-dump/06.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置Sysmbol，添加&quot;cache&lt;em&gt;c:\mysymbol;srv&lt;/em&gt;http://msdl.microsoft.com/download/symbols&quot;&lt;br /&gt;
&lt;img src=&quot;/img/cpu-high-dump/07.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
&lt;img src=&quot;/img/cpu-high-dump/08.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;load sos.dll和clr.dll，命令如下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.load D:\windbg\sos.dll &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.load D:\windbg\clr.dll&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行命令!threadpool 显示有关托管线程池的信息，其它一些&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://docs.microsoft.com/zh-cn/dotnet/framework/tools/sos-dll-sos-debugging-extension&quot;&gt;SOS 调试扩展命令&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/09.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行!runaway 查询cpu占用时长比较长的几个线程Id&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/10.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行~22s (进入线程查看),kb(查看对应的调用)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/11.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行~* kb 查看所有线程的堆栈调用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/12.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在上面搜索GC和大对象出现的线程 （ctrl+f搜索：GarbageCollectGeneration和allocate_large_object ）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/13.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以看到定位触发GC的线程是31号线程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行命令~31s 进入31线程，再运行!clrstack查看堆栈调用，最终可以定位到出问题的代码，是由于字符串的拼接导致大量的对象产生，从而触发了GC。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cpu-high-dump/14.png&quot; alt=&quot;dumpOpen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
