2009-06-17 28 views
5

Tôi muốn làm cho một số dữ liệu dễ dàng có sẵn trong suốt ứng dụng của tôi. Tôi có một vài biến trong một lớp với dữ liệu tĩnh, được viết và đọc từ một số điểm khác nhau.Khi nào việc thu gom rác xảy ra cho một lớp học có dữ liệu tĩnh

Điều này làm việc tốt trong một thời gian, nhưng bây giờ tại một thời điểm mà tôi mong đợi để có thể lấy một ArrayList tất cả tôi nhận được là "null".

Tôi tự hỏi liệu lớp tĩnh đã được gửi đến "bộ thu gom rác" chưa. Bạn không chắc chắn những gì đang xảy ra, nếu bạn có thể giúp điều đó sẽ được nhiều đánh giá cao.

+3

Tôi biết các biến toàn cục là xấu. – Ankur

+1

"Lớp tĩnh" là gì? Bạn có nghĩa là một lớp học với các biến tĩnh, hoặc một lớp bên trong lồng nhau? – skaffman

+0

Xin lỗi, bạn đã đúng. Một lớp với các biến tĩnh và các phương thức – Ankur

Trả lời

2

Nếu bạn có thể gọi hàm này ngoài đối tượng sẽ không bị thu gom rác vì vẫn có tham chiếu đến nó. Bạn có lưu trữ một con trỏ vào danh sách mảng hoặc đối tượng không?

+0

Bản thân ArrayList – Ankur

9

bạn có thể thử để làm cho nó thức, và biên dịch lại mã để xem nếu một số lớp khác THAY ĐỔI tài liệu tham khảo để null:

public class Global { 

    public final static List<String> data = new ArrayList<String>(); 

} 

này cho phép viết:

Global.data.add("foo"); 

nhưng không:

Global.data = null; 
+1

Hãy thử điều này, một lời khuyên tốt. +1 –

+0

Hoặc đặt điểm ngắt trong trình gỡ lỗi để kích hoạt nếu biến được đặt thành rỗng. Cung cấp cho bạn một stacktrace tiện dụng và tất cả mọi thứ =) – mikek

+1

Đây không phải là một lớp tĩnh. Đây là một lớp bao gồm một biến tĩnh, mà không phải là điều tương tự. – UncleO

0

Bộ thu gom rác sẽ không vứt bỏ e một lớp tĩnh bởi chính nó. Bộ thu gom rác chỉ có thể hoạt động nếu không có tham chiếu đến lớp. Miễn là bạn có thể gọi chính lớp đó, có một tham chiếu. Ngoài ra, bạn không thể chắc chắn nói khi nào bộ thu gom rác đang hoạt động. Nó chạy như một số loại nếu công việc nhàn rỗi trong nền.

Tôi khuyên bạn nên thêm một số thông báo theo dõi gỡ lỗi vào lớp tĩnh của bạn để bạn có thể thấy khi nào nó được gọi. Phải có một số tác dụng phụ thay đổi ArrayList của bạn khi chạy.

3

Tôi có một vài biến trong lớp tĩnh , được viết tới ... tại một số điểm khác nhau.

Khi bạn tự thú nhận, vì vậy, có thể gán giá trị cho biến tại một hoặc nhiều điểm khác nhau. :)

0

Giá trị tĩnh có thể là rỗng nếu nó nằm trong một chuỗi khác. Nếu không, nó sẽ luôn luôn ở đó nếu bạn không nói với nó cái gì khác.

3

Như Svetlio đã nói, GC chỉ chạy trên các đối tượng trên đống mà không được tham chiếu ở bất kỳ đâu. Điều này có thể mất x số chu kỳ tùy thuộc vào chiến lược GC và VM bạn đang sử dụng. Vì các lớp tĩnh được tham chiếu vô thời hạn, chúng sẽ không bao giờ là GC'd.

Vì vậy, một số vấn đề vẫn còn:

  1. Nó có thể là một phần của chương trình thiết lập lớp học của bạn để null? Bạn có thể thiết lập một cờ gỡ lỗi để hét lên bất cứ khi nào arraylist của bạn được thiết lập null?
  2. Điều này có xảy ra tại một thời điểm cụ thể không? Lúc khởi động? Sau một lúc?
  3. Câu hỏi câm, nhưng bạn không chạy new trên lớp tĩnh của mình bất kỳ lúc nào?

Cuối cùng, như bạn đã nói ... biến tĩnh hút cho bất kỳ điều gì khác hơn là hằng số: P Cấu hình singleton thực sự rẻ và tốt hơn rất nhiều.

1

Lớp tĩnh không giống như biến tĩnh. Nó chỉ là một cách sử dụng khác cho từ khóa "tĩnh". Trong trường hợp này, nó cho biết lớp là cấp cao nhất nhưng được khai báo trong lớp khác.

Vì vậy, điều đó có nghĩa là bạn có thể khởi tạo nhiều đối tượng của lớp này, không giống như nói biến tĩnh, chỉ có một bản sao.

Bạn đang khởi tạo nhiều hơn một trong số này và mong đợi chúng giống nhau không?

GC dường như không phải là vấn đề. Nếu đối tượng không còn ở đó nữa, bạn không thể lấy ra ArrayList từ nó.

+0

câu hỏi là sai – dfa

2

Thu gom rác cho các lớp học xảy ra nếu trình nạp lớp của nó bị thu gom rác. Xem ví dụ this question. Đã có một thời gian sắp xếp trong một Java trước đó (tôi nghĩ trong 1.2), nơi các trường tĩnh không được GC xem xét và rất nhiều lớp tải/nạp lại gây ra các trường trống.

+0

1.0/1.1 có lỗi trong đó các lớp có thể là rác được thu thập bằng trình tải lớp có thể truy cập. –

3

Câu hỏi ban đầu:

Khi nào thu gom rác thải xảy ra cho một lớp tĩnh?

Trả lời: Khi ứng dụng của bạn thoát.

+0

Thực ra, điều đó có thể xảy ra khi lớp học không còn được sử dụng nữa. Mặc dù điều này thường chỉ khi bộ nạp lớp được dọn dẹp. ;) –

0

những gì về một cái gì đó như thế này

private static List<T> list; 


public static List<T> getList() { 
    if(list==null) 
     initList(); //private static method init list like you want 
    return list; 
} 
Các vấn đề liên quan