2015-04-15 43 views
7

Tôi đã nghiên cứu rò rỉ bộ nhớ và sử dụng công cụ phân tích bộ nhớ để kiểm tra chúng. Vì vậy, như là một thực tế, tôi có đoạn mã sau đó rò rỉ một hoạt động như lớp bên trong vô danh giữ một tham chiếu đến hoạt động. Dưới đây là các mã:Rò rỉ bộ nhớ Lỗi kết thúc

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    exampleOne(); 
    } 

    private void exampleOne() { 
    new Thread() { 
     @Override 
     public void run() { 
     while (true) { 
      SystemClock.sleep(1000); 
     } 
     } 
    }.start(); 
    } 
} 

Tôi có những hình ảnh bộ nhớ máy phân tích để rò rỉ trên đây (6 phép quay): 6 Rotations of the activity. enter image description here

Đó là khá rõ ràng rằng có 6 đề chạy giữ một tham chiếu ngầm để bên ngoài hoạt động, và do đó ngăn chặn nó khỏi bị thu gom rác thải.

Bây giờ, hãy xem xét đoạn mã sau:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    exampleTwo(); 
    } 

    private void exampleTwo() { 
    new MyThread().start(); 
    } 

    private static class MyThread extends Thread { 
    @Override 
    public void run() { 
     while (true) { 
     SystemClock.sleep(1000); 
     } 
    } 
    } 
} 

Ở đây, tôi đã thực hiện các lớp tĩnh, do đó không có tham chiếu đến các hoạt động bên ngoài và GC có thể tự do đòi lại các đối tượng Hoạt động mà không bị cản trở bởi các chủ đề lớp học.

Dưới đây là ảnh chụp màn hình MAT cho cùng: 6 Rotations again.

enter image description here

Tôi có nhầm lẫn về tập thứ hai của ảnh chụp màn hình, nơi có 5 tài liệu tham khảo finalizer. Tôi googled về nó, và phát hiện ra rằng JVM thêm các đối tượng vào hàng đợi tham chiếu khi họ sắp được GCed. Tôi hy vọng rằng mặc dù điều này sẽ xảy ra, những thay đổi đó sẽ không có sẵn trong MAT vì tôi không nghĩ GC sẽ mất nhiều thời gian để giải phóng những tài liệu tham khảo đó. Ngay cả khi tôi sử dụng 13 phép quay, kết quả là như nhau, với 12 tham chiếu finalizer. Tôi có thể sai nhưng tôi nghĩ rằng MAT sẽ chỉ hiển thị 1 đối tượng Hoạt động vì những người khác phải đã được GC. Bất kỳ trợ giúp nào về hàng đợi tham chiếu cuối cùng và quá trình tiếp tục trong khi thu thập rác sẽ được đánh giá cao. Cảm ơn.

+0

Bạn đã cố gắng thu gom rác chưa? –

+0

Vâng, không có tôi đã không cố gắng buộc. Đối với trường hợp thứ hai, tôi nghĩ rằng GC sẽ tự động đòi lại bộ nhớ vì không có gì ngăn cản nó làm như vậy. Đặt đối tượng trong hàng đợi finalizer chỉ ra rằng thực sự bộ nhớ đã sẵn sàng để được khai hoang, nhưng sự nhầm lẫn của tôi là tại sao nó không được phản ánh trong MAT. –

Trả lời

3

enter image description here

Chọn Tổng quan về tổng quan. Nó cung cấp thông tin về số lượng đối tượng chờ finalizer để chạy và các thông tin liên quan khác của thread finalizer.