對於Java開發來講,在虛擬機內存管理的幫助下,不須要爲每一個新的對象在代碼層面分配內存,回收內存,好比像C語言那樣操做。因此在正常狀況下,內存泄露和內存溢出等問題也不太容易出現。因此要是運行中的程序出現了內存泄露問題,排查仍是有必定困難。安全
Java堆是被全部線程共享的一塊內存區域,主要用於存放對象實例,爲對象分配內存就是把一塊大小肯定的內存從堆內存中劃分出來,一般有指針碰撞和空閒列表兩種實現方式。併發
1.指針碰撞法
假設Java堆中內存時完整的,已分配的內存和空閒內存分別在不一樣的一側,經過一個指針做爲分界點,須要分配內存時,僅僅須要把指針往空閒的一端移動與對象大小相等的距離。使用的GC收集器:Serial、ParNew,適用堆內存規整(即沒有內存碎片)的狀況下。post
2.空閒列表法
事實上,Java堆的內存並非完整的,已分配的內存和空閒內存相互交錯,JVM經過維護一個列表,記錄可用的內存塊信息,當分配操做發生時,從列表中找到一個足夠大的內存塊分配給對象實例,並更新列表上的記錄。使用的GC收集器:CMS,適用堆內存不規整的狀況下。學習
內存分配併發問題線程
在建立對象的時候有一個很重要的問題,就是線程安全,由於在實際開發過程當中,建立對象是很頻繁的事情,做爲虛擬機來講,必需要保證線程是安全的,一般來說,虛擬機採用兩種方式來保證線程安全:指針
若是想多了,建立一個對象仍是挺麻煩的,須要這麼多步驟,那麼咱們在開發過程當中儘可能非必須的對象建立呢?對象
建立對象有如下幾個要點:內存
學習前人筆記,記錄一下!開發
參考:get