日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java內存溢出案例模擬和原理分析過程

瀏覽:232日期:2022-09-03 10:58:53

在JVM虛擬機規范中,Java虛擬機運行時數據區域除了程序計數器(Program Counter Register)外都有可能出現OutOfMemoryError的情況,使用Hotspot虛擬機簡單的模擬堆棧內存溢出的場景,方便快速定位是什么區域的內存溢出。

通過VM參數設置Java堆的大小,避免堆可擴展內存(設定-Xms和Xmx一樣可避免堆自動擴展);

通過設定-XX:+HeapDumpOnOutOf-MemoryError可以讓虛擬機在出現內存溢出異常的時候Dump出當前的內存堆轉儲快照。

/** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * @author Vicente * @version 1.0 * @date 2020/4/5 10:28 */public class TestHeapOOM { public static void main(String[] args) { List<TestHeapOOM> list = new ArrayList<TestHeapOOM>(); while (true) { list.add(new TestHeapOOM()); } }}

設置啟動參數:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

運行結果:

java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid3676.hprof ... Heap dump file created [28279988 bytes in 0.099 secs] Exception in thread 'main' java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:265) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231) at java.util.ArrayList.add(ArrayList.java:462) at com.oom.TestHeapOOM.main(TestHeapOOM.java:19)

使用IDEA和Eclipse都可以設置啟動時的參數。

堆轉儲快照文件一般生成后位于你的work space,拿到文件后要對快照文件進行分析,可以采用不同的工具來幫助我們分析,這里推薦兩種:

jhat

在IDEA或者Eclispe的終端控制臺直接輸入命令

jhat java_pid13232.hprof

當dump的文件過大時需要設置jhat參數:jhat -J-Xmx2048m java_pid13232.hprof,默認-Xmx為1024

對堆快照進行分析

Reading from java_pid13232.hprof...Dump file created Sun Apr 05 10:54:06 CST 2020Snapshot read, resolving...Resolving 818818 objects...Chasing references, expect 163 dots................................................................................................................Eliminating duplicate references..........................................................................................................Snapshot resolved.Started HTTP server on port 7000Server is ready.

通過訪問http://localhost:7000即可查看分析結果,對象內存分配的大小等信息。

mat

工具下載地址:https://eclipse.org/mat/downloads.php,選擇需要下載的版本,windows版本下載后是一個壓縮包,直接解壓運行即可。

打開需要分析的堆轉儲文件,分析后會展示一個概要預覽Java內存溢出案例模擬和原理分析過程

Leak Suspects » Leaks » Problem Suspect 在這里面可以看到對象的個數,對象占用大小等信息,這里包含兩個重要信息

Java內存溢出案例模擬和原理分析過程

Generally speaking, shallow heap of an object is its size in the heap and retained size of the same object is the amount of heap memory that will be freed when the object is garbage collected.

具體解釋可以參考:https://help.eclipse.org/2020-03/index.jsp

復制代碼 代碼如下:- Shallow Heap:某個對象自身大小,不包含其引用對象的大小;- Retained Heap:某個對象在發生GC回收時,如果被釋放,其釋放內存的大小,這就要包含其引用的對象占用堆內存的大小。

這里具體使用就不再描述,可以參考官方文檔。

Java運行時數據區包含虛擬機棧和本地方法棧,在Hotspot虛擬機實現中對于本地方法棧的參數(-Xoss)設定并無實際效果,只通過-Xss參數來模擬棧的內存溢出。《Java虛擬機規范》中指出:

如果線程請求的棧深度大于虛擬機所允許的最大深度,拋出StackOverflowError異常如果虛擬機的棧內存允許動態擴展,當擴展棧容量無法申請到足夠的內存時,拋出OutOfMemoryError異常

設置運行參數VM Args:-Xss128k

/** * VM Args:-Xss128k * @author Vicente * @version 1.0 * @date 2020/4/5 12:39 */public class TestStackOverflow { private int stackLength = 1; public void stackLeak() { stackLength++; stackLeak(); } public static void main(String[] args) throws Throwable { TestStackOverflow overflow = new TestStackOverflow(); try { overflow.stackLeak(); } catch (Throwable e) { System.out.println('stack length:' + overflow.stackLength); throw e; } }}

運行結果:

Exception in thread 'main' java.lang.StackOverflowErrorat com.oom.TestStackOverflow.stackLeak(TestStackOverflow.java:17)at com.oom.TestStackOverflow.stackLeak(TestStackOverflow.java:17)//省略...stack length:36984//省略...

根據操作系統的不同和Java虛擬機版本的不同,棧容量的最小值也會有所不同,改變棧容量的大小或者棧幀過大時都會導致StackOverflowError異常。

Hotspot虛擬機不支持擴展棧內存,除非在創建線程申請內存就不足會導致OutOfMemoryError異常,其他情況都是在運行時因為棧容量無法容納新的棧幀而導致StackOverflowError異常。

不同的虛擬機實現有著不同的細節處理,其他虛擬機實現如果是可擴容棧空間,棧容量不足時會拋出OutOfMemoryError異常,當遇到OutOfMemoryError時要先判斷是棧空間還是堆內存的異常。

方法區

在JDK6之前的Hotspot虛擬機中方法區被設置在永久代中,運行時常量池也屬于方法區的一部分,可以通過-XX:PermSize和-XX:MaxPermSize限制永久代的大小,在JDK7開始逐步的去永久代,到了JDK8就開始使用元空間(meta-space)來實現方法區,保存程序運行時的數據。

使用JDK6,設定永久代參數-XX:PermSize=2M -XX:MaxPermSize=2M

public class TestConstantPoolOOM { public static void main(String[] args) throws Throwable { //使用Set保持著常量池引用,避免Full GC回收常量池行為 Set<String> set = new HashSet<String>(); // 在short范圍內足以讓6MB的PermSize產生OOM了 short i = 0; while (true) { set.add(String.valueOf(i++).intern()); //String.valueOf(i++).intern(); } }}

運行結果:

Exception in thread 'main' java.lang.OutOfMemoryError: PermGen spaceat java.lang.String.intern(Native Method)at com.oom.TestConstantPoolOOM.main(TestConstantPoolOOM.java from InputFileObject:21)

可以看到OutOfMemoryError后面指明了內存溢出的位置PermGen space;在JDK8中使用-XX:MaxMeta-spaceSize參數把方法區容量同樣限制,也不會出現異常,因為從JDK7開始常量池已經從永久代移到了Java堆的位置,此時限制Java堆的大小便會拋出異常,定位異常的位置。

設置上面代碼的運行參數:-Xms6m -Xmx6m

運行結果:

Exception in thread 'main' java.lang.OutOfMemoryError: Java heap spaceat java.util.HashMap.resize(HashMap.java:704)at java.util.HashMap.putVal(HashMap.java:663)at java.util.HashMap.put(HashMap.java:612)at java.util.HashSet.add(HashSet.java:220)at com.oom.TestConstantPoolOOM.main(TestConstantPoolOOM.java:20)

可以看到,程序運行拋出java.lang.OutOfMemoryError異常。

方法區的異常也是一種常見異常,一個類被垃圾回收期回收的條件是比較苛刻的,在經常運行時生成大量動態類的應用場景里,就應該特別關注這些類的回收狀況,比如傳統項目中大量的jsp文件,jsp會被編譯成Java類,容易拋出方法區異常,在JDK8以后永久代不再存在,元空間的出現使得,正常創建對象的過程很難出現方法區的內存溢出,不過Hotspot也提供了一些參數設置保護元空間。

- XX:MaxMetaspaceSize:設置元空間最大值,默認是-1,即不限制,或者說只受限于本地內存大小。- XX:MetaspaceSize:指定元空間的初始空間大小,以字節為單位,達到該值就會觸發垃圾收集,收集器會對該值進行調整:如果釋放大量的空間,適當降低該值;如果釋放了很少的空間,在不超過-XX:MaxMetaspaceSize(如果設置了的話)的情況下,適當提高該值。- XX:MinMetaspaceFreeRatio:作用是在垃圾收集之后控制最小的元空間剩余容量的百分比,可減少因為元空間不足導致的垃圾收集的頻率。- XX:Max-MetaspaceFreeRatio,用于控制最大的元空間剩余容量的百分比。

直接內存

直接內存可以理解為堆外內存,通過參數-XX:MaxDirectMemorySize來設定,如果不設置默認與Java堆內存的最大值相同。NIO會使用直接內存,使用Unsafe類來模擬直接內存溢出的情況。

public class TestDirectMemoryOOM { private static final int _1MB = 1024 * 1024; public static void main(String[] args) throws Exception { Field unsafeField = Unsafe.class.getDeclaredFields()[0]; unsafeField.setAccessible(true); Unsafe unsafe = (Unsafe) unsafeField.get(null); while (true) { unsafe.allocateMemory(_1MB); } }}

運行結果:

Exception in thread 'main' java.lang.OutOfMemoryErrorat sun.misc.Unsafe.allocateMemory(Native Method)at com.oom.TestDirectMemoryOOM.main(TestDirectMemoryOOM.java:24)

當直接內存溢出時,Dump文件并沒有太多錯誤信息,要考慮是否間接使用NIO了。

總結當Java虛擬機拋出OutOfMemoryError錯誤時,判斷是Java內存哪一塊區域拋出的錯誤,定位堆,棧使用工具分析堆轉儲快照,判斷是內存泄漏(Memory Leak)還是內存溢出(Memory Overflow)當發生內存泄漏可以通過工具查看GC Roots引用鏈,分析為什么垃圾回收器無法回收,判定對象創建的位置,是否有可回收對象如果是內存溢出,根據硬件性能是否可以(使用-Xms和-Xmx)擴展堆內存大小,或者從代碼角度去優化

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久91导航| 蜜臀av性久久久久蜜臀aⅴ四虎| 超碰在线99| 欧美激情日韩| 狠狠爱www人成狠狠爱综合网| 欧美日本二区| 亚洲免费一区三区| 99国产精品久久久久久久| 国产美女撒尿一区二区| 欧美~级网站不卡| 国产精品99一区二区三| 91午夜精品| 999视频精品| yellow在线观看网址| 99视频+国产日韩欧美| 97在线精品| 麻豆国产在线| 国产一区二区三区四区五区| 亚洲国产福利| 久久不卡日韩美女| 欧美极品中文字幕| 日韩欧美中文| 激情五月综合网| 中文字幕免费一区二区| 蜜桃免费网站一区二区三区| 婷婷色综合网| 中文字幕日韩亚洲| 亚洲精品一级| 精品国产18久久久久久二百| 久久久久中文| 最新亚洲国产| 麻豆中文一区二区| 高清在线一区| 激情婷婷亚洲| 精品三区视频| 国精品一区二区| 亚洲黄页一区| 国产免费av国片精品草莓男男| 日本一区免费网站| 蜜芽一区二区三区| 日本精品一区二区三区在线观看视频| 蜜臀av在线播放一区二区三区| 久久青草久久| 日韩一区欧美二区| 97se亚洲| 国产不卡精品| 婷婷激情久久| 亚洲欧洲日本mm| 喷白浆一区二区| 国产精品欧美一区二区三区不卡| 婷婷综合六月| 日韩极品在线观看| 欧美激情另类| 免费人成精品欧美精品 | 国产精品福利在线观看播放| 国产精品精品国产一区二区| 欧美性感美女一区二区| 亚洲狼人精品一区二区三区| 国产精品igao视频网网址不卡日韩| 久久久免费人体| 激情综合亚洲| 国产精品久久国产愉拍| 久久视频国产| 欧美精品影院| 亚洲欧美网站| 国产成人精品亚洲线观看| 国产偷自视频区视频一区二区| 国产精品17p| 亚洲一级大片| 国产精品久久久久久久免费观看| 三级欧美韩日大片在线看| 午夜欧美巨大性欧美巨大| 你懂的亚洲视频| 欧美日韩国产一区精品一区| 91视频精品| 清纯唯美亚洲综合一区| 精品久久中文| 国产高清亚洲| 日韩av中文字幕一区二区三区| 日韩大片在线观看| 美女高潮久久久| 久久激情综合网| 视频一区在线播放| 欧美~级网站不卡| 久久精品亚洲| 麻豆传媒一区二区三区| 国产欧美日韩视频在线| 亚洲人www| 欧美偷窥清纯综合图区| 日韩一级网站| 亚洲综合日韩| 亚洲欧洲一区| 欧美13videosex性极品| 精品视频99| 日本伊人久久| 欧美专区18| 久久国产成人| 久久亚洲国产精品一区二区| 每日更新成人在线视频| 久久青草久久| 91精品成人| 欧美a级一区| 视频一区欧美日韩| 亚洲三级观看| 日本亚洲最大的色成网站www| 欧美专区一区| 精品三级在线观看视频| 欧美日韩国产观看视频| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 99香蕉国产精品偷在线观看| 9国产精品视频| 天堂av一区| 麻豆精品蜜桃视频网站| 日韩精品看片| 免费观看在线综合色| 蜜桃精品视频| 成人精品高清在线视频| 欧美女激情福利| 久久国产视频网| 欧美不卡高清一区二区三区| 蜜臀久久99精品久久久久久9| 国产精品www994| 老司机久久99久久精品播放免费| 欧美一区免费| 精品亚洲美女网站| 日本免费一区二区视频| 国产美女高潮在线观看| 亚洲资源网站| 精品久久中文| 国产精品一区亚洲| 日韩午夜电影| 日韩精品视频中文字幕| 亚洲精品88| 日韩综合小视频| 日韩一级不卡| 日韩精品欧美激情一区二区| 麻豆国产精品视频| 日本视频一区二区| 日韩午夜高潮| 红桃视频亚洲| 久久婷婷一区| 久久国内精品| 亚洲伊人精品酒店| 91精品蜜臀一区二区三区在线| 欧美一区网站| 亚洲激情五月| 国产精久久久| 国产精品日韩精品中文字幕| 日韩精品福利一区二区三区| 亚洲黄页一区| 成人片免费看| 亚洲高清久久| 久久一级电影| 国精品一区二区三区| 久久精品影视| 午夜久久美女| 亚洲尤物在线| 麻豆9191精品国产| 日韩激情啪啪| 日韩亚洲精品在线观看| 麻豆国产精品一区二区三区| av最新在线| 欧美成人基地| 五月天久久网站| 国产精品外国| 日韩一区二区三区精品视频第3页| 一二三区精品| 日韩精品三区四区| 欧美日本久久| 88久久精品| 国产免费播放一区二区| 黑人精品一区| 久久夜色精品| 久久精品系列| 欧美日韩国产探花| 日韩av电影一区| 久久精品av麻豆的观看方式| 国产亚洲精品美女久久 | 欧美经典一区| 一区二区三区视频免费观看| 丝袜亚洲精品中文字幕一区| 欧美日韩va| 欧美国产偷国产精品三区| 亚洲精品一二三区区别| 日本国产一区| 亚洲va中文在线播放免费| 老牛影视一区二区三区| 免费污视频在线一区| 亚洲资源网站| 久久精品亚洲人成影院| 亚洲专区视频| 久久激情婷婷| 国产另类在线| 日韩中文字幕亚洲一区二区va在线| 奇米色欧美一区二区三区| 日韩av首页| 精品视频在线你懂得| 婷婷中文字幕一区| 在线亚洲人成| 久久一区精品|