<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>

          Linux性能優(yōu)化:內(nèi)存使用情況分析

          共 7023字,需瀏覽 15分鐘

           ·

          2021-04-06 09:22

          點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

            作者 |  不羈的羅恩

          來源 |  urlify.cn/I3a2M3

          76套java從入門到精通實戰(zhàn)課程分享

          什么是內(nèi)存

          內(nèi)存(Memory)是計算機的重要部件之一,也稱內(nèi)存儲器和主存儲器,它用于暫時存放CPU中的運算數(shù)據(jù),與硬盤等外部存儲器交換的數(shù)據(jù)

          它是外存與CPU進行溝通的橋梁,計算機中所有程序的運行都在內(nèi)存中進行,內(nèi)存性能的強弱影響計算機整體發(fā)揮的水平。

          只要計算機開始運行,操作系統(tǒng)就會把需要運算的數(shù)據(jù)從內(nèi)存調(diào)到CPU中進行運算,當(dāng)運算完成,CPU將結(jié)果傳送出來。

          內(nèi)存的運行也決定計算機整體運行快慢的程度。

          Linux內(nèi)存回收機制

          為啥要回收:

          • 內(nèi)核需要為任何時刻突發(fā)到來的內(nèi)存申請?zhí)峁┳銐虻膬?nèi)存,以便cache的使用和其他相關(guān)內(nèi)存的使用不至于讓系統(tǒng)的剩余內(nèi)存長期處于很少的狀態(tài)。

          • 當(dāng)真的有大于空閑內(nèi)存的申請到來的時候,會觸發(fā)強制內(nèi)存回收。

          內(nèi)存回收針對的目標(biāo)有兩種,一種是針對zone的,另一種是針對一個memcg的,把針對zone的內(nèi)存回收方式分為三種,分別是快速內(nèi)存回收、直接內(nèi)存回收、kswapd內(nèi)存回收。

          查看Linux內(nèi)存情況

          查看/proc/meminfo

          [root@test ~]# cat /proc/meminfo
          MemTotal:       16166688 kB
          MemFree:        14051412 kB
          MemAvailable:   14772588 kB
          Buffers:            2116 kB
          Cached:          1073260 kB
          SwapCached:            0 kB
          Active:           770384 kB
          Inactive:         698264 kB
          Active(anon):     450156 kB
          Inactive(anon):    76748 kB
          Active(file):     320228 kB
          Inactive(file):   621516 kB
          Unevictable:           0 kB
          Mlocked:               0 kB
          SwapTotal:      33554428 kB
          SwapFree:       33554428 kB
          Dirty:               476 kB
          Writeback:             0 kB
          AnonPages:        393328 kB
          Mapped:           153828 kB
          Shmem:            133628 kB
          Slab:             246448 kB
          SReclaimable:     133892 kB
          SUnreclaim:       112556 kB
          KernelStack:       13472 kB
          PageTables:        30496 kB
          NFS_Unstable:          0 kB
          Bounce:                0 kB
          WritebackTmp:          0 kB
          CommitLimit:    41637772 kB
          Committed_AS:    4257776 kB
          VmallocTotal:   34359738367 kB
          VmallocUsed:      320696 kB
          VmallocChunk:   34350426108 kB
          HardwareCorrupted:     0 kB
          AnonHugePages:    155648 kB
          CmaTotal:              0 kB
          CmaFree:               0 kB
          HugePages_Total:       0
          HugePages_Free:        0
          HugePages_Rsvd:        0
          HugePages_Surp:        0
          Hugepagesize:       2048 kB
          DirectMap4k:      279276 kB
          DirectMap2M:     6965248 kB
          DirectMap1G:    11534336 kB

          使用free命令查看

          [root@test ~]# free -h
                        total        used        free      shared  buff/cache   available
          Mem:            15G        874M         13G        130M        1.2G         14G
          Swap:           31G          0B         31G

          參數(shù)說明:

          • total:總內(nèi)存大小。

          • used:已經(jīng)使用的內(nèi)存大小(這里面包含cached和buffers和shared部分)。

          • free:空閑的內(nèi)存大小。

          • shared:進程間共享內(nèi)存(一般不會用,可以忽略)。

          • buffers:內(nèi)存中寫完的東西緩存起來,這樣快速響應(yīng)請求,后面數(shù)據(jù)再定期刷到磁盤上。

          • cached:內(nèi)存中讀完緩存起來內(nèi)容占的大小(這部分是為了下次查詢時快速返回)。

          • available:還可以被應(yīng)用程序使用的物理內(nèi)存大小,和free的區(qū)別是,free是真正未被使用的內(nèi)存,available是包括buffers、cached的。

          • Swap:硬盤上交換分區(qū)的使用大小。

          Buffer和Cache

          Cache(緩存),為了調(diào)高CPU和內(nèi)存之間數(shù)據(jù)交換而設(shè)計,Buffer(緩沖)為了提高內(nèi)存和硬盤(或其他I/O設(shè)備的數(shù)據(jù)交換而設(shè)計)。

          Cache主要是針對讀操作設(shè)計的,不過Cache概念可能容易混淆,我理解為CPU本身就有Cache,包括一級緩存、二級緩存、三級緩存,我們知道CPU所有的指令操作對接的都是內(nèi)存,而CPU的處理能力遠(yuǎn)高于內(nèi)存速度,所以為了不讓CPU資源閑置,Intel等公司在CPU內(nèi)部集成了一些Cache,但畢竟不能放太多電路在里面,所以這部分Cache并不是很大,主要是用來存放一些常用的指令和常用數(shù)據(jù),真正大部分Cache的數(shù)據(jù)應(yīng)該是占用內(nèi)存的空間來緩存請求過的數(shù)據(jù),即上面的Cached部分(這部分純屬個人理解,正確與否有待考證)。

          Buffer主要是針對寫操作設(shè)計的,更細(xì)的說是針對內(nèi)存和硬盤之間的寫操作來設(shè)計的,目的是將寫的操作集中起來進行,減少磁盤碎片和硬盤反復(fù)尋址過程,提高性能。

          在Linux系統(tǒng)內(nèi)部有一個守護進程會定期清空Buffer中的內(nèi)容,將其寫入硬盤內(nèi),當(dāng)手動執(zhí)行sync命令時也會觸發(fā)上述操作。

          Swap

          雖然現(xiàn)在的內(nèi)存已經(jīng)變得非常廉價,但是swap仍然有很大的使用價值,合理的規(guī)劃和使用swap分區(qū),對系統(tǒng)穩(wěn)定運行至關(guān)重要。

          Linux下可以使用文件系統(tǒng)中的一個常規(guī)文件或者一個獨立分區(qū)作為交換空間使用。同時linux允許使用多個交換分區(qū)或者交換文件。

          內(nèi)存泄漏和內(nèi)存溢出

          內(nèi)存溢出(OOM,out of memory),是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出。

          內(nèi)存泄露(memory leak),是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會被占光。

          如何判斷內(nèi)存泄露

          用 jstat -gcutil PID,觀察Old這個參數(shù),如果每次執(zhí)行完FULLGC之后Old區(qū)的值一次比一次升高,就可以判斷為發(fā)生了內(nèi)存泄漏。

          如何判斷內(nèi)存溢出

          Heap Dump(堆轉(zhuǎn)儲文件)它是一個Java進程在某個時間點上的內(nèi)存快照。Heap Dump是有著多種類型的。不過總體上heap dump在觸發(fā)快照的時候都保存了java對象和類的信息。通常在寫heap dump文件前會觸發(fā)一次FullGC,所以heap dump文件中保存的是FullGC后留下的對象信息。

          通過設(shè)置如下的JVM參數(shù),可以在發(fā)生OutOfMemoryError后獲取到一份HPROF二進制Heap Dump文件:

          -XX:+HeapDumpOnOutOfMemoryError

          生成的文件會直接寫入到工作目錄。

          注意:該方法需要JDK5以上版本。

          轉(zhuǎn)存堆內(nèi)存信息后,需要對文件進行分析,從而找到OOM的原因??梢允褂靡韵路绞剑?/span>

          mat:eclipse memory analyzer, 基于eclipse RCP的內(nèi)存分析工具。具體使用參考:http://www.eclipse.org/mat/

          jhat:JDK自帶的java heap analyze tool,可以將堆中的對象以html的形式顯示出來,包括對象的數(shù)量,大小等等,并支持對象查詢語言O(shè)QL,分析相關(guān)的應(yīng)用后,可以通過http://localhost:7000來訪問分析結(jié)果。不推薦使用。

          OOM常見原因及解決方案

          可參考高手總結(jié)的9種 OOM 常見原因及解決方案

          釋放內(nèi)存

          在Linux系統(tǒng)下,我們一般不需要去釋放內(nèi)存,因為系統(tǒng)已經(jīng)將內(nèi)存管理的很好。但是凡事也有例外,有的時候內(nèi)存會被緩存占用掉,導(dǎo)致系統(tǒng)使用SWAP空間影響性能,例如當(dāng)你在linux下頻繁存取文件后,物理內(nèi)存會很快被用光,當(dāng)程序結(jié)束后,內(nèi)存不會被正常釋放,而是一直作為caching。此時就需 要執(zhí)行釋放內(nèi)存(清理緩存)的操作了。

          釋放內(nèi)存操作:

          sync  # 強制將內(nèi)存中的緩存寫入磁盤

          echo 數(shù)字 > /proc/sys/vm/drop_caches #數(shù)字可以是0-3的整數(shù)

          數(shù)字含義:

          • 0:不釋放(系統(tǒng)默認(rèn)值)

          • 1:釋放頁緩存

          • 2:釋放dentries和inodes

          • 3:釋放所有緩存




          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長按上方微信二維碼 2 秒


          感謝點贊支持下哈 

          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  粉嫩小泬BBBB免费观看 | 天天久久夜夜一起射 | 日日夜夜精品 | 日本无码高潮 | 国产极度色诱视频在线观看 |