<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>bigfish的网络博客 - 排查</title>
      <link>https://blog.laofu.online</link>
      <description>记录技术和生活</description>
      <generator>Zola</generator>
      <language>zh</language>
      <atom:link href="https://blog.laofu.online/tags/pai-cha/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Mon, 05 Oct 2020 10:00:00 +0800</lastBuildDate>
      <item>
          <title>一个正则表达式导致 CPU 高的问题排查过程</title>
          <pubDate>Mon, 05 Oct 2020 10:00:00 +0800</pubDate>
          <author>bigfish</author>
          <link>https://blog.laofu.online/blog/regex-cpu/</link>
          <guid>https://blog.laofu.online/blog/regex-cpu/</guid>
          <description xml:base="https://blog.laofu.online/blog/regex-cpu/">&lt;p&gt;这篇文章记录一个正则表达是导致 CPU 高的问题排查。由于无法直接使用线上的代码测试，所以我自己把代码整理了下来，具体代码如下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;java&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; AppMain&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-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-8&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;String&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; args&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-8&quot;&gt; throws&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt; InterruptedException&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-2 z-d-8&quot;&gt;		final&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt; String&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; regex&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;^([a-z0-9A-Z]+[-|&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-8&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt;.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-8&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-12 z-d-5&quot;&gt;.)+[a-zA-Z]{2,}$&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-2 z-d-8&quot;&gt;		final&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt; String&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; email&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;blog.laofu.online.fuweilao@vip.qq.com#&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;		for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;int&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 class=&quot;z-l-7 z-d-2&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&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; 1000000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&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&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8&quot;&gt;			Matcher&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; matcher&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; RegexUtils&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;matcher&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;regex&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; email&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-3&quot;&gt;			matcher&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;find&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-3&quot;&gt;			Thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt;10&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-5 z-d-4&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;			matcher.group();&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;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当运行程序的时候，我们可以看到 java 的进程占用了 CPU 了 &lt;code&gt;82.1%&lt;/code&gt;,由于我使用的服务器是 1核+2G, 所以 load avg 占用也很高。&lt;/p&gt;</description>
      </item>
      <item>
          <title>简述 G1 垃圾回收器和 OOM 问题的排查</title>
          <pubDate>Sat, 12 Sep 2020 10:00:00 +0800</pubDate>
          <author>bigfish</author>
          <link>https://blog.laofu.online/blog/g1-oom/</link>
          <guid>https://blog.laofu.online/blog/g1-oom/</guid>
          <description xml:base="https://blog.laofu.online/blog/g1-oom/">&lt;p&gt;最近又碰到的 oom 的问题，一直在尝试定位中，由于现实使用的 G1 的垃圾回收器。所以今天打算线上的排查历程和方案查询出来。&lt;/p&gt;
&lt;h4 id=&quot;jvm-chang-yong-can-shu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jvm-chang-yong-can-shu&quot; aria-label=&quot;Anchor link for: jvm-chang-yong-can-shu&quot;&gt;jvm 常用参数&lt;/a&gt;&lt;/h4&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;-Xmx1024m 最大堆内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-Xms1024m 最小堆内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-Xss256k  设置栈的大小。栈都是每个线程独有一个，所有一般都是几百k的大小。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MetaspaceSize=128m  元空间的大小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxMetaspaceSize=256m  最大元空间大小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxGCPauseMillis=200 设置每次年轻代垃圾回收的最长时间，如果无法满足此时间，JVM会自动调整年轻代大小，以满足此值&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:+UseG1GC 使用 G1 垃圾回收器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:-OmitStackTraceInFastThrow 当一些异常在代码里某个特定位置被抛出很多次的话，HotSpot Server Compiler（C2）会用fast throw来优化这个抛出异常的地方。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MinHeapFreeRatio=30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxHeapFreeRatio=50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxDirectMemorySize=100M 直接内存大小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:+PrintGCDetails 打印 GC 详细信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:+DisableExplicitGC 禁止显示GC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
      <item>
          <title>newFixedThreadPool 线程池导致线程泄漏</title>
          <pubDate>Thu, 21 Feb 2019 10:00:00 +0800</pubDate>
          <author>bigfish</author>
          <link>https://blog.laofu.online/blog/fixed-thread-pool-leak/</link>
          <guid>https://blog.laofu.online/blog/fixed-thread-pool-leak/</guid>
          <description xml:base="https://blog.laofu.online/blog/fixed-thread-pool-leak/">&lt;h3 id=&quot;xian-xiang-wen-ti&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#xian-xiang-wen-ti&quot; aria-label=&quot;Anchor link for: xian-xiang-wen-ti&quot;&gt;现象问题&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最近看到线上的项目线程数过大的报警，开始还是不知道什么原因，因为很多项目都使用同样的线程池管理代码，认为那个项目是偶然的因素造成的，后来经过分析，发现线程数每天都在增加。其他的项目由于发布导致线程会从零开始计算，所以没有那么快达到报警值。  触发报警的代码大概如下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; start&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;true&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-2 z-d-8&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; doSomeThing&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-8&quot;&gt;    ExecutorService&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; executorService&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; Executors&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;newFixedThreadPool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;nThreads&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-8&quot;&gt;    Thread&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; thread&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; Thread&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;z-l-2 z-d-8&quot;&gt; -&amp;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;        while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;start&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;            try&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;                if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;判断能否执行){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3&quot;&gt;                    Thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt;100&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;                    return&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;                executorService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;execute&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;z-l-2 z-d-8&quot;&gt; -&amp;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;                    try&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-5 z-d-4&quot;&gt;                        //&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;....your code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    }&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; e&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 class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    }&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; finally&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;/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 class=&quot;z-l-13 z-d-8&quot;&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; e&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&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&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;    thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;start&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&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-8 z-d-8&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; getMaxThreadCount&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;    return&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&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-8 z-d-8&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; stop&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-2 z-d-2&quot;&gt;    this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;false&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码存在两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;start&lt;/code&gt;是个主线程的变量，在主线程修改值，子线程的&lt;code&gt;while&lt;/code&gt;循环不会停止&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上述代码能够停止，因为在内部调用`Thread.sleep方法，导致线程内的变量刷新&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;newFixedThreadPool&lt;/code&gt; 线程池没有调用shutdown方法，导致线程不会被回收。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;改正方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;start&lt;/code&gt; 设置成线程共享变量&lt;code&gt;volatile&lt;/code&gt;类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在最后调用停止的时候，让线程池进行回收&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;修改后代码如下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;java&quot;&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;volatile&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; boolean&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; start&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;true&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-8&quot;&gt;ExecutorService&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; executorService&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-8&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; thread&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-2 z-d-8&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; doSomeThing&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;    executorService &lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; Executors&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;newFixedThreadPool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;nThreads&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;    thread &lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; Thread&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;z-l-2 z-d-8&quot;&gt; -&amp;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;        while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;start&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;            try&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;                 if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;判断能否执行){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3&quot;&gt;                    Thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt;100&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;                    return&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;                executorService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;execute&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;z-l-2 z-d-8&quot;&gt; -&amp;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;                    try&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-5 z-d-4&quot;&gt;                        //&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;....your code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    }&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; e&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 class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    }&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt; finally&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;/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 class=&quot;z-l-13 z-d-8&quot;&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-10&quot;&gt; e&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&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&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;    thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;start&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&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-8 z-d-8&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; getMaxThreadCount&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;    return&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&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-8 z-d-8&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt; stop&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-2 z-d-2&quot;&gt;    this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;false&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;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;executorService &lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; null&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-3&quot;&gt;        executorService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;shutdown&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-3&quot;&gt;        executorService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;awaitTermination&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;MaxConcurrency&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&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; 3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; TimeUnit&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;SECONDS&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-8 z-d-8&quot;&gt;int&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 class=&quot;z-l-7 z-d-2&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&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; 10&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;executorService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;isTerminated&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&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&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3&quot;&gt;            Thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt;1000&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&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&gt;thread &lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; null&lt;/span&gt;&lt;span class=&quot;z-d-8&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;isAlive&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 class=&quot;z-l-3&quot;&gt;        thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;interrupt&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-3&quot;&gt;        thread&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-2&quot;&gt;2000&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&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zui-hou-de-yi-wen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zui-hou-de-yi-wen&quot; aria-label=&quot;Anchor link for: zui-hou-de-yi-wen&quot;&gt;最后的疑问&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;线程池在最后不使用后，为什么线程没有被释放？GC为什么没有把线程池对象回收？是怎么做到的？&lt;/p&gt;
&lt;p&gt;目前还没有找到问题的答案，等找到后回来更新。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>服务器 CPU 居高不下：一次 Dump 排查历程</title>
          <pubDate>Wed, 27 Sep 2017 10:00:00 +0800</pubDate>
          <author>bigfish</author>
          <link>https://blog.laofu.online/blog/cpu-high-dump/</link>
          <guid>https://blog.laofu.online/blog/cpu-high-dump/</guid>
          <description 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;
</description>
      </item>
    </channel>
</rss>
