26

Tôi đang tìm hiểu về Sử dụng bộ nhớ bằng cách sử dụng MAT trong Eclipse. Mặc dù tôi đã gặp phải một vấn đề lạ. Để lại các ứng dụng nặng nề, tôi bắt đầu với ứng dụng "Hello World" lành tính nhất. Đây là những gì tôi nhận được như Thống kê số lượng trên Nexus 5, thời gian chạy ART, Lollipop 5.0.1.Dump Heap bất ngờ cho Hello World Android APP

ID: 1
Heap Kích: 25,429 MB
phân bổ: 15,257 MB
miễn phí: 10,172 MB
% sử dụng: 60%
# Objects : 43487

Heap dump của tôi cho tôi 3 nghi ngờ Rò rỉ bộ nhớ: Tổng quan

"Không thể đăng biểu đồ hình tròn vì danh tiếng thấp".

vấn đề nghi ngờ 1

Lớp "android.content.res.Resources", nạp bởi "", chiếm 10.166.936 (38.00%) byte. Bộ nhớ là được tích lũy trong một phiên bản của "android.util.LongSparseArray []" được tải bởi "".

Từ khóa android.util.LongSparseArray [] android.content.res.Resources

vấn đề nghi ngờ 2

209 trường hợp "android.graphics.NinePatch", nạp bởi "" chiếm 5.679,088 (21,22%) byte. Những trường hợp được tham chiếu từ một ví dụ của "java.lang.Object []", nạp bởi "" Từ khoá java.lang.Object [] android.graphics.NinePatch

vấn đề nghi ngờ 3

8 trường hợp "java.lang.reflect.ArtMethod []", được tải bởi "" chiếm 3,630,376 (13,57%) byte. Các trường hợp lớn nhất: • java.lang.reflect.ArtMethod [62114] @ 0x70b19178 - 1,888,776 (7,06%) byte. • java.lang.reflect.ArtMethod [21798] @ 0x706f5a78 - 782,800 (2,93%) byte. • java.lang.reflect.ArtMethod [24079] @ 0x70a9db88 - 546,976 (2,04%) byte. Từ khóa java.lang.reflect.ArtMethod []

Đây là tất cả bởi một mã đơn giản của:

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

}

Câu hỏi

  1. Tại sao các số đống quá lớn. ? Cũng như một lưu ý phụ ứng dụng đã tiêu thụ 52 MB RAM trong hệ thống.
  2. Trường hợp 209 này của NinePatch sắp tới? Tôi chỉ tạo ra dự án bằng cách thực hiện một "Tạo một dự án mới" trong Eclipse?
  3. Sự nghi ngờ rò rỉ đầu tiên của tài nguyên, Nó luôn xuất hiện trong phân tích ứng dụng của tôi. Nó thực sự là một nghi phạm?
  4. ArtMethod là gì? Liệu nó có phải làm điều gì đó với thời gian chạy ART không?
+0

Tôi không nghĩ rằng đây là một chức năng của hệ điều hành. Đối với ứng dụng của tôi, có phân bổ heap cao cho "android.content.res.Resources" và "android.graphics.NinePatch" trên thiết bị xhdpi/xxhdpi ngay cả trên KitKat. Xem câu hỏi này để biết thêm chi tiết: http://stackoverflow.com/q/30980112/3446669 – GunnerFan

Trả lời

7

Trong Lollipop thời gian chạy mặc định là ART i.e Thời gian chạy Android. được sử dụng thay cho thời gian chạy Dalvik được sử dụng trong các phiên bản Android cũ hơn. Trong Kitkat google phát hành phiên bản thử nghiệm của ART để nhận phản hồi từ người dùng. Trong JIT Dalvik (chỉ trong thời gian biên dịch) được sử dụng, có nghĩa là khi bạn mở ứng dụng sau đó chỉ có mã dex được chuyển đổi thành mã đối tượng. Nhưng trong ART tại thời điểm cài đặt chỉ có mã dex được chuyển thành mã đối tượng (tức là AOT trước khi biên dịch thời gian). Kích thước của mã đối tượng này nhiều hơn so với mã dex do đó ART cần RAM nhiều hơn Dalvik, vì ứng dụng AOT của nó hoạt động nhanh hơn trong ART so với Dalvik.

+1

Làm cách nào để làm rõ sự xuất hiện của các trường hợp NinePatch ..? –

0

Hôm qua tôi cũng gặp vấn đề này. Trong từ khóa log của bạn là "NinePatch". Trong trường hợp của tôi nguyên nhân là một bóng "giả" - hình ảnh nhỏ với kênh alpha gây ra rò rỉ tài nguyên. Đó là chi phí khoảng 60MB bộ nhớ bị rò rỉ cho tôi.