2015-12-14 28 views
7

Tôi đang gặp khó khăn khi cố gắng tìm một lỗ hổng Bộ nhớ có thể xảy ra. Tôi có một Hoạt động đang thực hiện một số công việc nặng nhọc trong Nền.Làm thế nào để Android Studio khởi tạo Garbage Collector và nó hoạt động như thế nào?

Sau một số tác vụ, ứng dụng sẽ tiêu thụ quá nhiều bộ nhớ. Có vẻ như nó không được làm sạch đúng cách.

Đây là hoạt động trong trạng thái mặc định:

enter image description here

Nếu tôi chạy nhiệm vụ mà các Hoạt động đang làm, bộ nhớ nhiều hơn và nhiều hơn nữa được phân bổ.

Hoạt động sau khi một số công việc: enter image description here

Lúc đầu, tôi nghĩ đây phải là một vấn đề bộ nhớ, gây GC có thể không đúng cách giải phóng bộ nhớ. Theo như tôi biết, GC có thể giải phóng bộ nhớ, nếu không có tham chiếu nào còn lại đối tượng. Đúng không?

Bây giờ đến phần mà confuses me:

Nếu tôi chạy GC từ Android Studio, bộ nhớ được làm sạch đúng cách và Hoạt động của tôi không bao giờ bị đóng cửa. Tôi chỉ cần sử dụng Android Studio GC khi có nhiều bộ nhớ được cấp phát. enter image description here

Đây là một ý tôi là:

enter image description here

Nói chung câu hỏi là:

Tại sao Android Studio GC có thể dọn dẹp bộ nhớ đúng và tại sao không nó hoạt động đúng với GC android tự động?

Tôi biết đây là một câu hỏi khá chung chung. Tôi chỉ muốn biết, nếu có nhiều loại bộ sưu tập rác hoặc những thứ như thế.

Đồng thời gọi số System.gc(); sẽ không dọn sạch bộ nhớ đúng cách.

Thông tin bổ sung:

Moto G 2nd gen

Android 5.0.2.

+0

"Đôi khi, Hoạt động hoặc ứng dụng đóng. Tôi nghĩ điều đó có thể do các vấn đề về bộ nhớ gây ra". Nếu ứng dụng chết b/c nó hết bộ nhớ, bạn sẽ nhận được một ngoại lệ Out-of-Memory mà bạn có thể thấy rõ ràng trong Logcat. Linh cảm của tôi là ứng dụng của bạn đang bị lỗi vì một lý do khác. Hãy thử tìm kiếm thông qua logcat để xem lý do tai nạn là gì. – Shmuel

+1

GC đồng thời chỉ thực hiện một phần bộ sưu tập để không gây ra tạm dừng đáng chú ý. Rõ ràng GC như được kích hoạt bởi Studio thực hiện quét toàn bộ GC. Một số đọc: https://source.android.com/devices/tech/dalvik/gc-debug.html – laalto

+0

@Shmuel Không có ngoại lệ. Thậm chí không có cảnh báo. – FlanschiFox

Trả lời

2

Có lẽ bạn có thể thử gọi một cách rõ ràng System.gc(); ở đâu đó định kỳ trong mã xử lý nặng của bạn?

+0

Xin lỗi tôi quên điều đó. Tôi đã cố gắng làm điều đó và nó không hoạt động. – FlanschiFox

+0

Nếu thực sự có rò rỉ bộ nhớ thì gọi System.gc() sẽ không giúp b/c bộ nhớ sẽ vẫn được giữ trên thông qua một tham chiếu ở đâu đó trong mã. – Shmuel

+0

@Shmuel Đúng, nhưng OP cho biết ứng dụng không sụp đổ khi ông nhấn nút GC trên studio android, mà tôi tưởng tượng đang thực hiện cuộc gọi đến 'System.gc()', do đó đề xuất của tôi. –

4

Rò rỉ bộ nhớ có thể xảy ra vì nhiều lý do. Một lý do phổ biến là các ảnh bitmap không được tái chế chính xác. Hạt giống khác của rò rỉ bộ nhớ là giữ bối cảnh trong các đối tượng. Ví dụ: bạn khởi chạy tác vụ không đồng bộ và chuyển ngữ cảnh vì bạn cần nó sau này. Trong khi nhiệm vụ không đồng bộ đang chạy nó giữ một tham chiếu đến ngữ cảnh và do đó toàn bộ hoạt động nằm trong bộ nhớ. Điều này cũng rất thường xuyên với các lớp ẩn danh và bên trong có tham chiếu đến lớp cha mẹ thường là một đoạn hoặc hoạt động.

Tôi đề nghị bạn sử dụng thư viện rò rỉ canary để phát hiện rò rỉ bộ nhớ và sử dụng các công cụ Android để theo dõi phân bổ để khám phá chính xác nơi rò rỉ bộ nhớ đang xảy ra.

+0

Cảm ơn câu trả lời. Bạn đã đề cập đến các lý do phổ biến, làm thế nào rò rỉ bộ nhớ xảy ra. Về cơ bản là tất cả đều là nguyên nhân của các tham chiếu còn lại ngay. Nhưng trong trường hợp của tôi, cuộc gọi GC của Android Studio đang dọn dẹp mọi thứ đúng cách. Vì vậy, nếu có thể là một số tài liệu tham khảo lạ, GC không thể làm sạch chúng lên phải không? – FlanschiFox

+0

Không chính xác. Bạn có thể thoát khỏi một hoạt động nhưng vẫn giữ tham chiếu trong vài giây. Vì vậy, khi bạn chạy GC sau vài giây, nó sẽ dọn sạch bộ nhớ đó. Tôi phải đối mặt với những tình huống mà tôi đã quay trở lại từ một số hoạt động và có tràn bộ nhớ, vì có thể một bitmap đã được tái chế và trì hoãn GC để giải phóng bộ nhớ đó, và do đó hết bộ nhớ đã xảy ra. Theo mặc định, GC không giải phóng bộ nhớ nếu nó không cần thiết (nó không đạt đến số lượng bộ nhớ tối đa cho phép). Nó cũng có thể là vấn đề khác của bạn. – jorgemf

+0

Tôi vui vì tôi thấy chủ đề này và nó là khá gần đây. Bạn đã @oberflansch tìm thấy lý do tại sao GC của studio android hoạt động tốt hơn? Tôi đang làm việc trên cùng một tình huống mà các ứng dụng ném tôi ra khỏi bộ nhớ và chương trình bị treo. Một điều tôi thấy trong ứng dụng của tôi gây ra vấn đề bộ nhớ là bởi vì tất cả các hình ảnh PNG mà tôi sử dụng trong các tài nguyên là quá lớn. Tôi tự hỏi tại sao các android không GC chính nó sau khi một hoạt động đóng cửa ngay cả tất cả các tài liệu tham khảo trong lớp thực sự đóng cửa ... bộ nhớ chỉ tiếp tục tăng mỗi khi một hoạt động mới được tạo ra, cho đến khi nó chết –

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