2012-10-29 32 views
7

Tôi đang tạo một chương trình demo mẫu để làm cho tôi hiểu rằng làm cách nào tôi có thể phân bổ tham chiếu biến tĩnh, phương thức trong java bằng cách sử dụng bộ thu gom rác?Bộ thu gom rác có hoạt động trên các biến tĩnh hoặc các phương thức trong java không?

Tôi đang sử dụng Tham chiếu yếu để không ngăn chặn bộ thu gom rác.

Lớp Sample

public class Sample { 

    private static String userName; 
    private static String password; 
    static { 
     userName = "GAURAV"; 
     password = "password"; 
    } 
    public static String getUserName(){ 
     return userName; 
    } 
    public static String getPassword(){ 
     return password; 
    } 
} 

Lớp User

import java.lang.ref.WeakReference; 

public class User { 

    public static void main(String[] args) { 
     /** 
     * Created one object of Sample class 
     */ 
     Sample obj1 = new Sample(); 
     /** 
     * I can also access the value of userName through it's class name 
     */ 
     System.out.println(obj1.getUserName()); //GAURAV 
     WeakReference<Sample> wr = new WeakReference<Sample>(obj1); 
     System.out.println(wr.get()); //[email protected] 
     obj1 = null; 
     System.gc(); 
     System.out.println(wr.get()); // null 
     /** 
     * I have deallocate the Sample object . No more object referencing the Sample oblect class but I am getting the value of static variable. 
     */ 
     System.out.println(Sample.getUserName()); // GAURAV 
    } 

} 
+0

Bộ thu gom rác thu thập các đối tượng chứ không phải các biến. Biến là một vùng chứa chứa/chứa/tham chiếu. Và quan trọng nhất, trong hầu hết các trường hợp, bạn không muốn gây rối với bộ sưu tập rác. – ignis

+0

Quá nhiều số liệu thống kê. Tại sao bạn trộn chúng? –

+0

Không, bạn sẽ phải dọn dẹp sau bản thân – Nactus

Trả lời

16

lĩnh vực tĩnh có liên quan đến lớp học, không phải là một ví dụ cá nhân.

các trường tĩnh được dọn sạch khi Trình nạp lớp chứa lớp được tải. Trong nhiều chương trình đơn giản, đó là không bao giờ.

Nếu bạn muốn các trường được liên kết với một trường hợp và làm sạch thì cá thể được làm sạch, làm cho chúng là trường thể hiện chứ không phải trường tĩnh.

+0

Ngoài ra, không phải là các chuỗi ký tự không bao giờ GC, dù sao, bởi vì chúng được giữ trong hồ bơi Chuỗi ký tự? Hoặc đó cũng là trên cơ sở mỗi lớp học? –

+1

AFAIK Chuỗi chữ được làm sạch. Nếu bạn thực tập() nhiều chuỗi ngẫu nhiên và loại bỏ chúng, bạn sẽ không nhận được một OOME. Trường hợp chuỗi nội bộ là một vấn đề là lên đến Java 6 họ đã ở trong PermGen và nó đã có thể để có được một OOME làm đầy không gian này khi bạn đã có rất nhiều đống. Trong Java 7 String literals nằm trong heap. –

+0

Cảm ơn tất cả các câu trả lời của bạn. –

4

System.gc() không buộc thu gom rác để chạy. Nó chỉ là một gợi ý cho JVM mà có lẽ đó là thời điểm tốt để chạy bộ thu gom rác. Xem câu hỏi này - When does System.gc() do anything

3

Bạn nên hiểu rằng System.gc(); không gọi bộ thu gom rác. Nó chỉ cần lịch sự yêu cầu GC loại bỏ một số rác. GC quyết định phải làm gì và thời điểm bắt đầu. Vì vậy, đừng nghĩ rằng bạn sẽ thấy bất kỳ hiệu ứng tức thì nào khi gọi số System.gc();, chỉ định null cho biến số khác.

GC xóa tất cả các đối tượng không thể truy cập được bằng bất kỳ cách nào. Vì vậy, nếu mã thoát khỏi khối nơi biến được xác định đối tượng có thể được gỡ bỏ. Assiging null loại bỏ tham chiếu. Tham chiếu yếu không ngăn GC xóa đối tượng.

Tôi hy vọng lời giải thích này sẽ hữu ích.

4

Khác với các chương trình, để trả lời câu hỏi của bạn

  1. số Phương pháp không phải là thu gom rác thải vì họ không tồn tại trong đống ở nơi đầu tiên.

  2. biến tĩnh thuộc về dụ Class và không sẽ được thu gom rác thải lần nạp (đối với hầu hết các classloaders chung)

Các vấn đề liên quan