回覆列表
-
1 # 健全人
-
2 # 交易沒有銀彈
要研究記憶體洩露,先研究清楚gc機制,瞭解了gc你才會瞭解在什麼樣的情況下會產生記憶體洩露,對於c語言一般可以採用工具,比如ccmaloc或者dmalloc等等,java暫時還不清楚,不是搞java的
-
3 # 會點程式碼的大叔
要想知道如何預防記憶體洩漏,那麼就要知道記憶體為什麼會洩漏。
想要知道記憶體為什麼會洩漏,那麼先得知道Java的記憶體是哪裡。
Java的記憶體的組成程式計數器(Program Counter Register)、Java棧(VM Stack)、本地方法棧(Native Method Stack)、方法區(Method Area)、堆(Heap)。
程式計數器儲存指令地址,也就是存的是下一條執行所在的儲存地址。
不會發生記憶體溢位異常。
虛擬機器棧就是Stack,存放的是一個個的棧幀,每個棧幀對應一個被呼叫的方法。
StackOverflowError:執行緒請求的棧深度大於虛擬機器所允許的深度。比如遞迴呼叫一個方法。
OutOfMemoryError:虛擬機器在動態擴充套件棧時無法申請到足夠的記憶體空間。比如無限地建立執行緒,併為每個執行緒迴圈增加分配記憶體。本地方法棧同Java虛擬機器棧
Java堆儲存物件本身的以及陣列,堆是被所有執行緒共享的,在JVM中只有一個堆。
OutOfMemoryError:沒有記憶體完成例項分配,或者不能再擴充套件。比如無限new物件,在List中儲存(這樣不會被回收)
方法區儲存了每個類的資訊(包括類的名稱、方法資訊、欄位資訊)、靜態變數、常量以及編譯器編譯後的程式碼等,也是被執行緒共享的。
OutOfMemoryError:無法滿足記憶體分配要求。比如生成大量的動態類。
java有垃圾回收機制,大多數情況下不需要刻意去關心這方面。就我所瞭解到的java來說,只有IO流物件,資料庫連線物件等方面,記得隨手close就好了。