国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java常見(jiàn)內(nèi)存溢出異常分析與解決

Java常見(jiàn)內(nèi)存溢出異常分析與解決

2020-06-24 11:29馨桑移夢(mèng) JAVA教程

本篇文章主要分析了JAVA程序內(nèi)存溢出問(wèn)題原因,較為詳細(xì)的說(shuō)明了java導(dǎo)致程序內(nèi)存溢出的原因與解決方法,感興趣的小伙伴們可以參考一下。

Java虛擬機(jī)規(guī)范規(guī)定JVM的內(nèi)存分為了好幾塊,比如堆,棧,程序計(jì)數(shù)器,方法區(qū)等,而Hotspot jvm的實(shí)現(xiàn)中,將堆內(nèi)存分為了三部分,新生代,老年代,持久帶,其中持久帶實(shí)現(xiàn)了規(guī)范中規(guī)定的方法區(qū),而內(nèi)存模型中不同的部分都會(huì)出現(xiàn)相應(yīng)的OutOfMemoryError錯(cuò)誤,接下來(lái)我們就分開(kāi)來(lái)討論一下。java.lang.OutOfMemoryError這個(gè)錯(cuò)誤我相信大部分開(kāi)發(fā)人員都有遇到過(guò),產(chǎn)生該錯(cuò)誤的原因大都出于以下原因:

JVM內(nèi)存過(guò)小、程序不嚴(yán)密,產(chǎn)生了過(guò)多的垃圾。

導(dǎo)致OutOfMemoryError異常的常見(jiàn)原因有以下幾種:

  1. 內(nèi)存中加載的數(shù)據(jù)量過(guò)于龐大,如一次從數(shù)據(jù)庫(kù)取出過(guò)多數(shù)據(jù);
  2. 集合類(lèi)中有對(duì)對(duì)象的引用,使用完后未清空,使得JVM不能回收;
  3. 代碼中存在死循環(huán)或循環(huán)產(chǎn)生過(guò)多重復(fù)的對(duì)象實(shí)體;
  4. 使用的第三方軟件中的BUG;
  5. 啟動(dòng)參數(shù)內(nèi)存值設(shè)定的過(guò)小;

此錯(cuò)誤常見(jiàn)的錯(cuò)誤提示:

  • tomcat:java.lang.OutOfMemoryError: PermGen space
  • tomcat:java.lang.OutOfMemoryError: Java heap space
  • weblogic:Root cause of ServletException java.lang.OutOfMemoryError
  • resin:java.lang.OutOfMemoryError
  • java:java.lang.OutOfMemoryError

棧溢出(StackOverflowError)

棧溢出拋出java.lang.StackOverflowError錯(cuò)誤,出現(xiàn)此種情況是因?yàn)榉椒ㄟ\(yùn)行的時(shí)候棧的深度超過(guò)了虛擬機(jī)容許的最大深度所致。出現(xiàn)這種情況,一般情況下是程序錯(cuò)誤所致的,比如寫(xiě)了一個(gè)死遞歸,就有可能造成此種情況。 下面我們通過(guò)一段代碼來(lái)模擬一下此種情況的內(nèi)存溢出

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
import java.lang.*;
public class OOMTest{
  
 public void stackOverFlowMethod(){
   stackOverFlowMethod();
 }
  
 public static void main(String... args){
   OOMTest oom = new OOMTest();
   oom.stackOverFlowMethod();
 }
}

運(yùn)行上面的代碼,會(huì)拋出如下的異常:

?
1
2
Exception in thread "main" java.lang.StackOverflowError
    at OOMTest.stackOverFlowMethod(OOMTest.java:6)

堆溢出(OutOfMemoryError:java heap space)

堆內(nèi)存溢出的時(shí)候,虛擬機(jī)會(huì)拋出java.lang.OutOfMemoryError:Java heap space,出現(xiàn)此種情況的時(shí)候,我們需要根據(jù)內(nèi)存溢出的時(shí)候產(chǎn)生的dump文件來(lái)具體分析(需要增加-XX:+HeapDumpOnOutOfMemoryErrorjvm啟動(dòng)參數(shù))。出現(xiàn)此種問(wèn)題的時(shí)候有可能是內(nèi)存泄露,也有可能是內(nèi)存溢出了。

如果內(nèi)存泄露,我們要找出泄露的對(duì)象是怎么被GC ROOT引用起來(lái),然后通過(guò)引用鏈來(lái)具體分析泄露的原因。

如果出現(xiàn)了內(nèi)存溢出問(wèn)題,這往往是程序本生需要的內(nèi)存大于了我們給虛擬機(jī)配置的內(nèi)存,這種情況下,我們可以采用調(diào)大-Xmx來(lái)解決這種問(wèn)題。

下面我們通過(guò)如下的代碼來(lái)演示一下此種情況的溢出:

?
1
2
3
4
5
6
7
8
9
10
import java.util.*;
import java.lang.*;
public class OOMTest{
  
    public static void main(String... args){
        List<byte[]> buffer = new ArrayList<byte[]>();
        buffer.add(new byte[10*1024*1024]);
    }
  
}

我們通過(guò)如下的命令運(yùn)行上面的代碼:

?
1
java -verbose:gc -Xmn10M -Xms20M -Xmx20M -XX:+PrintGC OOMTest

程序輸入如下的信息:

?
1
2
3
4
5
[GC 1180K->366K(19456K), 0.0037311 secs]
[Full GC 366K->330K(19456K), 0.0098740 secs]
[Full GC 330K->292K(19456K), 0.0090244 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at OOMTest.main(OOMTest.java:7)

從運(yùn)行結(jié)果可以看出,JVM進(jìn)行了一次Minor gc和兩次的Major gc,從Major gc的輸出可以看出,gc以后old區(qū)使用率為134K,而字節(jié)數(shù)組為10M,加起來(lái)大于了old generation的空間,所以?huà)伋隽水惓#绻{(diào)整-Xms21M,-Xmx21M,那么就不會(huì)觸發(fā)gc操作也不會(huì)出現(xiàn)異常了。

通過(guò)上面的實(shí)驗(yàn)其實(shí)也從側(cè)面驗(yàn)證了一個(gè)結(jié)論:當(dāng)對(duì)象大于新生代剩余內(nèi)存的時(shí)候,將直接放入老年代,當(dāng)老年代剩余內(nèi)存還是無(wú)法放下的時(shí)候,觸發(fā)垃圾收集,收集后還是不能放下就會(huì)拋出內(nèi)存溢出異常了

持久帶溢出(OutOfMemoryError: PermGen space)

我們知道Hotspot jvm通過(guò)持久帶實(shí)現(xiàn)了Java虛擬機(jī)規(guī)范中的方法區(qū),而運(yùn)行時(shí)的常量池就是保存在方法區(qū)中的,因此持久帶溢出有可能是運(yùn)行時(shí)常量池溢出,也有可能是方法區(qū)中保存的class對(duì)象沒(méi)有被及時(shí)回收掉或者class信息占用的內(nèi)存超過(guò)了我們配置。當(dāng)持久帶溢出的時(shí)候拋出java.lang.OutOfMemoryError: PermGen space。
我在工作可能在如下幾種場(chǎng)景下出現(xiàn)此問(wèn)題。

使用一些應(yīng)用服務(wù)器的熱部署的時(shí)候,我們就會(huì)遇到熱部署幾次以后發(fā)現(xiàn)內(nèi)存溢出了,這種情況就是因?yàn)槊看螣岵渴鸬暮螅瓉?lái)的class沒(méi)有被卸載掉。

如果應(yīng)用程序本身比較大,涉及的類(lèi)庫(kù)比較多,但是我們分配給持久帶的內(nèi)存(通過(guò)-XX:PermSize和-XX:MaxPermSize來(lái)設(shè)置)比較小的時(shí)候也可能出現(xiàn)此種問(wèn)題。

一些第三方框架,比如spring,hibernate都通過(guò)字節(jié)碼生成技術(shù)(比如CGLib)來(lái)實(shí)現(xiàn)一些增強(qiáng)的功能,這種情況可能需要更大的方法區(qū)來(lái)存儲(chǔ)動(dòng)態(tài)生成的Class文件。

我們知道Java中字符串常量是放在常量池中的,String.intern()這個(gè)方法運(yùn)行的時(shí)候,會(huì)檢查常量池中是否存和本字符串相等的對(duì)象,如果存在直接返回對(duì)常量池中對(duì)象的引用,不存在的話(huà),先把此字符串加入常量池,然后再返回字符串的引用。那么我們就可以通過(guò)String.intern方法來(lái)模擬一下運(yùn)行時(shí)常量區(qū)的溢出.下面我們通過(guò)如下的代碼來(lái)模擬此種情況:

?
1
2
3
4
5
6
7
8
9
10
11
12
import java.util.*;
import java.lang.*;
public class OOMTest{
  
    public static void main(String... args){
        List<String> list = new ArrayList<String>();
        while(true){
            list.add(UUID.randomUUID().toString().intern());
        }
    }
  
}

我們通過(guò)如下的命令運(yùn)行上面代碼:

?
1
java -verbose:gc -Xmn5M -Xms10M -Xmx10M -XX:MaxPermSize=1M -XX:+PrintGC OOMTest

運(yùn)行后的輸入如下圖所示:

?
1
2
3
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
    at java.lang.String.intern(Native Method)
    at OOMTest.main(OOMTest.java:8)

通過(guò)上面的代碼,我們成功模擬了運(yùn)行時(shí)常量池溢出的情況,從輸出中的PermGen space可以看出確實(shí)是持久帶發(fā)生了溢出,這也驗(yàn)證了,我們前面說(shuō)的Hotspot jvm通過(guò)持久帶來(lái)實(shí)現(xiàn)方法區(qū)的說(shuō)法。

OutOfMemoryError:unable to create native thread

最后我們?cè)趤?lái)看看java.lang.OutOfMemoryError:unable to create natvie thread這種錯(cuò)誤。 出現(xiàn)這種情況的時(shí)候,一般是下面兩種情況導(dǎo)致的:

程序創(chuàng)建的線程數(shù)超過(guò)了操作系統(tǒng)的限制。對(duì)于Linux系統(tǒng),我們可以通過(guò)ulimit -u來(lái)查看此限制。

給虛擬機(jī)分配的內(nèi)存過(guò)大,導(dǎo)致創(chuàng)建線程的時(shí)候需要的native內(nèi)存太少。我們都知道操作系統(tǒng)對(duì)每個(gè)進(jìn)程的內(nèi)存是有限制的,我們啟動(dòng)Jvm,相當(dāng)于啟動(dòng)了一個(gè)進(jìn)程,假如我們一個(gè)進(jìn)程占用了4G的內(nèi)存,那么通過(guò)下面的公式計(jì)算出來(lái)的剩余內(nèi)存就是建立線程棧的時(shí)候可以用的內(nèi)存。 線程棧總可用內(nèi)存=4G-(-Xmx的值)- (-XX:MaxPermSize的值)- 程序計(jì)數(shù)器占用的內(nèi)存 通過(guò)上面的公式我們可以看出,-Xmx 和 MaxPermSize的值越大,那么留給線程棧可用的空間就越小,在-Xss參數(shù)配置的棧容量不變的情況下,可以創(chuàng)建的線程數(shù)也就越小。因此如果是因?yàn)檫@種情況導(dǎo)致的unable to create native thread,那么要么我們?cè)龃筮M(jìn)程所占用的總內(nèi)存,或者減少-Xmx或者-Xss來(lái)達(dá)到創(chuàng)建更多線程的目的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品一区二区三区四区 | av不卡在线播放 | 日本在线网 | 精品视频久久 | 精品日韩| 亚洲天堂电影 | 亚洲欧洲精品成人久久奇米网 | 久久黄色网 | 最新黄网 | 国产成人综合一区二区三区 | 国产精品久久久久久久久免费桃花 | 黄色片视频在线观看免费 | 国产精品99久久久久久久vr | 免费一二三区 | 久久久一区二区三区 | 日本不卡高字幕在线2019 | 黄色综合 | 中文字幕 亚洲一区 | 日本人在线观看 | 国产片在线 | 午夜伦理电影 | 午夜欧美| 亚洲一区二区在线视频 | 婷婷在线免费视频 | 亚洲精品一区二区 | 午夜久久久久 | 在线看黄网站 | 欧美日日| 成人激情在线 | 中文字幕一区日韩精品欧美 | 91久久国产 | 国产日韩一区二区 | 精品国产精品一区二区夜夜嗨 | 免费观看欧美一级大片 | 亚洲第一免费播放区 | 午夜精品 | 超碰毛片| 国产精品一卡二卡 | 日韩精品一区二区三区第95 | 一区二区在线不卡 | 免费看一级电影 |