2012-06-29 22 views
24

Tôi hiện đang điều tra các sự cố thu gom rác bằng ứng dụng Android của mình và tôi tò mò muốn biết GC_FOR_ALLOC có mang tính chất lớn hơn các thông báo GC khác, chẳng hạn như GC_CONCURRENT không.GC_FOR_ALLOC có "nghiêm trọng" hơn khi điều tra việc sử dụng bộ nhớ không?

Từ sự hiểu biết của tôi, GC_CONCURRENT đang làm những gì mà người thu gom rác phải làm. Heap đã đạt đến một giới hạn cụ thể, tốt hơn hãy dọn dẹp bộ nhớ.

GC_FOR_ALLOC đề xuất với tôi điều gì đó nghiêm trọng hơn đang xảy ra nếu tôi đang cố gắng tạo một đối tượng và không còn ký ức để làm điều đó.

Có mức độ ưu tiên hoặc "mức độ nghiêm trọng" cho thông báo GC không?

+0

bạn đã đọc http://stackoverflow.com/questions/895444/java-garbage-collection-log-messages chưa? các liên kết được đề cập trong câu trả lời được chấp nhận có thể giúp bạn – kommradHomer

+0

@kommradHomer Cảm ơn bạn đã trả lời nhưng tôi không nghĩ rằng áp dụng ở đây vì nó là máy ảo dalvik sẽ thực hiện quét GC. Tôi vẫn thấy liên kết là một thông tin, nếu dày đặc, đọc. –

Trả lời

53

Trong một nghĩa nào đó, GC_FOR_ALLOC là nghiêm trọng hơn GC_CONCURRENT, vì GC_FOR_ALLOC có nghĩa là không có đủ bộ nhớ trống để hoàn thành một yêu cầu cấp phát, do đó, một thu gom rác thải là cần thiết, trong khi GC_CONCURRENT chỉ có nghĩa là GC cảm thấy như chạy, thường vì số lượng bộ nhớ miễn phí đã trở thành thấp hơn một ngưỡng nhất định sau khi phân bổ.

Một GC_FOR_ALLOC là do bản thân không phải là một dấu hiệu của một vấn đề trong ứng dụng của bạn tuy nhiên:

  • các ứng dụng Android bắt đầu với một đống nhỏ mọc (lên đến một điểm) khi các ứng dụng đòi hỏi nhiều bộ nhớ hơn và nhiều hơn nữa, và a GC_FOR_ALLOC được thực hiện trước khi tăng kích thước của heap. Trong trường hợp này, GC_FOR_ALLOC hoàn toàn bình thường.
  • Nếu bạn cấp phát bộ nhớ nhanh hơn GC đồng thời có thời gian giải phóng bộ nhớ, GC_FOR_ALLOC là không thể tránh khỏi. Và không có gì sai với việc cấp phát bộ nhớ nhanh hơn GC đồng thời có thể giải phóng bộ nhớ.

Một loại nghiêm trọng hơn của GC trên Android là GC_BEFORE_OOM, mà được thực hiện khi một yêu cầu phân bổ không ngay cả sau khi GC_FOR_ALLOC và khi đống ứng dụng đã phát triển lớn như nó được phép có. Khi điều này xảy ra, như một phương sách cuối cùng, Dalvik cũng sẽ cố gắng giải phóng SoftReferences, trước khi thực hiện một nỗ lực cuối cùng trong việc cấp phát bộ nhớ và nếu điều đó không ném ra một ngoại lệ OutOfMemory.

Nếu bạn tò mò nhìn vào mã cho logic này, nó là trong tryMalloc() trong dalvik.git/vm/alloc/Heap.cpp

Dù sao, nếu bạn không nhớ, tôi nghi ngờ rằng nhìn vào sản lượng logcat là cách hiệu quả nhất để gỡ lỗi các vấn đề thu gom rác của bạn. Tôi không biết vấn đề cụ thể bạn đang gặp phải, nhưng bạn đã xem xét các công cụ như Trình theo dõi phân bổ trong DDMS và phân tích các vùng đống với sự trợ giúp của công cụ hprof-conv? (Xem http://android-developers.blogspot.se/2011/03/memory-analysis-for-android.html ví dụ để bắt đầu.)

+0

Cảm ơn bạn đã trả lời. Ứng dụng của tôi đã xuất hiện trong môi trường tự nhiên trong một thời gian và chúng tôi đang làm việc để điều chỉnh nó. Một trong những chi phí lớn là GC chạy tới 30 lần trong một cửa sổ 4 giây. Nó dường như thực sự quá mức. Với một số tối ưu hóa, GC chạy 6 lần ngay bây giờ - nhưng FOR_ALLOC là cuộc gọi duy nhất đang được thực hiện. Nhưng điều đó có ý nghĩa bây giờ. –

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