1. 程式人生 > >《深入理解java虛擬機》讀書筆記——java內存區域和內存溢出異常

《深入理解java虛擬機》讀書筆記——java內存區域和內存溢出異常

uil reference tro idt 三種 指針 理解 內存 stack

幾種內存溢出異常:
堆溢出 原因:創建過多對象,並且GC Roots到對象之間有可達路徑。 分兩種情況: Memory Leak:無用的對象沒有消除引用,導致無用對象堆積。例如《Effictive java》中提到的用ArrayList實現的stack擴容再收縮,長度之外的對象不會被回收。 Memory Overflow:內存溢出,創建了太多對象並且這些對象都有用;需要調整-Xmx參數(或優化程序)。 虛擬機棧溢出 三種情況: StackOverflowError:調用棧深度超過最大深度限制。 OutOfMemoryError:局部變量過多(棧幀大)將可用內存耗盡。 創建過多線程導致OutOfMemoryError:每個線程分配的工作內存(Working Memory)將可用內存耗盡。 方法區和運行時常量池溢出
這部分主要提下String.intern()和StringBuilder。String.intern()將實例存到運行時常量池(1.6之前拷貝實例,1.7之後存儲引用),可被復用;StringBuilder.toString()始終在堆中創建一個新對象。 對象的內存布局 對象頭、實例數據、對齊填充 對象的訪問定位 java棧中保存的reference數據有兩種實現方式:句柄和指針。 句柄:java堆中有句柄池,reference指向句柄池,句柄池中存儲指向實例的指針(堆),和指向類型的指針(方法區)。 指針:指針直接指向堆中的實例,實例對象頭保存類型指針。 技術分享圖片 技術分享圖片

《深入理解java虛擬機》讀書筆記——java內存區域和內存溢出異常