2010-08-17 33 views
7

Tôi có hoạt động trên Android và dịch vụ được triển khai bằng aidl. Hoạt động như một nhà vô địch, tôi có thiết lập gọi lại để chuyển một số thông báo luồng trở lại giao diện người dùng và có vẻ như hoạt động tốt, ngoại trừ rất nhiềuGREF tăng/giảm trong dịch vụ đa luồng (aidl) - điều đó có nghĩa là gì?

GREF đã tăng lên 101, 201,301,401, 501 .. v.v. và GREF đã giảm. Tôi đã làm một số tìm kiếm trực tuyến và thấy rằng nó đã làm w/Tài liệu tham khảo toàn cầu.

08-17 02:31:19.735: DEBUG/dalvikvm(2558): GREF has increased to 301 
... 
08-17 02:31:25.823: DEBUG/dalvikvm(2558): GREF has increased to 401 
... 
08-17 02:31:36.772: DEBUG/dalvikvm(2558): GREF has increased to 501 
... 
08-17 02:31:42.694: DEBUG/dalvikvm(2558): GREF has increased to 601 
... 
08-17 02:31:48.695: DEBUG/dalvikvm(2558): GREF has increased to 701 
... 
08-17 02:31:59.883: DEBUG/dalvikvm(2558): GREF has decreased to 599 
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 499 
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 399 
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 299 
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 199 

Tôi đã tìm kiếm và thấy rằng hầu hết các nhận xét về điều này khá cũ. Mối quan tâm của tôi là tôi đang triển khai ứng dụng/dịch vụ của mình một cách chính xác và muốn biết cách tôi có thể theo dõi những gì đang gây ra GREF tăng lên. Bất kỳ suy nghĩ/đề nghị được hoan nghênh. Cảm ơn!

Chương trình cơ bản Dòng

Client -> Creates Callback 
Client -> Starts Service 
Service -> Inits & Starts CountDownTimer 
Service.CountDownTimer.onFinish() -> DownloadAndParse() 
DownloadAndParse() -> initialize new saxRequest(), new Handler for this request. 
Service.Handler->beginBroadcast() 
Client.CallbackStub -> updateUI() 
Client.CallbackStub -> service.startCountDownTimer() 

Hy vọng rằng điều này làm cho ý nghĩa. Tôi sẽ đăng mã ở đây, nhưng có quá nhiều tệp khác nhau. Tôi nghĩ rằng tôi sẽ cố gắng và đặt dòng chảy lên để xem nếu có bất cứ điều gì rõ ràng ... Điều duy nhất tôi có thể thấy là có thể tái sử dụng saxRequest() chứ không phải là tạo ra một ví dụ mới ... Tôi sẽ cố gắng mà bây giờ thực sự , nhưng tôi thực sự muốn biết về tác động của GREF và Bộ sưu tập rác ..

Trả lời

18

Đây là những tài liệu tham khảo toàn cầu của JNI. Nếu bạn không viết mã gốc, bạn không có quyền kiểm soát trực tiếp chúng. Các thông điệp tường trình xuất hiện khi CheckJNI được bật, được bật theo mặc định cho các bản dựng kỹ thuật và trình giả lập.

Các thông báo chỉ có nghĩa là mã gốc là nói cho VM rằng nó không được phép loại bỏ một số đối tượng. Về bản chất, refs toàn cầu là một cách để mã nguồn gốc thêm các tham chiếu vào bộ gốc của GC. Giả sử mã gốc được viết chính xác, các tham chiếu toàn cầu sẽ bị xóa khi mã gốc không còn cần đến chúng nữa.

Nguyên nhân duy nhất gây lo ngại là nếu số lượng ref toàn cầu tiếp tục tăng, vì điều đó sẽ gợi ý rò rỉ tham chiếu toàn cầu. Vì VM không thể giải phóng các đối tượng, một rò rỉ ref toàn cục cuối cùng sẽ làm cho máy ảo hết bộ nhớ. Để giúp xác định các vấn đề như vậy, một nắp được đặt vào số lượng các tham chiếu toàn cầu khi CheckJNI được kích hoạt (giới hạn hiện tại là 2000).

+2

Cảm ơn bạn rất nhiều. Tôi thực sự sắp bắt đầu viết một số mã JNI, vì vậy việc biết điều này sẽ giúp ích, Không bao giờ để ý đến nó trước đây .. Thật lạ lùng phải mất hai năm để xem cái gì đó lần đầu tiên. Cảm ơn bạn rất nhiều, bạn đã trả lời câu hỏi của tôi .. – Chrispix

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