目錄
堆溢出
虛擬機棧和本地方法棧溢出(棧溢出很少出現)
方法區和運行時常量池溢出
?本機內存直接溢出(實際中很少出現、了解即可)
堆溢出
堆溢出:最常見的是大list,list里面有很多元素
堆溢出該怎么解決:
????????定位到導致內存溢出的對象
????????判斷是否是真的內存溢出,先判斷這個對象是不是正常的,如果不是,就得修復,如果是:要么去調優,通過優化邏輯來減少對象的大小;如果說硬件設施~(操作系統)剩余內存還足夠大,就可以將堆內存調大一些。
虛擬機棧和本地方法棧溢出(棧溢出很少出現)
虛擬即棧放的是java方法,本地方法棧放的是本地native方法
如果線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverflowError異常;如果虛擬機的棧內存允許動態擴展,當擴展棧容量無法申請到足夠的內存時,將拋出OutOfMemoryError異常。
方法區和運行時常量池溢出
String::intern()是一個本地方法,它的作用是如果字符串常量池中已經包含一個等于此String對象的字符串,則返回代表池中這個字符串的String對象的引用;否則,會將此String對象包含的字符串添加到常量池中,并且返回此String對象的引用。
str3直接在字符串常量池中創建字符串,str4 new在堆里
true true false false
原因:append之后可能為之前已經有的內存地址,ja和va拼接起來后的java之前在常量池中已經有了true true false false
原因:append之后可能為之前已經有的內存地址,ja和va拼接起來后的java之前在常量池中已經有了
斷點查看字符串在常量池中的地址
?本機內存直接溢出(實際中很少出現、了解即可)
直接內存(Direct Memory)的容量大小可通過-XX:MaxDirectMemorySize參數來指定,如果不去指定,則默認與Java堆最大值(由-Xmx指定)一致