2014-04-01 13 views
5

Chúng tôi có một phần cứng Android/phần mềm kết hợp mà chúng tôi cài đặt tại các trang web của khách hàng.Android sắp hết bộ nhớ, không có lý do rõ ràng

Trên một số máy tính bảng nhất định, bộ nhớ bắt đầu chạy thấp và Android bắt đầu thực hiện việc này bằng cách tiêu diệt ứng dụng của chúng tôi, sau đó được tự động khởi động lại bởi dịch vụ giám sát của chúng tôi.

Đây là mã chúng tôi sử dụng để giám sát per-app memory usage:

for(RunningAppProcessInfo info : am.getRunningAppProcesses()) {  
     int memused = am.getProcessMemoryInfo(
         new int[]{info.pid})[0].getTotalPss(); 

     Log.log(DIAG_INFO, "Process Mem: " + info.processName, memused); 
    } 

Đây là mã mà được chúng tôi overall system memory levels

  MemoryInfo mi = new MemoryInfo(); 
     am.getMemoryInfo(mi); 
     long availableMegs = mi.availMem/1048576L; 
     long threshold = mi.threshold /1048576L; 

availableMegs giọt đến gần threshold (64mb trong trường hợp của chúng tôi) và android bắt đầu giết chết thứ.

Tuy nhiên, khi chúng tôi xem xét việc sử dụng bộ nhớ trên mỗi quá trình, hãy cộng các giá trị TotalPss, chúng tôi nhận được tổng số bình thường. Không có quá trình nào ngoài tầm kiểm soát của bộ nhớ!

Bất kỳ ý tưởng nào về RAM bị mất?

+0

Bạn có bất kỳ kết nối mở nào với cơ sở dữ liệu/dịch vụ web của một số loại mà bạn có thể bị thiếu? – ksudu94

+2

Tôi nghĩ rằng tổng giá trị PSS chỉ cung cấp cho bạn việc sử dụng bộ nhớ không gian người dùng (Tất cả các quy trình không gian người dùng có thể truy cập bởi trình quản lý hoạt động). Tổng bộ nhớ là trình điều khiển nhân + trình điều khiển + người dùng. am.getMemoryInfo() nhận thông tin từ/proc/meminfo khá chính xác về tổng dung lượng bộ nhớ hệ thống. Điều gì đó có thể thực sự sai trên các tab đó. chỉ là một ý nghĩ !! – digitizedx

+1

tôi giả định 'getRunningAppProcesses()' có thể không trả về các sử dụng bộ nhớ mức hạt nhân hoặc hệ thống khác. có lẽ chỉ ở cấp ứng dụng/dalvik. – minhaz

Trả lời

4

Bạn đã sử dụng một công cụ bên ngoài như Bộ phân tích bộ nhớ Eclipse (MAT) chưa? Nó có thể cung cấp cho bạn một cái nhìn tốt hơn so với các phép đo trong ứng dụng của bạn. Nó không khó sử dụng, nhưng đòi hỏi một chút thiết lập. Here's a pretty good write-up cách sử dụng.

Giải pháp báo cáo bộ nhớ trên tất cả các ứng dụng trên thiết bị nằm trong khung nhìn Thông tin hệ thống của Eclipse. Để sử dụng nó, hãy mở phối cảnh DDMS và chọn thiết bị ở chế độ xem Devices. Sau đó, mở chế độ xem System Information và chọn Memory usage trong menu thả xuống bên trái. Bạn có thể nhận được ảnh chụp nhanh bộ nhớ được sử dụng trên thiết bị mỗi khi bạn nhấp vào Update from Device.

enter image description here

+0

Thật không may, các đơn vị trưng bày vấn đề bộ nhớ này là tại các trang web của khách hàng, trong thùng thép, trong không gian bận rộn, vì vậy nó không thẳng về phía trước để cắm chúng vào nhật thực. –

+1

Không có sẵn nhiều công cụ trong ứng dụng. Câu hỏi S/O http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android có câu trả lời rõ ràng để thảo luận về vấn đề bộ nhớ. Liên kết từ đó sẽ đưa bạn đến http://developer.android.com/training/articles/memory.html và từ đó http://developer.android.com/tools/debugging/debugging-memory.html. Có thể là một giá trị. – scottt

+0

cảm ơn sự giúp đỡ của bạn. mang đến cho bạn một ý kiến ​​mới, nhưng hãy chờ xem liệu ai đó có thể đưa ra câu trả lời cho câu hỏi ban đầu hay không, tức là làm sao chúng ta có thể tìm ra quy trình nào gây ra bộ nhớ thấp và tại sao chiến lược được sử dụng trong câu hỏi không hoạt động. –

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