<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          聊一聊GC日志,線程轉(zhuǎn)儲和堆轉(zhuǎn)儲

          共 5222字,需瀏覽 11分鐘

           ·

          2021-04-02 15:59

          須彌零一

          聊一聊GC日志,線程轉(zhuǎn)儲和堆轉(zhuǎn)儲

          一般情況下,我們可以通過Java虛擬機(jī)(Java Virtual Machine,JVM)生成的如下三個關(guān)鍵文件來進(jìn)行產(chǎn)品的性能優(yōu)化,或者是解決一些生產(chǎn)問題。

          ?垃圾收集(Garbage collection,GC)日志?線程轉(zhuǎn)儲(Thread dump)?堆轉(zhuǎn)儲(Heap dump)

          那么這三個文件都是什么呢?別傻傻分不清楚了,下面就來對比一下這三個文件都是干啥的。

          介些都是些啥東東

          GC日志

          GC日志包含了垃圾收集事件的相關(guān)信息,比如:”發(fā)生了多少次GC事件“,”這些各自是什么類型的GC事件(比如,年輕代GC或完整GC)“,”每個GC事件將應(yīng)用暫停了多長時間“,”每個GC事件回收了多少對象“。

          線程轉(zhuǎn)儲

          線程轉(zhuǎn)儲是一個運(yùn)行中的應(yīng)用在某一個時刻的所有線程的快照,它包含了應(yīng)用中的每一個線程的所有信息。比如:線程狀態(tài),線程ID,原生ID,線程名稱,線程棧信息,線程優(yōu)先級。

          堆轉(zhuǎn)儲

          堆轉(zhuǎn)儲是一個運(yùn)行中的應(yīng)用在某一個時刻的內(nèi)存快照,它同樣也包含了很多信息。比如:內(nèi)存中都有那些對象,這些對象的當(dāng)前值,對象的大小,對象的引用關(guān)系。

          來!出來亮個相

          是騾子是馬拉出來遛遛!下面各舉個例子先讓大家看看這幾個東東都長什么樣子,消除一下神秘感。

          GC日志

          2021-04-01T12:32:24.398+0800: 0.356: [GC pause (G1 Evacuation Pause) (young), 0.0215287 secs]   [Parallel Time: 20.0 ms, GC Workers: 8]      [GC Worker Start (ms): Min: 355.9, Avg: 356.3, Max: 358.4, Diff: 2.4]      [Ext Root Scanning (ms): Min: 0.0, Avg: 6.4, Max: 16.7, Diff: 16.7, Sum: 51.4]      [Update RS (ms): Min: 0.0, Avg: 1.0, Max: 2.5, Diff: 2.5, Sum: 8.2]         [Processed Buffers: Min: 0, Avg: 1.1, Max: 5, Diff: 5, Sum: 9]      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1]      [Object Copy (ms): Min: 2.9, Avg: 11.9, Max: 17.5, Diff: 14.6, Sum: 95.3]      [Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.9]         [Termination Attempts: Min: 1, Avg: 2.5, Max: 5, Diff: 4, Sum: 20]      [GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.5]      [GC Worker Total (ms): Min: 17.5, Avg: 19.6, Max: 19.9, Diff: 2.4, Sum: 156.5]      [GC Worker End (ms): Min: 375.8, Avg: 375.9, Max: 375.9, Diff: 0.1]   [Code Root Fixup: 0.0 ms]   [Code Root Purge: 0.0 ms]   [Clear CT: 0.5 ms]   [Other: 1.0 ms]      [Choose CSet: 0.0 ms]      [Ref Proc: 0.4 ms]      [Ref Enq: 0.0 ms]      [Redirty Cards: 0.4 ms]      [Humongous Register: 0.0 ms]      [Humongous Reclaim: 0.0 ms]      [Free CSet: 0.0 ms]   [Eden: 12.0M(12.0M)->0.0B(14.0M) Survivors: 0.0B->2048.0K Heap: 12.6M(252.0M)->7848.3K(252.0M)] [Times: user=0.08 sys=0.00, real=0.02 secs] 

          線程轉(zhuǎn)儲

          "HeavyThread" #11 prio=5 os_prio=0 tid=0x000001885e78f000 nid=0x2e3c runnable [0x0000001b443fe000]   java.lang.Thread.State: RUNNABLE    at java.io.FileOutputStream.writeBytes(Native Method)    at java.io.FileOutputStream.write(Unknown Source)    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)    at java.io.BufferedOutputStream.flush(Unknown Source)    - locked <0x00000006c1407098> (a java.io.BufferedOutputStream)    at java.io.PrintStream.write(Unknown Source)    - locked <0x00000006c1406a90> (a java.io.PrintStream)    at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)    at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)    at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)    - locked <0x00000006c14201b0> (a java.io.OutputStreamWriter)    at java.io.OutputStreamWriter.flushBuffer(Unknown Source)    at java.io.PrintStream.newLine(Unknown Source)    - eliminated <0x00000006c1406a90> (a java.io.PrintStream)    at java.io.PrintStream.println(Unknown Source)    - locked <0x00000006c1406a90> (a java.io.PrintStream)    at com.jeremy.tech.lab.CPULoadTester$HeavyLoadTask.run(CPULoadTester.java:13)    at java.lang.Thread.run(Unknown Source)

          堆轉(zhuǎn)儲

          堆轉(zhuǎn)儲文件為二進(jìn)制格式,并且通常較大,這里就不舉例子了。除此之外,堆轉(zhuǎn)儲格式相關(guān)文檔少的可憐。因此,我們必須借助堆轉(zhuǎn)儲分析工具來分析和理解這玩意。

          這些文件都用在什么場景

          GC日志

          垃圾收集日志用于優(yōu)化GC暫停時間,用于確定應(yīng)用程序的最佳內(nèi)存大小,還用于解決與內(nèi)存相關(guān)的問題。

          線程轉(zhuǎn)儲

          線程轉(zhuǎn)儲主要用于解決生產(chǎn)問題,例如CPU尖峰,應(yīng)用程序無響應(yīng),響應(yīng)時間差,線程掛起,內(nèi)存消耗高。

          內(nèi)存轉(zhuǎn)儲

          堆轉(zhuǎn)儲主要用于解決與內(nèi)存相關(guān)的OutOfMemoryError問題。

          我怎么獲取這些文件呢

          GC日志

          使用如下的JVM參數(shù)可以生成垃圾收集日志:

          ?java 8及以前版本

          -XX:+PrintGCDetails-XX:+PrintGCDateStamps-Xloggc:<file-path>

          ?java 9及以后版本

          -Xlog:gc*:file=<file-path>

          注:<file-path>為垃圾收集日志的生成文件路徑

          線程轉(zhuǎn)儲

          線程轉(zhuǎn)儲捕獲的方法比較多,后面有時間了再展開說說,這里說個一般方法。通常情況下,我們使用 jstack 工具來獲取線程轉(zhuǎn)儲, jstack 在 JDK_HOME\bin 目錄下。線程轉(zhuǎn)儲文件可以用如下方式獲?。?/section>
          jstack -l <pid> > <file-path>

          注:<pid>為應(yīng)用進(jìn)程號;<file-path>為線程轉(zhuǎn)儲文件生成的文件路徑

          堆轉(zhuǎn)儲

          同樣,堆轉(zhuǎn)儲獲取的方法也比較多,后面有空再細(xì)說。通常情況下,我們使用 jmap 工具來獲取堆轉(zhuǎn)儲, jmap 在 JDK_HOME/bin 目錄下。獲取堆轉(zhuǎn)儲文件用以下方法即可:
          jmap -dump:format=b,file=<file-path> <pid>

          注:<pid>為應(yīng)用進(jìn)程號;<file-path>為堆轉(zhuǎn)儲文件生成的文件路徑

          分析工具

          GC日志

          ?Gceasy (https://gceasy.io/)?IBM GC & Memory visualizer (https://www.ibm.com/support/pages/java-sdk-monitoring-and-post-mortem)?HP Jmeter (https://myenterpriselicense.hpe.com/cwp-ui/free-software/HPJMETER)?Google Garbage Cat (https://code.google.com/archive/a/eclipselabs.org/p/garbagecat)

          線程轉(zhuǎn)儲

          ?fastThread (https://fastthread.io/)?Samurai (https://github.com/yusuke/samurai)?IBM Thread & Monitor analyzer (https://www.ibm.com/support/pages/java-sdk-monitoring-and-post-mortem)?Visual VM (https://visualvm.github.io/)

          堆轉(zhuǎn)儲

          ?Eclipse MAT (https://www.eclipse.org/mat/)?HeapHero (https://heaphero.io/)?JVisualVM (https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jvisualvm.html)

          最后

          本篇主要是一個偏科普性質(zhì)的文章,從幾個不同的出發(fā)點(diǎn)比較了GC日志、線程轉(zhuǎn)儲文件、堆轉(zhuǎn)儲文件。平時在性能優(yōu)化和問題處理的過程中必然少不了會用到這些。當(dāng)然在分析的過程中的除過使用上面列出來的工具之外,還是需要您具備一定程度的JVM知識,要不然工具跑完之后也看不出來個所以然。
          最好的辦法是自己動手實(shí)踐一下,從上面列出來的工具中找一個自己最順手的出來,后面就會事半功倍!
          ---- END ----



          歡迎關(guān)注我的公眾號“須彌零一”,原創(chuàng)技術(shù)文章第一時間推送。


          瀏覽 128
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区=区三区四区 视频 | 超碰97色 | 99在线视频在线 | 国产区精品豆花在线 | 九九热精品视频在线观看 |