21

Tôi đang viết một quy trình để đồng bộ số lượng lớn các liên hệ với cơ sở dữ liệu Danh bạ Android. Việc tải xuống hoạt động tốt cho khoảng 700 địa chỉ liên lạc sau đó tôi liên tục nhận được một lỗi bộ nhớ heap mà gọi số vô hạn của báo cáo GC và kết thúc lại khởi động lại điện thoại. Tôi đang phải đối mặt với vấn đề trên HTC mong muốn.Android dalvikvm-heap: Kẹp mục tiêu GC heap

Tôi đã kiểm tra kích thước của ứng dụng bằng cách sử dụng công cụ phân vùng Heap từ DDMS cũng như trích xuất tệp hprof bằng Debug.dumpHprofData. Cả hai bản ghi chỉ ra rằng kích thước Heap là khoảng 2,4MB.

Tuy nhiên tôi nhận được các bản ghi sau đó chỉ ra rằng kích thước heap hơn 32.MB

dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB 
dalvikvm(92): GC_FOR_MALLOC freed 2 objects/48 bytes in 313ms 

tôi đã chèn sau báo cáo đăng nhập trong vòng lặp mà contatcs tôi tải Logic đã được viết.

Log.e("Memory", "free mem =" +runtime.freeMemory()); 
Log.e("Memory", "total memory =" +runtime.totalMemory()); 

Đây là những giá trị ban đầu và cuối cùng của báo cáo kết quả in

--------------------------------------------------------------- 
11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248 
11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464 

--------------------------------------------------------------- 

11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640 
11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752 

--------------------------------------------------------------- 

Điều này cho thấy rằng apperently không có rò rỉ bộ nhớ hiện diện trong logic địa chỉ liên lạc đồng bộ.

Có thể ai đó vui lòng cho tôi biết vì sao kích thước heap tăng lên (tối đa 32.00Mb) đến mức thiết bị tự khởi động lại? Tôi mới sử dụng Android và Java, vì vậy hãy dễ dàng với tôi:) .....

+1

Bạn có thể liên kết hoặc dán mã nguồn có liên quan không? –

+0

Thấy một số mã sẽ giúp ích. Bất kể - tại sao bạn cần phải lưu trữ tất cả các số liên lạc trong bộ nhớ? Thông thường khi đồng bộ hóa các liên hệ, một người sẽ thiết lập một con trỏ và thực hiện truy vấn. Bạn có thể không cần phải giữ tất cả các số liên lạc trong bộ nhớ cùng một lúc. Tui bỏ lỡ điều gì vậy? – Guy

+1

Là id quá trình cho các đường dalvikvm trong nhật ký quá trình của bạn? – Ifor

Trả lời

8

Trong khi đây không phải là câu trả lời hay nhất, tôi khuyên bạn nên xem video về cuộc trò chuyện Memory management for Android Apps tại Google IO 2011. Nó làm một công việc tuyệt vời giải thích làm thế nào để quản lý bộ nhớ và những gì các thông điệp bạn đang nhìn thấy thực sự có ý nghĩa.

2

Bạn cần đăng mã của mình để mọi người trợ giúp. Nếu không, tôi giả định hai điều:

  • Vì điện thoại của bạn bị lỗi, bạn phải làm điều gì đó tuyệt vời cho phép chương trình của bạn chạy bên ngoài vùng bộ nhớ được cấp phát của máy ảo.
  • Bạn có lưu trữ tất cả địa chỉ liên hệ trong Danh sách hoặc Mảng không? Nếu vậy, có vấn đề của bạn. Đây là những gì Streams là tốt lúc sửa chữa.
  • 1

    Bằng cách tải xuống, bạn có nghĩa là tìm nạp dữ liệu từ một vị trí từ xa? Có vẻ như bạn đang giữ rất nhiều tham chiếu đến dữ liệu của bạn trong bộ nhớ. Bạn có phải không? Tùy thuộc vào những gì bạn đang cố gắng đạt được, thường có một vài điều bạn có thể thử để giảm thiểu dung lượng bộ nhớ của bạn. Để bắt đầu, tôi chắc chắn rằng tôi không sử dụng bất kỳ tham chiếu String nào nhưng tôi sẽ truyền trực tiếp dữ liệu đến người tiêu dùng. Ngoài ra, hãy thử xử lý tất cả dữ liệu của bạn theo khối. Bạn cũng cần phải lưu dữ liệu vào hệ thống tập tin? Nếu có, hãy truyền trực tiếp vào hệ thống tệp và tránh lưu trữ bộ nhớ cùng nhau. Nếu bạn đăng một số mã, điều đó có thể hữu ích.

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