Java GC理解

 

無用的內存對象無法被虛擬機回收
什麼是內存泄漏:
  1)內存不在GC回收的掌控之內了。
     那麼有幾個問題:GC、內存;
(1)什麼是垃圾回收機制-----GC?
       1.吃完了自己去把垃圾倒掉  ----------C語言---手動回收內存。
2.吃完直接走人,服務員回收餐具。吃飯的方式比較爽。-----GC
服務員怎麼知道他要哪個餐具回收呢?
(投訴)回收的標準低--只要有客戶不走--持有了餐具就不回收
GC會找一個合適的時機,一次性回收很多。
-------開發人員的素質。
總結:某個對象不再有任何的引用的時候纔會進行垃圾回收
提問:如果某個對象被別的對象引用了,就不能被GC回收嗎?
   否。(1)有軟引用、弱引用、虛引用;
   (2)最終:該對象一直往上追溯引用,能追溯到GC Root引用,能追溯到GC Root對象是誰
-------------GC回收機制原理是?-------------------------------------
內存有哪些?數據區:方法區、堆內存、棧內存
可以作爲GC Root引用點的是?(JVM裏有哪些內存不可以被回收的)
       JavaStack中的引用的對象
方法區中靜態的引用指向的對象
方法區中常量引用指向的對象
Native方法中JNI引用的對象
Thread----活着的線程
(2)怎麼判斷是垃圾對象呢?

 

   這是一個主觀的判斷。1.GC可以檢測到的:2.主觀

 

強引用:直接的對象引用

 -- 軟引用:當一個對象只有軟引用存在時,系統內存不足時此對象會被gc回收(gc--垃圾回收機制)

 -- 弱引用:當一個對象只用弱引用存在時,此對象會隨時被gc回收。

 

Java 把內存分成兩種,一種叫做棧內存,一種叫做堆內存
在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一
段代碼塊中定義一個變量時,java 就在棧中爲這個變量分配內存空間,當超過變量的作用域
後,java 會自動釋放掉爲該變量分配的內存空間,該內存空間可以立刻被另作它用。
堆內存用於存放由new 創建的對象和數組。在堆中分配的內存,由java 虛擬機自動垃
圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變量,
這個變量的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了
數組或者對象的引用變量,以後就可以在程序中使用棧內存中的引用變量來訪問堆中的數組
或者對象,引用變量相當於爲數組或者對象起的一個別名,或者代號。
引用變量是普通變量,定義時在棧中分配內存,引用變量在程序運行到作用域外釋放。
而數組&對象本身在堆中分配,即使程序運行到使用new 產生數組和對象的語句所在地代
碼塊之外,數組和對象本身佔用的堆內存也不會被釋放,數組和對象在沒有引用變量指向它
的時候,才變成垃圾,不能再被使用,但是仍然佔着內存,在隨後的一個不確定的時間被垃
圾回收器釋放掉。這個也是java 比較佔內存的主要原因。但是在寫程序的時候,可以人爲
的控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章