国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

程序內存溢出問題分析

IT那活兒 / 1916人閱讀
程序內存溢出問題分析
點擊上方“IT那活兒”,關注后了解更多內容,不管IT什么活兒,干就完了?。。?/strong>





場景來源




戶現場有一套重要的業務系統,供業務同事進行使用,但是每連續運行10天都會出現問題,會造成程序慢響應,無響應情況,嚴重影響消費者、使用者的使用體驗,經常得到業務同事反饋,所以配合研發對該問題進行查詢。


該系統硬件服務器性能足夠,但每個重啟周期內內存都是緩慢上升,觀察JVM使用率、系統內存使用率等均是持續上升,未發現有主動進行內存回收,初步懷疑為內存泄漏導致。






初識JVM虛擬機



Java語言是一種計算機編程語言,擁有跨平臺,面向對象,泛型編程的特性,廣泛應用于企業級Web應用的開發和移動應用的開發。
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。
引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。
Java程序是如何實現跨平臺運行的呢?
主要就是通過JVM虛擬機來運行的。





JVM虛擬機的結構




Java虛擬機主要分為五大模塊:


  • 類裝載器子系統
  • 運行時數據區
  • 執行引擎
  • 本地方法接口
  • 垃圾收集模塊
其中垃圾收集模塊在Java虛擬機規范中并沒有要求Java虛擬機垃圾收集,但是在沒有發明無限的內存之前,大多數JVM實現都是有垃圾收集的。而運行時數據區都會以某種形式存在于每一個JAVA虛擬機實例中,但是Java虛擬機規范對它的描述卻是相當抽象。
這些運行時數據結構上的細節,大多數都由具體實現的設計者決定。
當我們程序運行后會申請內存空間,其中java棧本地方法棧,程序計算器是JVM虛擬機自動管理的,我們可以管理的區域是堆區和方法區,經常說的java內存調優調的就是這兩個區域。




常見的內存溢出




現象一:


java.lang.OutOfMemoryError: Java heap space
該報錯為堆溢出,這種場景最為常見,主要原因可能有:
  • 代碼中可能存在大對象分配。

  • 可能存在內存泄露,導致在多次GC之后,還是無法找到一塊足夠大的內存容納當前對象。

解決方法:
  • 檢查是否存在大對象的分配,最有可能的是大數組分配。

  • 如果沒有找到明顯的內存泄露,可以臨時 -Xmx 加大堆內存。

  • 還有一點容易被忽略,檢查是否有大量的自定義的 Finalizable 對象,也有可能是框架內部提供的,考慮其存在的必要性。

現象二:

java.lang.OutOfMemoryError: PermGen 
spacejava.lang.OutOfMemoryError: Metaspace
永久代是 HotSot 虛擬機對方法區的具體實現,存放了被虛擬機加載的類信息、常量、靜態變量、JIT編譯后的代碼等。
JDK8后,元空間替換了永久代,元空間使用的是本地內存。該報錯為永久代/元空間溢出,可能原因有如下幾種:
  • 在Java7之前,頻繁的錯誤使用String.intern()方法 。

  • 運行期間生成了大量的代理類,導致方法區被撐爆,無法卸載 。

  • 應用長時間運行,沒有重啟。

解決方法:
  • 檢查是否永久代空間或者元空間設置的過小。

  • 檢查代碼中是否存在大量的反射操作 。

  • dump之后通過mat檢查是否存在大量由于反射生成的代理類。

現象三:

java.lang.OutOfMemoryErrorGC overhead limit exceeded
這是JDK6新加的錯誤類型,一般都是堆太小導致的。
Sun 官方對此的定義:超過98%的時間用來做GC并且回收了不到2%的堆內存時會拋出此異常。
解決方法:
  • 檢查項目中是否有大量的死循環或有使用大內存的代碼,優化代碼。

  • 添加參數 -XX:-UseGCOverheadLimit  禁用這個檢查,其實這個參數解決不了內存問題,只是把錯誤的信息延后,最終出現 java.lang.OutOfMemoryError: Java heap space。

現象四:

java.lang.OutOfMemoryError : unable to create new native Thread


出現這種異常,基本上都是創建的了大量的線程導致的,以前碰到過一次,通過jstack出來一共8000多個線程。

解決方法:
  • 通過 -Xss 降低的每個線程棧大小的容量。

  • 線程總數也受到系統空閑內存和操作系統的限制,檢查是否該系統下有此限制:

/proc/sys/kernel/pid_max
    /proc/sys/kernel/thread-max
    maxuserprocess(ulimit -u
    /proc/sys/vm/maxmapcount
現象五:
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
這種情況一般是由于不合理的數組分配請求導致的,在為數組分配內存之前,JVM 會執行一項檢查。要分配的數組在該平臺是否可以尋址(addressable),如果不能尋址(addressable)就會拋出這個錯誤。
解決方法:
檢查你的代碼中是否有創建超大數組的地方。
現象六:
java.lang.OutOfMemoryError: Out of swap space
這種情況一般是操作系統導致的,可能的原因有:
  • swap 分區大小分配不足。

  • 其他進程消耗了所有的內存。

解決方案:
  • 其它服務進程可以選擇性的拆分出去 。

  • 加大swap分區大小,或者加大機器內存大小。





緊急處理方法



程序掛掉運維層面可以從系統message日志中查看是否有OOM殺掉進程報錯;如果有第一現場,在條件允許的情況下,可以dump內存使用情況,通過工具分析可以更直觀的了解內存具體使用到了那些地方。
當然,如果能確認為內存溢出情況,萬能重啟大法可以先臨時解決供業務恢復,等代碼修復上線后再從根本上修復問題。



本文作者:臧二飛

本文來源:IT那活兒(上海新炬王翦團隊)

???

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129551.html

相關文章

  • JVM問題情景分析

    摘要:問題分析之死鎖產生死鎖必須同時滿足以下四個條件互斥條件一段時間內某資源只能被一個線程進程占有,若有其他請求線程只能等待。問題分析之內存泄露內存溢出堆內存溢出內存泄露指的是申請內存后無法釋放該內存。 問題分析之死鎖 產生死鎖必須同時滿足以下四個條件: 互斥條件:一段時間內某資源只能被一個線程(進程)占有,若有其他請求線程只能等待。 不剝奪條件:一個線程占用某資源后只能該線程自己釋放資...

    SnaiLiu 評論0 收藏0
  • 關于JVM內存溢出的原因分析及解決方案探討

    摘要:內存溢出分配的內存空間超過系統內存。內存泄漏的原因分析由大塊組成堆,棧,本地方法棧,程序計數器,方法區。內存溢出的原因分析內存溢出是由于沒被引用的對象垃圾過多造成沒有及時回收,造成的內存溢出。小結棧內存溢出程序所要求的棧深度過大導致。 showImg(https://segmentfault.com/img/bVbweuq?w=563&h=300); 前言:JVM中除了程序計數器,其他...

    xuexiangjys 評論0 收藏0
  • Java內存溢出(OutOfMemoryError)

    摘要:那就只能是處理的數據超過了堆區內存上限,按照這個猜測往下分析。主要暴增對象如上圖框出來的地方。符合對象內存一篇文中分析的字節大小。優化自己的程序,使其在運行過程中占用內存盡可能的少。針對異常的具體優化措施。 前言 在正式開始講解關于OutOfMemoryError錯誤之前先來了解下,我在遇到這個異常的背景。 對數據充滿敬畏之心 我需要對hive中的數據進行批量操作處理,對于沒有了解過h...

    calx 評論0 收藏0
  • Java 內存結構備忘錄

    摘要:本文詳細描述了堆內存模型,垃圾回收算法以及處理內存泄露的最佳方案,并輔之以圖表,希望能對理解內存結構有所幫助。該區域也稱為內存模型的本地區。在中,內存泄露是指對象已不再使用,但垃圾回收未能將他們視做不使用對象予以回收。 本文詳細描述了 Java 堆內存模型,垃圾回收算法以及處理內存泄露的最佳方案,并輔之以圖表,希望能對理解 Java 內存結構有所幫助。原文作者 Sumith Puri,...

    wow_worktile 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<