老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網站建設、域名注冊、服務器等服務

如何理解Java中的內存溢出問題

這篇文章主要介紹“如何理解Java中的內存溢出問題”,在日常操作中,相信很多人在如何理解Java中的內存溢出問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Java中的內存溢出問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目前創(chuàng)新互聯已為超過千家的企業(yè)提供了網站建設、域名、網站空間、網站運營、企業(yè)網站設計、泊頭網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發(fā)展。

一、內存溢出原因

內存溢出就是內存不夠,引起內存溢出的原因有很多種,常見的有以下幾種:

1、內存中加載的數據量過于龐大,如一次從數據庫取出過多數據;

2、集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;

3、代碼中存在死循環(huán)或循環(huán)產生過多重復的對象實體;

4、使用的第三方軟件中的BUG;

5、啟動參數內存值設定的過小;

當然實際情況中內存溢出的原因就太多了。下面我們就對這些原因分類一下:

以上的圖是基于java7來敘述的,從上面這張圖我們能夠得到如下信息:java虛擬機把內存分為5個模塊。

(1)程序計數器:程序計數器是線程私有的,主要的作用是通過改變這個計數器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。既然每個線程都有一個,那么這些線程的計數器是互不影響的。也不會拋出任何異常。

(2)虛擬機棧和本地方法棧:虛擬機棧描述的是java方法執(zhí)行的內存模型,每個方法在執(zhí)行的時候都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數棧、動態(tài)連接、方法出口等信息。本地方法棧與虛擬機棧的區(qū)別是,虛擬機棧為虛擬機執(zhí)行java方法服務,而本地方法棧則為虛擬機提供native方法服務。

在單線程的操作中,無論是由于棧幀太大,還是虛擬機??臻g太小,當??臻g無法分配時,虛擬機拋出的都是StackOverflowError異常,而不會得到OutOfMemoryError異常。而在多線程環(huán)境下,則會拋出OutOfMemoryError異常。

(3)java堆和方法區(qū):java堆區(qū)主要存放對象實例和數組等,方法區(qū)保存類信息、常量、靜態(tài)變量等等。運行時常量池也是方法區(qū)的一部分。這兩塊區(qū)域是線程共享的區(qū)域,只會拋出OutOfMemoryError。

不知道各位在B站看見過那個面試經典場景沒,在回答java的內存運行數據區(qū)結構時,以上的功能作用是一方面,如果回答時把內存溢出問題添加上是一個極大的加分項。

二、內存溢出實例

1、堆溢出

既然堆是存放實例對象的,那我們就無線創(chuàng)建實例對象。這樣堆區(qū)遲早會滿。

public class HeapOOM {     static class User {}  public static void main(String[] args) {    List list = new ArrayList();          while (true) {              list.add(new User());       }  } } /*Exception in thread "main" java.lang.OutOfMemoryError:  GC overhead limit exceeded  at com.fdd.test.HeapOOM.main(HeapOOM.java:11)*/

因為我提前設置了堆區(qū)內存,所以無限創(chuàng)建就會拋出異常。

2、虛擬機棧和本地方法棧溢出

Java虛擬機規(guī)范中描述了兩種異常:

如果線程請求的棧深度大于虛擬機鎖允許的最大深度,將拋出StackOverflowError異常。

如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常。

第一種我們只需要使用方法遞歸調用即可模擬:

public class StackOutOfMemoryError {     public static void main(String[] args) {               test();     }     private static void go() {         System.out.println("StackOverflowError異常");         test();     } } /*Exception in thread "main" java.lang.StackOverflowError  at sun.nio.cs.ext.DoubleByte$Encoder.encodeLoop(DoubleByte.java:617)  at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)  at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)  at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)  at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)  at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)  at java.io.PrintStream.write(PrintStream.java:526)  at java.io.PrintStream.print(PrintStream.java:597)  at java.io.PrintStream.println(PrintStream.java:736)  at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:11)  at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:13)*/

第二種也可以遞歸調用模擬,,但是使用的是類直接調用。

public class JavaVMStackSOF {     private int stackLength = 1;     public void stackLeak() {         stackLength++;         stackLeak();     }  public static void main(String[] args) {         JavaVMStackSOF oom = new JavaVMStackSOF();         oom.stackLeak();     } } /*Exception in thread "main" java.lang.StackOverflowError    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:18)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    at com.lindaxuan.outofmemory.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:19)    ... */

3、方法區(qū)和運行時常量池溢出

public class JavaMethodAreaOOM {     public static void main(String[] args) {         while (true) {             Enhancer enhancer = new Enhancer();             enhancer.setSuperclass(User.class);             enhancer.setUseCache(false);             enhancer.setCallback(new MethodInterceptor() {                 public Object intercept(Object obj, Method method,                       Object[] args, MethodProxy proxy) throws Throwable {                     return proxy.invokeSuper(obj, args);                 }             });             enhancer.create();         }     }     static class User {} } /*Exception in thread "main"  Exception: java.lang.OutOfMemoryError thrown   from the UncaughtExceptionHandler in thread "main" */

4、本機直接內存溢出

DirectMemory容量可通過-XX: MaxDirectMemorySize指定,如果不指定,則默認與Java堆最大值  (-Xmx指定)一樣。

public class DirectMemoryOOM {     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);         }     } }

上面介紹了幾個實例,那遇到這種問題如何排查呢?

三、內存溢出排查

排查其實最主要的就是檢查代碼,而且內存溢出往往都是代碼的問題。當然一下幾點都是需要注意的:

(1)內存中加載的數據量過于龐大,如一次從數據庫取出過多數據;

(2)集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;

(3)代碼中存在死循環(huán)或循環(huán)產生過多重復的對象實體;

(4)使用的第三方軟件中的BUG;

(5)啟動參數內存值設定的過小;

最后就是解決了。

第一步,修改JVM啟動參數,直接增加內存。

第二步,檢查錯誤日志

第三步,對代碼進行走查和分析,找出可能發(fā)生內存溢出的位置。

一般情況下代碼出錯的概率會比較大一些,當然了不同的場景不同錯誤總是復雜多樣的。

到此,關于“如何理解Java中的內存溢出問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網站名稱:如何理解Java中的內存溢出問題
地址分享:http://www.xueling.net.cn/article/jjcjhh.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 不卡无在线一区二区三区观 | 99热久久久久久久久久久174 | 国产妇女视频大全 | 国产美女一区二区三区在线观看 | 中文字幕第3页 | 国产精品人人爽人人做av片 | 91av视频免费在线?看 | АⅤ天堂中文在线网 | 精品国产av最大网站 | zjzjzjzj免费视频大全 | 韩国理伦片一区二区三区在线播放 | 成人在线不卡视频 | 国产一级美女 | 国内性爱视频 | 国产精品久久精品99国产百盛 | 国产乱轮在线视频 | 看真人视频a级毛片 | 日韩福利视频在线 | 国产视频精品久久 | 亚洲日韩一区二区 | 偷拍25位美女撒尿bbb片户外 | xx视频在线观看免费观看 | 国内精品久久久久影院优 | 日日夜夜精品视频免费观看 | 国产精品91一区二区 | 日本三级免费片 | 亚洲精品无码MA在线观看 | 欧洲肥臀内射网站 | 日本激情视频在线播放 | 欧美性受xxx黑人xyx性爽 | 老司机久久精品视频 | 成年av网站全部免费毛片 | 俺来俺也去www色在线观看 | 色香久久| 蜜臀久久99精品久久一区二区 | 久久免费在线视频 | 国产一级av片一区久久久 | 在线观看成人无码中文AV天堂不卡 | 欧美黑人添添高潮a片www | 四虎国产精品永久入口 | 婷停五月深爱五月 |