JVM主要的內存區域有
- heap
- stack
- 其它寄存器。
heap主要是用來存儲對象實例及數組值,可以認為java中所有通過new創建的對象都在此分配。
On-heap是指在堆內內存,由GC進行創建回收,可以通過參數-Xms
(最小)和-Xmx
(最大)來控制
Off-heap是指在堆外內存,不由GC創建,但可以通過full GC回收,通過-XX:MaxDirectMemorySize
設置大小。
通俗的講,Off-heap存儲就好比在Java堆外部的數據庫中存儲對象。
優點是我們可以在該數據庫中存儲大量對象,而不受垃圾收集器管理。
但是,當我們運行查詢以從該數據庫檢索對象時,這些對象將復制到Java堆上。
如果我們的應用程序經常檢索某個對象,然后在處理請求時丟棄它們,則必須對每個請求檢索的對象進行垃圾回收。
而若我們使用On-heap存儲,在處理每個請求后,所需的對象將保留在堆上,以備后續請求繼續使用。
緩存數據存放一般支持On-heap及Off-heap:
堆內存放開銷小、效率高、存儲大小受限制,
堆外存放開銷大(還是比disk快,建議使用緩沖池)、存儲容量較大,適合 存儲不怎么變化 的數據。
參考資料
groups.google.com