java堆、棧、方法區內存溢出

1.java堆內存溢出
java堆用於存儲對象,只要不斷的創建對象,並且保證GC Roots到對象的之間有可達路徑來避免垃圾回收機制清楚這些對象,那麼在對象數量達到最大堆容量限制後就會產生內存溢出異常。
2.棧內存溢出
在單個線程下,無論是由於棧幀太大還是虛擬機棧容量太小,當內存無法分配的時候,虛擬機拋出的都是StackOverflowError異常。
多線程下,不斷建立線程會產生內存溢出,但這樣的內存溢出和棧空間是否足夠大並不存在任何聯繫。在這種情況下,爲每個線程的棧分配的內存越大,反而越容易產生內存溢出。
3.方法區內存溢出
HotSpot jdk1.7之前字符串常量池是方法區的一部分,方法區叫做“永久代”,在1.7之前無限的創建對象就會造成內存溢出,提示信息:PermGen space
而是用jdk1.7之後,開始逐步去永久代,就不會產生內存溢出。

方法區用於存放Class的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等,如果動態生成大量的Class文件,也會產生內存溢出。常見的場景還有:大量JSP或動態產生JSP文件的應用(JSP第一次運行時需要編譯爲java類)、基於OSGi的應用(即使是同一個類文件,被不同的類加載器加載也會視爲不同的類)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章