java虛擬機內存溢出和泄漏實例

測試參數設置:java

一、循環調用new A()實現堆溢出,java.lang.OutOfMemoryError: Java heap space,

虛擬機參數:-Xms1M -Xmx1M -XX:+HeapDumpOnOutOfMemoryError,解釋:將-Xmx和-Xms設置爲同樣能夠避免堆自動擴展,-XX:+HeapDumpOnOutOfMemoryError可讓虛擬機在出現內存溢出異常時Dump出當前的堆內存轉儲快照算法

1
2
3
//        while (true){
//            new A().do2();
//        }

 

二、循環調用對象引用的方式實現棧溢出。java.lang.StackOverflowError,

虛擬機參數:-Xss128k,服務器

解釋:設置虛擬機棧的大小爲128kn併發

在單線程下,不管棧幀太大仍是虛擬機棧容量過小,內存沒法分配的時候都會拋出以上錯誤jvm

1
2
3
void  do2(){
     do2();
};

 

三、循環調用String.intern()方法來寫入常量池,常量池溢出。java.lang.OutOfMemoryError: PermGen space

1
2
3
4
while  ( true )
       {
           list.add(String.valueOf(i++).intern());
       }

 

虛擬機參數:-XX:PermSize=10M -XX:MaxPermSize=10M,測試

解釋:表示JVM初始分配的永久代的容量和最大容量。(永久區內存不足,1.8後都在堆上。方法區=永久代,PermGen space」,即永久代)spa

 

  • 四種引用狀態:(類繼承extends WeakReference<Car>)

一、強引用:Object obj = new Object(),只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象;線程

二、軟引用:SoftReference,被軟引用關聯的對象會在內存不夠時被回收。若是此次回收尚未足夠的內存,纔會拋出內存溢出異常;SoftReference<byte[]> sr = new SoftReference<byte[]>(bytes);code

三、弱引用:WeakReference,被弱引用關聯的對象只能生存到下一次垃圾回收以前;對象

四、虛引用:PhantomReference,虛引用是用於跟蹤對象的回收狀態

 

觸發GC的時機:

一、當年輕代或者老年代滿了,Java虛擬機沒法再爲新的對象分配內存空間了,那麼Java虛擬機就會觸發一次GC去回收掉那些已經不會再被使用到的對象

二、System.gc(),Runtime.getRuntime().gc()方法,一般這樣會觸發一次的Full GC以及至少一次的Minor GC,不必定就當即回收。

三、在當前服務器空閒或堆中老年代等佔用率較大時觸發。

回收無引用對象佔據的空間,而不是對象自己。

但真正垃圾回收機制具體在什麼時間點開始發生動做這一樣是不可預料的(未開源),這和搶佔式的線程在發生做用時的原理同樣。

 

分代收集算法:

新生代收集器和老年代收集器。

標記-清除算法

標記-整理算法

 

內存溢出和內存泄露的區別:

一、內存溢出:程序在分配內存的時候沒有足夠大的空間了。

二、內存泄漏:程序在申請內存以後,沒有辦法釋放掉內存,它始終佔用着內存,即被分配的對象可達但無用。內存泄露通常都是由於內存中有一塊很大的對象,可是沒法釋放。            會致使內存溢出。

並行與併發:

一、並行:指多條垃圾收集器線程運行;

二、併發:指用戶線程和垃圾收集器線程同時工做。

類加載機制:

一、加載(生成java.lang.class對象)、驗證、準備、解析、初始化(賦值過程)、使用(Using)和卸載(Unloading)這7個階段

二、其中驗證(字節流包含的信息是否正確,是否符合jvm)、

            準備(爲類變量即靜態變量賦值,賦0)、

            解析(將符號引用替換爲直接引用,class文件轉內存)3個部分統稱爲鏈接(Linking)

三、加載階段:獲取.class文件的二進制流;

                       將類信息、靜態變量、字節碼、常量這些.class文件中的內容放入方法區

                       在內存中生成一個表明這個.class文件的java.lang.Class對象,做爲方法區這個類的各類數據的訪問入口。

四、初始化階段作的事就是調用client>方法給static變量賦予用戶指定的值以及執行靜態代碼塊。

雙親委派模型:(啓動類加載器>擴展類加載器>應用程序類加載器>自定義類加載器)

一個類加載器收到了類加載的請求,把這個請求委派給父類加載器去完成,父類完不成,本身才去完成。

先行發生原則:

Java內存中的有序性僅僅依靠synchronized和volatile來約束是不行,依靠程序調用次序規則判斷setter和getter順序。

 

Minor GC :  清理年輕帶內存, 沒法爲一個新的對象分配空間。

Major GC : 是清理老年代,許多 Major GC 是由 Minor GC 觸發的

Full GC : 是清理整個堆空間—包括年輕代和老年代

相關文章
相關標籤/搜索