今天晚上又打排位了
3、錯誤
定義 : Error類及其子類。
特點 : 和運行時異常一樣,編譯器也不會對錯誤進行檢查。
當資源不足、約束失敗、或是其它程序無法繼續運行的條件發生時,就產生錯誤。程序本身無法修複這 些錯誤的。例如,VirtualMachineError就屬於錯誤。出現這種錯誤會導致程序終止運行。OutOfMemoryError、ThreadDeath。
Java虛擬機規範規定JVM的內存分為了好幾塊,比如堆,棧,程序計數器,方法區等
25、OOM你遇到過哪些情況,SOF你遇到過哪些情況
OOM:
1,OutOfMemoryError異常
除了程序計數器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能。
Java Heap 溢出:
一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess。
java堆用於存儲對象實例,我們隻要不斷的創建對象,並且保證GC Roots到對象之間有可達路徑來避免垃圾回收機製清除這些對象,就會在對象數量達到最大堆容量限製後產生內存溢出異常。
出現這種異常,一般手段是先通過內存映像分析工具(如Eclipse Memory Analyzer)對dump出來的堆轉存快照進行分析,重點是確認內存中的對象是否是必要的,先分清是因為內存泄漏(Memory Leak)還是內存溢出(Memory Overflow)。
如果是內存泄漏,可進一步通過工具查看泄漏對象到GCRoots的引用鏈。於是就能找到泄漏對象是通過 怎樣的路徑與GC Roots相關聯並導致垃圾收集器無法自動回收。
如果不存在泄漏,那就應該檢查虛擬機的參數(-Xmx與-Xms)的設置是否適當。
2,虛擬機棧和本地方法棧溢出
如果線程請求的棧深度大於虛擬機所允許的最大深度,將拋出StackOverflowError異常。 如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常
這裏需要注意當棧的大小越大可分配的線程數就越少。
3,運行時常量池溢出
異常信息:java.lang.OutOfMemoryError:PermGenspace
如果要向運行時常量池中添加內容,最簡單的做法就是使用String.intern()這個Native方法。該方法的 作用是:如果池中已經包含一個等於此String的字符串,則返回代表池中這個字符串的String對象;否 則,將此String對象包含的字符串添加到常量池中,並且返回此String對象的引用。由於常量池分配在 方法區內,我們可以通過-XX:PermSize和-XX:MaxPermSize限製方法區的大小,從而間接限製其中常量 池的容量。