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

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

Java內存溢出實現原因及解決方案

瀏覽:23日期:2022-09-03 18:42:25

1.JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space

JVM在啟動的時候會自動設置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時間是用于GC,且可用的Heap size 不足2%的時候將拋出此異常信息。解決方法:手動設置JVM Heap(堆)的大小。

Java堆用于儲存對象實例。當需要為對象實例分配內存,而堆的內存占用又已經達到-Xmx設置的最大值。將會拋出OutOfMemoryError異常。例子如下:

package com.demo.test;import java.util.ArrayList;import java.util.List;/** * VM Args: -Xms5m -Xmx5m */public class HeapOOM { public static void main(String[] args) { int count = 0; List<Object> list = new ArrayList<Object>(); while(true){ list.add(new Object()); System.out.println(++count); } }}

然后在運行時設置jvm參數,如下:

Java內存溢出實現原因及解決方案

-Xmx為5m。其中的一次測試結果為,當count的值累加到360145時,發生如下異常:

Exception in thread 'main' java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:2245)at java.util.Arrays.copyOf(Arrays.java:2219)at java.util.ArrayList.grow(ArrayList.java:213)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)at java.util.ArrayList.add(ArrayList.java:411)at com.demo.test.HeapOOM.main(HeapOOM.java:12)

修改-Xmx為10m。其中的一次測試結果為,當count的值累加到540217時,發生OutOfMemoryError異常。隨著-Xmx參數值的增大,java堆中可以存儲的對象也越多。

2.PermGen space溢出: java.lang.OutOfMemoryError: PermGen space

PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。為什么會內存溢出,這是由于這塊內存主要是被JVM存放Class和Meta信息的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,sun的 GC不會在主程序運行期對PermGen space進行清理,所以如果你的APP會載入很多CLASS的話,就很可能出現PermGen space溢出。一般發生在程序的啟動階段。解決方法: 通過-XX:PermSize和-XX:MaxPermSize設置永久代大小即可。

方法區用于存放java類型的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等。在類裝載器加載class文件到內存的過程中,虛擬機會提取其中的類型信息,并將這些信息存儲到方法區。當需要存儲類信息而方法區的內存占用又已經達到-XX:MaxPermSize設置的最大值,將會拋出OutOfMemoryError異常。對于這種情況的測試,基本的思路是運行時產生大量的類去填滿方法區,直到溢出。這里需要借助CGLib直接操作字節碼運行時,生成了大量的動態類。例子如下:

package com.demo.test;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodProxy;import net.sf.cglib.proxy.MethodInterceptor;/** * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M */public class MethodAreaOOM { public static void main(String[] args) { int count = 0; while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MethodAreaOOM.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() {public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invoke(obj, args);} }); enhancer.create(); System.out.println(++count); } }}

-XX:MaxPermSize為10m。其中的一次測試結果為,當count的值累加到800時,發生如下異常:

復制代碼 代碼如下:Caused by: java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:792) ... 8 more

隨著-XX:MaxPermSize參數值的增大,java方法區中可以存儲的類型數據也越多。

3.棧溢出: java.lang.StackOverflowError : Thread Stack space

棧溢出了,JVM依然是采用棧式的虛擬機,這個和C和Pascal都是一樣的。函數的調用過程都體現在堆棧和退棧上了。調用構造函數的 “層”太多了,以致于把棧區溢出了。 通常來講,一般棧區遠遠小于堆區的,因為函數調用過程往往不會多于上千層,而即便每個函數調用需要 1K的空間(這個大約相當于在一個C函數內聲明了256個int類型的變量),那么棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。通俗一點講就是單線程的程序需要的內存太大了。 通常遞歸也不要遞歸的層次過多,很容易溢出。

解決方法:1:修改程序。2:通過 -Xss: 來設置每個線程的Stack大小即可。

在Java虛擬機規范中,對這個區域規定了兩種異常狀況:StackOverflowError和OutOfMemoryError異常。

(1)StackOverflowError異常

每當java程序代碼啟動一個新線程時,Java虛擬機都會為它分配一個Java棧。Java棧以幀為單位保存線程的運行狀態。當線程調用java方法時,虛擬機壓入一個新的棧幀到該線程的java棧中。只要這個方法還沒有返回,它就一直存在。

如果線程的方法嵌套調用層次太多(如遞歸調用),隨著java棧中幀的逐漸增多,最終會由于該線程java棧中所有棧幀大小總和大于-Xss設置的值,而產生StackOverflowError內存溢出異常。例子如下:

package com.demo.test;/** * VM Args: -Xss128k */public class JavaVMStackSOF { private int count = 0; public static void main(String[] args) { new JavaVMStackSOF().method(); } public void method() { System.out.println(++count); method(); }}

-Xss為128k。其中的一次測試結果為,當count的值累加到2230時,發生如下異常:

Exception in thread 'main' java.lang.StackOverflowErrorat sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:564)at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:619)at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:561)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.demo.test.JavaVMStackSOF.method(JavaVMStackSOF.java:15)

隨著-Xss參數值的增大,可以嵌套的方法調用層次也相應增加。綜上所述,StackOverflowError異常是由于方法調用的層次太深,最終導致為某個線程分配的所有棧幀大小總和大于-Xss設置的值,從而發生StackOverflowError異常。

(2)OutOfMemoryError異常

java程序代碼啟動一個新線程時,沒有足夠的內存空間為該線程分配java棧(一個線程java棧的大小由-Xss參數確定),jvm則拋出OutOfMemoryError異常。例子如下:

package com.demo.test;/** * VM Args: -Xss128k */public class JavaVMStackOOM { public static void main(String[] args) { int count = 0; while (true) { Thread thread = new Thread(new Runnable() {public void run() { while (true) { try { Thread.sleep(5000); } catch (Exception e) { } }} }); thread.start(); System.out.println(++count); } }}

-Xss為128k。其中的一次測試結果為,當count的值累加到11958時,發生如下異常:

Exception in thread 'main' java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:693)at com.demo.test.JavaVMStackOOM.main(JavaVMStackOOM.java:21)

隨著-Xss參數值的增大,java程序可以創建的總線程數越少。

4.所以Server容器啟動的時候我們經常關心和設置JVM的幾個參數如下:

-Xms:java Heap初始大小, 默認是物理內存的1/64。 -Xmx:java Heap最大值,不可超過物理內存。 -Xmn:young generation的heap大小,一般設置為Xmx的3、4分之一 。增大年輕代后,將會減小年老代大小,可以根據監控合理設置。 -Xss:每個線程的Stack大小,而最佳值應該是128K,默認值好像是512k。 -XX:PermSize:設定內存的永久保存區初始大小,缺省值為64M。 -XX:MaxPermSize:設定內存的永久保存區最大大小,缺省值為64M。 -XX:SurvivorRatio:Eden區與Survivor區的大小比值,設置為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的1/10。 -XX:+UseParallelGC:F年輕代使用并發收集,而年老代仍舊使用串行收集。 -XX:+UseParNewGC:設置年輕代為并行收集,JDK5.0以上,JVM會根據系統配置自行設置,所無需再設置此值。 -XX:ParallelGCThreads:并行收集器的線程數,值最好配置與處理器數目相等 同樣適用于CMS。 -XX:+UseParallelOldGC:年老代垃圾收集方式為并行收集(Parallel Compacting)。 -XX:MaxGCPauseMillis:每次年輕代垃圾回收的最長時間(最大暫停時間),如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。 -XX:+ScavengeBeforeFullGC:Full GC前調用YGC,默認是true。

實例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″

第一種OutOfMemoryError: PermGen space

發生這種問題的原意是程序中使用了大量的jar或class,使java虛擬機裝載類的空間不夠,與Permanent Generation space有關。解決這類問題有以下兩種辦法:

1、增加java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小,其中XX:PermSize是初始永久保存區域大 小,XX:MaxPermSize是最大永久保存區域大小。如針對tomcat6.0,在catalina.sh 或catalina.bat文件中一系列環境變量名說明結束處(大約在70行左右) 增加一行: JAVA_OPTS=' -XX:PermSize=64M -XX:MaxPermSize=128m' 如果是windows服務器還可以在系統環境變量中設置。感覺用tomcat發布sprint+struts+hibernate架構的程序時很容易發生這種內存溢出錯誤。使用上述方法,我成功解決了部署ssh項目的tomcat服務器經常宕機的問題。

2、清理應用程序中web-inf/lib下的jar,如果tomcat部署了多個應用,很多應用都使用了相同的jar,可以將共同的jar移到 tomcat共同的lib下,減少類的重復加載。這種方法是網上部分人推薦的,我沒試過,但感覺減少不了太大的空間,最靠譜的還是第一種方法。

第二種OutOfMemoryError: Java heap space

發生這種問題的原因是java虛擬機創建的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與Heap space有關。解決這類問題有兩種思路:

1、檢查程序,看是否有死循環或不必要地重復創建大量對象。找到原因后,修改程序和算法。 我以前寫一個使用K-Means文本聚類算法對幾萬條文本記錄(每條記錄的特征向量大約10來個)進行文本聚類時,由于程序細節上有問題,就導致了 Java heap space的內存溢出問題,后來通過修改程序得到了解決。

2、增加Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区亚洲| 1024精品一区二区三区| 五月婷婷六月综合| 国产在线观看www| 国产综合色区在线观看| 99tv成人| 爽爽淫人综合网网站| 日韩在线a电影| 日韩精品乱码av一区二区| 国产伦精品一区二区三区在线播放 | 精品网站999| 国产精品久久观看| 欧美少妇精品| 在线亚洲免费| 91精品在线免费视频| 久久不卡日韩美女| se01亚洲视频| 亚洲男人在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产一区二区视频在线看| 99精品在线观看| 蜜臀久久99精品久久久画质超高清 | 国产乱码精品一区二区亚洲| 97精品国产福利一区二区三区| 97se综合| 亚洲精品伊人| av日韩中文| 亚洲丝袜啪啪| 国产suv精品一区二区四区视频 | 日韩欧美视频专区| 久久99伊人| 麻豆成人在线观看| 女人天堂亚洲aⅴ在线观看| 久久国内精品| 婷婷综合亚洲| 欧美aaaaaa午夜精品| 国产精品美女久久久| 国产精品九九| 美女精品在线观看| 韩国女主播一区二区三区| 亚洲男女av一区二区| 国产日韩一区二区三区在线| 欧美99久久| 卡一卡二国产精品| 久久xxxx| 正在播放日韩精品| 奇米狠狠一区二区三区| 欧美黄色网页| 国产毛片久久久| 亚洲在线免费| 午夜影院一区| 国产精品成人国产| 亚洲综合专区| 在线视频观看日韩| 电影91久久久| 日韩二区在线观看| 九九综合九九| 国产在线观看www| 国产伦精品一区二区三区千人斩 | 日韩avvvv在线播放| 黑丝美女一区二区| sm捆绑调教国产免费网站在线观看 | 免播放器亚洲一区| 1000部精品久久久久久久久| 黄色精品视频| 欧美精品三级在线| 不卡中文字幕| 国产+成+人+亚洲欧洲在线| 亚洲精品成人一区| 亚洲高清影视| 国产91精品对白在线播放| 久久久国产精品网站| 国产亚洲高清一区| 中文视频一区| 亚洲一区日韩在线| 国产99久久| 久久一级电影| 成人av动漫在线观看| 婷婷成人综合| 激情自拍一区| 亚洲国内欧美| 欧美~级网站不卡| 99久久精品费精品国产| 91麻豆国产自产在线观看亚洲| 欧美国产不卡| 国产精品mv在线观看| 久久国产三级精品| 国产欧美日韩精品一区二区免费| 日本成人手机在线| 日韩欧美激情| 日本99精品| 国产日韩一区| 欧美激情99| 国产精品蜜芽在线观看| 成人av三级| 久久久精品五月天| 亚洲www免费| 日韩大片免费观看| 欧美sss在线视频| 久久久久欧美精品| 天堂资源在线亚洲| 亚洲二区视频| 国产午夜精品一区二区三区欧美 | 亚洲va在线| 黄色成人在线网址| 美女网站久久| 中文字幕免费一区二区| 亚洲精品一区二区在线播放∴| 亚洲三级精品| 国产日韩欧美在线播放不卡| 国产精品s色| 中文字幕高清在线播放| 视频二区不卡| 一本色道久久精品| 日韩精品一区二区三区中文| 国产极品一区| av资源亚洲| 不卡一区2区| 在线观看一区| 精品免费在线| 免费不卡中文字幕在线| 鲁大师成人一区二区三区| 欧美日一区二区在线观看| 国产一区日韩| 亚洲黄页一区| 日韩激情一区二区| 成人台湾亚洲精品一区二区| 久久精品卡一| 亚洲人成网77777色在线播放 | 蜜桃视频在线观看一区| 国产欧美日韩精品一区二区三区| 91视频久久| 久久99伊人| 六月丁香综合在线视频| 午夜精品久久久久久久久久蜜桃| 夜夜精品视频| 国产精品xvideos88| 蜜桃一区二区三区| 国产区精品区| 亚洲一级二级| 国产免费久久| 在线视频免费在线观看一区二区| 国产午夜一区| 欧美69视频| 国产欧美69| 中文日韩欧美| 久久久久伊人| 石原莉奈在线亚洲三区| 久久这里只有精品一区二区| 蜜臀久久99精品久久一区二区 | av成人国产| 精品久久久网| 丝袜脚交一区二区| 国产一区二区精品福利地址| 免费视频一区二区| 国产 日韩 欧美一区| 日本免费一区二区视频| 国产一区清纯| 精品中文字幕一区二区三区 | 欧美黄色网页| 91精品啪在线观看国产爱臀| 久久精品中文| 久久亚洲人体| 日本成人中文字幕在线视频| 亚洲二区免费| 91欧美日韩| 国产调教一区二区三区| 伊人久久成人| 欧美日韩免费观看视频| 免费日韩一区二区三区| 综合在线一区| 黄色亚洲精品| 色综合五月天| 久久国际精品| 亚洲欧美网站| 1024精品一区二区三区| 成人国产精选| 国产精品sss在线观看av| 亚洲午夜免费| 伊人影院久久| 1024精品一区二区三区| 福利一区和二区| 国产精品麻豆成人av电影艾秋| 欧美综合二区| 一本一道久久a久久精品蜜桃| 欧美freesex黑人又粗又大| 乱一区二区av| 国产亚洲一区二区三区啪| 亚洲精品麻豆| 亚洲一区二区三区免费在线观看| 日韩一区二区在线免费| 久久精品天堂| 欧美激情五月| 精品五月天堂| 日韩av自拍| xxxxx性欧美特大| 日韩电影在线视频| 国产色播av在线| 高清av一区| 国产精品精品国产一区二区|