2010-11-19 28 views
6

có cách nào để kiểm tra xem một đối tượng có thể được tìm nạp bởi bộ thu gom rác không?Kiểm tra xem đối tượng có thể được tìm nạp bởi bộ thu gom rác

Một nơi nào đó trong mã của tôi, tôi đã có một tham chiếu đến một đối tượng:

MyObject mo = myObject; 

Sau đó, thông qua Eclipse Debugger, tôi có được vị trí bộ nhớ đối tượng. Sau đó, tôi đặt null tham khảo:

mo = null; 

Có cách nào để kiểm tra xem các đối tượng tham chiếu trước tại là thích hợp cho việc thu gom rác thải hoặc nếu có một nơi nào khác tham chiếu đến nó?

Thanks a lot,

Stefan

Trả lời

13

Bạn không thể thực hiện điều này khi chạy với một đối tượng tùy ý và trên thực tế, không thể thực hiện điều này một cách xác định. Tuy nhiên, có hai tùy chọn mà có thể phù hợp tùy thuộc vào nhu cầu của bạn:

  1. Hãy đống đổ sau khi bạn thiết lập các tham chiếu đến null, và sau đó tải nó lên trong một công cụ phân tích đống như jhat hoặc một hồ sơ mà hỗ trợ điều này. Những công cụ này sẽ cho phép bạn đi qua đường dẫn từ rễ GC và do đó kiểm tra xem đối tượng của bạn vẫn có thể truy cập được hay không.
  2. Bọc đối tượng trong một PhantomReference với số ReferenceQueue nhất định. Khi tham chiếu được enqueued, bạn biết rằng đối tượng đã được thu thập rác thải. (Thật không may, nếu tài liệu tham khảo là unqueued nó có thể là do đối tượng vẫn có thể truy cập, hoặc nó có thể là vì GC chỉ không kiểm tra các đối tượng được nêu ra.Như với tất cả các câu hỏi liên quan đến GC, thu gom rác thải không phải là một quá trình xác định!)

Nhìn chung, mặc dù tôi đồng ý rằng lựa chọn tốt nhất là trở thành biết các vấn đề rò rỉ bộ nhớ và thiết kế ứng dụng của bạn để tránh chúng. Nếu bạn có rò rỉ bộ nhớ, nó sẽ đủ rõ ràng, và sau đó bạn có thể tập trung năng lượng của bạn vào việc tìm kiếm vấn đề (một lần nữa bằng cách bán phá giá và phân tích đống cho các đối tượng có thể truy cập không chính xác).

Các bước trên tương đối tốn thời gian và không phải là thứ bạn thực hiện sau mỗi thay đổi chỉ để trấn an bản thân, mà là các công cụ bạn muốn sử dụng để điều tra một sự cố cụ thể.

+0

nó là một ứng dụng huuuuuuuuuuuuuge, nơi chúng tôi gặp vấn đề về bộ nhớ. một tối ưu hóa bây giờ sẽ dẫn đến cải thiện, nhưng không nhiều như chúng tôi mong đợi. do đó chúng tôi muốn biết liệu các vật thể cụ thể có được thu gom rác hay không. cảm ơn bạn đã trả lời, tôi sẽ dùng thử! – swalkner

+0

Đúng là bạn sẽ nhận được một thùng rác thuần túy: D – delive

1

số Điều duy nhất cần làm là phải cẩn thận và ghi nhớ rằng rò rỉ bộ nhớ có thể tồn tại trong Java khi viết ứng dụng của bạn.

Chỉ bạn mới có thể làm, là sử dụng các công cụ để tìm nơi rò rỉ bộ nhớ đến từ khi bạn nhận thấy vấn đề như vậy. Tôi rất muốn giới thiệu Memory Analyzer cho mục đích này.

+0

cảm ơn câu trả lời của bạn! Tất nhiên là cẩn thận là điều quan trọng nhất, nhưng đôi khi nó chỉ là không đủ hoặc có thể (xem câu trả lời cho andrzey doyle) – swalkner

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