JAVA垃圾回收問題

1:垃圾收集是一種從無用對象回收其所佔用的內存,並使回收的內存能夠被再次利用的機制。

2:無用對象是指它不能被程序中處於活動狀態的部分的引用。

3:垃圾收集處於低優先級的線程內,當可用內存較少時運行,但不能保證何時運行。

4:不可能強制運行垃圾回收線程,但是調用語句System.gc()有可能激活垃圾收集程序.

5:在垃圾回收機制中,無法保證對象被垃圾回收的順序,也無法保證 finalize() 方法被調用的順序。

6:環形引用關不能阻止對象被回收.例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
 
{
 
B b;
 
}
 
class B
 
{
 
  A a;
 
}


執行下面的程序:

?
1
2
3
4
5
6
7
A  a=new A();
 
B  b=new B();
 
a.b=b;
 
b.a=a;


最後這二個對象都會被回收.

7:我們可以設置引用變量值爲null,來暗示垃圾收集線程來回收這引用變量的對象所佔用的內存。如果該對象屬於某監聽器對象,那麼,應該首先將這個監聽器註銷掉,否則該對象可能依然不能被垃圾回收。

8:所用對象都有一個finalize方法,他是從Object類繼承下來的,注意j2me中不可用.

9:什麼情況下垃圾回收線程會啓動?一般規則是:當存在無用對象時,將啓用垃圾收集線程,對無用對象佔用的內存進行釋放。什麼是無用對象?一般規則爲:沒有引用指向的對象稱爲無用對象.

10:垃圾回收線程的啓動時間由虛擬機內嵌算法來進行調度,程序員無法直接調度它,它的運行只有二種情況:系統在運行過程中處於空閒狀態和內存資源使用不足。

11:無用對象判斷方法補充:沿着對象的引用的被飽含關係追溯不到根對象或活動線程時,則這個對象被稱爲無用對象.

如下面所示,對象A、B、C、D、E不是無用對象,而G,H是無用對象.其中main代表根對象.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main
  
A
  
C
  
D
  
B
  
E
  
G
  
H


12:垃圾回收線程管理的內存區域:在JAVA語言中,內存的分配與其他的語言也是一樣的,分爲代碼區、數據區、堆區、棧區,垃圾回收能夠管理的內存區域僅限於堆區.在類中聲明的靜態數據內存分配在數據區中,因此,靜態數據不會被垃圾回收線程回收.


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jsljn272/archive/2005/11/21/533677.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章