目錄
導讀
- java內存區域與內存溢出異常
- 垃圾收集器與內存分配策略
本篇主要講jvm的自動內存管理機制,首先我們要拆分“自動內存管理機制”這個詞:
- 首先是一個管理機制,
- 管理什麼?內存!
- 爲什麼內存需要管理?、
- 內存會帶來什麼問題?
- 如何管理?自動管理!
- 如何自動管理?
帶着這幾個疑問,所以我們接下里會講,管理的內存區域是什麼?如何劃分?爲什麼要劃分?爲什麼採用自動管理?如何自動管理?自動管理會帶來什麼問題?
java內存區域
回答上面第2,3個問題:管理什麼?內存!爲什麼內存需要管理?解決what ,why的問題
首先爲什麼內存需要管理?爲什麼內存要劃分區域?
一句話總結:爲了解決有限資源和無限需求的衝突!內存是有限的,但在運行的過程中最大的衝突就是:內存不夠用,如何解決的?通過管理內存,決定哪些留下,哪些丟掉來保證內存夠用!通過內存區域劃分達到最小代價的高性能利用內存資源。
其次如何java內存區域是如何劃分的?
java虛擬機在執行java程序的過程中會把它所管理的內存劃分爲若干個不同的數據區域,這些區域有各自的用途,以及創建和銷燬的時間! 那麼這些內存是如何佈局的呢?在jvm中處於什麼位置呢?java8內存模型圖
內存溢出測試思路
接下來回答問題4:內存會帶來什麼問題?
當你明白內存有限,需求無限的時候,就應該能想到,會出現內存不夠用的情況,內存的各個區域都可能會出現不夠用的情況!
另外,由於Java堆內也可能發生內存泄露(Memory Leak),這裏簡要說明一下內存泄露和內存溢出的區別:
1、內存泄露是指分配出去的內存沒有被回收回來,由於失去了對該內存區域的控制,因而造成了資源的浪費。Java中一般不會產生內存泄露,因爲有垃圾回收器自動回收垃圾,但這也不絕對,當我們new了對象,並保存了其引用,但是後面一直沒用它,而垃圾回收器又不會去回收它,這邊會造成內存泄露,
2、 內存溢出是指程序所需要的內存超出了系統所能分配的內存(包括動態擴展)的上限。其實兩者還是有關聯的,如因爲沒有及時回收垃圾對象造成可用空間不足,這個時候再給新的對象分派內存空間的時候就會出現內存溢出的現象。
小結
最後兩個問題:內存如何管理?自動管理!那又是如何自動管理呢?請閱讀下篇博客:【JVM】自動內存管理機制《二》