2014-01-10 55 views
12

有誰知道有多少內存異常一旦被創建就佔用,被拋出?例如,NullPointerException內存異常的Java大小

如何收集異常垃圾?

+12

它們就像任何其他Java對象一樣被收集。爲什麼他們會有什麼特別的? –

+6

異常的大小將取決於您的Java實現和調用堆棧的深度。你需要什麼信息?你可能不應該有太多的例外,所以大部分時間都不重要。 – user2357112

+1

我完全同意馬克,這應該是你的問題的答案 – Keerthivasan

回答

3

有誰知道一旦被創建並拋出它的異常多少內存佔用?

這完全取決於例外。像任何其他對象一樣,它包含可變數量的數據;除了包含對String和參考值是固定大小的參考,但String; OK,這是有點誤導:

Exception e = 
    new Exception(new String("Some gigantic message ... lalalalalalalalla")); 

編輯:如果有人做了一件愚蠢的String消息可以4MB本身可能只會被異常引用 - 我將它改爲非文字來顯式地顯示它可以是可收集的東西,自定義異常可以包含任何東西,但它是一個對象,除此之外,它還取決於far它已經被拋出,因爲它將堆棧軌跡保存在其中。在SO上有一個很好的Q/A;這覆蓋了這個問題:In java, what is the best way to determine the size of an object。 )

以及如何收集異常垃圾?

就像任何其他物體一樣。拋出異常調用堆棧和一兩件事情發生:

1)你抓住它,和它分配給catch塊的變量:

catch (Exception e) { 

e現在擁有獨一無二的參考例外。當不再有對它的引用時(即它不在catch塊底部的範圍內,或者它傳遞給它的對象被收集等)時,它將被收集。

2)您不會捕獲它,它會打到當前線程的調用堆棧頂部。此時,異常超出範圍,因此它將被收集,並且線程當然會停止。

**要完全迂腐,當我說「會得到收集」我的意思是最終當Java中的對象必須不再引用這是它的資格收集,並與它的GC交易。

0

這很容易找出你自己。啓動jvisualvm並附加到您想要配置的應用程序。 切換到內存選項卡並篩選您要查找的異常。

這應該給你一個關於異常對象使用多少字節的好圖片 - 以及這與你的總堆大小有何關係 - 以及它們收集的頻率和頻率。

1

Java異常的對象,從而任何其他對象的大小取決於由IT架構,如果你創造了你可以(例如)存儲電子郵件完整的二進制文件中的其他對象,直到你有空閒內存自定義異常。 您可以爲應用程序設置初始和最大空間。 可用空間動態變化,現在存在GC問題。 Java異常是對象,因此任何其他對象垃圾回收都使用您的環境中的規則。

有關異常的快速參考http://docs.oracle.com/javase/tutorial/essential/exceptions/

這是關於垃圾收集的文章,其中的關鍵概念是

總結在Java垃圾收集

1)Java堆分爲三個代爲了垃圾收集。這些是年輕一代,終身或老一代和彼爾姆地區。

2)新對象被創建到年輕一代,隨後移到老一代。

3)字符串池在堆的彼爾姆區域中產生,可以發生在空間燙髮垃圾收集但在JVM取決於到JVM。

4)。次要垃圾收集用於從伊甸空間中移動對象倖存者1個2倖存者空間和主要集合用於從年輕移動對象到年老代。

5)每當主要垃圾收集發生應用程序線程在此期間,這會降低應用程序的性能和吞吐量停止。

6)很少有性能的提高已經垃圾收集在Java 6中得到應用和我們平時使用的JRE 1.6.20運行我們的應用程序。

7)JVM命令行選項-Xmx和-Xms用於設置起始和最大尺寸爲Java堆。根據我的經驗,此參數的理想比例爲1:1或1:1.5,例如,您可以將-Xmx和-Xms都設置爲1GB或-Xms 1.2 GB和1.8 GB。

8)在Java中沒有手動進行垃圾回收的方式。

瞭解更多:http://javarevisited.blogspot.it/2011/04/garbage-collection-in-java.html

如果使用Java 7的約GC的野趣的問題是

Java 7 (JDK 7) garbage collection and documentation on G1

其他建議是有用的,如果你需要,如果你需要,可以只查看狀態蝙蝠調整您的應用程序的配置,您需要使用GC alg最終內存。