當前位置:編程學習大全網 - 編程語言 - 如何處理對象和內存溢出

如何處理對象和內存溢出

1.對象。

A.創造。首先檢查指令的參數是否能在常量區找到該類的符號引用,檢查該類是否已經被加載、解析和初始化。如果沒有,則執行該類的加載過程。其次,內存分配。加載完類後,就知道要分配的內存大小了。有兩種分配方法。壹種是指針碰撞,即壹塊內存用了,另壹塊沒用。如果用指針劃分內存,新分配的內存指針會移動到空閑,功能緊湊的虛擬機會和指針發生碰撞。另壹種是空閑列表,即壹個列表記錄空閑的內存塊,列表是不斷更新的。新分配的內存在鏈表中找到壹個大小合適的內存塊,具有sweep功能的虛擬機使用空閑鏈表。第三,在分配內存空間時,還要考慮並發性。有兩種方法,壹種是同步處理,比如采用CAS,失敗重試;另壹種是根據線程將內存分配動作劃分到不同的空間。每個線程提前在堆中分配壹小塊內存,本地線程分配壹個緩沖區TLAB。那個線程需要在那個TLAB上分配內存,只有當TLAB用完了,它才能被同步鎖定和重新分配。第四,對對象進行必要的設置,比如對象屬於哪個類,如何找到類的元數據信息,對象的hashcode和對象的GC生成年齡等。

B.對象的內存布局。分為對象頭、實例數據和對齊填充。對象頭由兩部分組成。第壹部分是存儲對象本身的信息,比如hashcode、GC代齡、鎖狀態等。第二部分是類型指針,壹個對象指向它的類的元數據的指針,通過它虛擬機確定這是那個類的壹個實例。

C.對象訪問位置。有兩種方式,壹種是句柄訪問,句柄池有訪問對象實例數據的指針和訪問對象數據類型的指針。這種訪問最大的好處是引用是壹個穩定的句柄池地址,對象的改變都是改變句柄池中的指針,而引用本身是不動的。另壹種是直接指針,有指向對象類型數據和實例數據的指針。這種訪問的好處是速度更快,節省了壹次指針定位的成本。

2.內存溢出OOM。

A.堆溢出。堆存儲對象實例。只要不斷地創建對象,並且存在從GC根到對象的大路徑以避免被垃圾收集移除,對象的數量將達到最大堆容量限制。使用內存映像分析工具和Eclipse內存分析器來分析它。

B.虛擬機堆棧和本地方法堆棧溢出。有兩種:壹種是線程請求的堆棧深度大於虛擬機允許的最大深度時拋出StackOverFlowError異常;另壹種是在擴展堆棧時,如果虛擬機無法申請足夠的內存空間,則拋出OutOfMemoryError異常。您可以減少最大堆和堆棧容量來獲得更多線程。

C.方法區域和常量池溢出。會有額外的提示,PermGen空間。

D.本地直接內存溢出。這個堆轉儲文件看不到內存占用情況,但是如果直接或者簡單使用NIO,可能是本地直接內存溢出。

  • 上一篇:寶寶越早學會走路越好?訓練正確的開始走路的方法!
  • 下一篇:有哪些好的文字轉語音的軟件推薦,就是配音軟件?
  • copyright 2024編程學習大全網