標籤:
JAVA 記憶體管理總結
1. java是如何管理記憶體的
Java的記憶體管理就是對象的分配和釋放問題。(兩部分)
分配 :記憶體的分配是由程式完成的,程式員需要通過關鍵字new 為每個對象申請記憶體空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。
釋放 :對象的釋放是由記憶體回收機制決定和執行的,這樣做確實簡化了程式員的工作。但同時,它也加重了JVM的工作。因為,GC為了能夠正確釋放對象,GC必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都需要進行監控。
2. 什麼叫java的記憶體泄露
在Java中,記憶體流失就是存在一些被分配的對象,這些對象有下面兩個特點,首先,這些對象是可達的,即在有向圖中,存在通路可以與其相連(也就是說仍存在該記憶體對象的引用);其次,這些對象是無用的,即程式以後不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定為Java中的記憶體流失,這些對象不會被GC所回收,然而它卻佔用記憶體。
3. JVM的記憶體地區組成
java把記憶體分兩種:一種是棧記憶體,另一種是堆記憶體1。在函數中定義的基本類型變數和對象的引用變數都在函數的棧記憶體中分配;2。堆記憶體用來存放由new建立的對象和數組以及對象的執行個體變數 在函數(代碼塊)中定義一個變數時,java就在棧中為這個變數分配記憶體空間,當超過變數的範圍後,java會自動釋放掉為該變數所分配的記憶體空間;在堆中分配的記憶體由java虛擬機器的自動記憶體回收行程來管理
堆和棧的優缺點
堆的優勢是可以動態分配記憶體大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配記憶體的。
缺點就是要在運行時動態分配記憶體,存取速度較慢; 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。
另外,棧資料可以共用。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。
4. Java中資料在記憶體中是如何儲存的
java記憶體管理機制