12/08/2018, 16:35

View the Java Heap and Memory Allocations with Memory Profiler

Memory Profiller là một thành phần của bộ công cụ Android Profiler , công cụ này có thể giúp bạn nhận biết được nguy cơ memory leak hoặc churn, những thứ có thể làm ứng dụng của bạn hoạt động thiếu ổn định hoặc có thể dính crash. Để sử dụng công cụ Memory Profiller: Click View > Tool Windows ...

Memory Profiller là một thành phần của bộ công cụ Android Profiler , công cụ này có thể giúp bạn nhận biết được nguy cơ memory leak hoặc churn, những thứ có thể làm ứng dụng của bạn hoạt động thiếu ổn định hoặc có thể dính crash. Để sử dụng công cụ Memory Profiller:

  1. Click View > Tool Windows > Android Profiler (hoặc chọn Android Profiler trên thanh toolbar).
  2. Chọn thiết bị test và tiến trình ứng dụng mà bạn muốn điều tra từ thanh Android Profiler. Nếu bạn đã kết nối thiết bị mà không thấy danh sách này, chắc chắn rằng thiết bị của bạn đã được bật chế độ debug.
  3. Chọn bất cứ đâu trên trên MEMORY timeline để mở Memory Profiler.

Why you should profile your app memory

Android cung cấp một -bộ quản lý bộ nhớ - Nhiệm vụ của nó là quyết định những đối tượng nào không còn được sử dụng nữa, khi đó, GC (garbage collector) sẽ giải phóng những vùng nhớ không còn được về lại bộ nhớ heap. Cách thức mà Android phát hiện và định vị được vùng nhớ không được sử dụng vẫn đang được họ cải thiện liên tục, nhưng đối với phần lớn các phiên bản, hệ thống này có thể tạm dừng tiến trình ứng dụng, phần lớn những hoạt động này không thể lường trước được. Tuy nhiên, nếu ứng dụng của bạn lưu dữ liệu nhanh hơn việc hệ thống có thể thu thập chúng thì ứng dụng có thể bị đơ trong khi hệ thống giải phóng đủ bộ nhớ để thỏa mãn yêu cầu vùng nhớ của nớ.

Ngay cả khi ứng dụng của bạn không hoạt động một cách chậm chạm thì nếu xảy ra LM (leak memory), ứng dụng vẫn sẽ giữ vùng nhớ đó ngay cả khi nó đang chạy ở background, hành vi này gây ra sự lãng phí hiệu năng không cần thiết để có thể chạy GC. Sau cùng, hệ buộc sẽ kill ứng dụng để lấy lại bộ nhớ, điều này có nghĩa khi bạn cho app trở lại foreground, nó sẽ khởi tạo lại từ đầu.

Vậy, để tránh những rắc rối trên, việc sử dụng công cụ Memory Profiller rất cần thiết để:

  • Quan sát được việc phân bổ vùng nhớ theo thời gian thực để có thể phán đoán được những vấn đề về hiệu suất xử lý.
  • Xuất ra được tập tin dữ liệu của Java heap để thấy được những đối tượng nào đang được lưu trữ vào bất cứ thời điểm nào.
  • Ghi lại việc lưu trữ dữ liệu theo những trường hợp tương tác khác nhau của người dùng để phán đoán chính xác được đoạn mã nào lưu trữ quá nhiều dữ liệu trong một khoảng thời gian ngắn hoặc việc lưu trữ gây ra LM.

Memory Profiler overview

Đây là mà hình công cụ khi bạn mở chọn:

Mình sẽ giải thích các thành phần của công cụ này

  1. Nút này dùng để thực thi một GC
  2. Xuất ra file heap dump
  3. Ghi lại quá trình lưu trữ dữ liệu theo thời gian. Nút này chỉ xuất hiện khi bạn sử dụng thiết bị test chạy Android 7.1 hoặc thấp hơn.
  4. Phóng to, thu nhỏ timeline
  5. Nhảy đến thời điểm hiện tại của hệ thống.
  6. Thể hiện Những sự tương tác của người dùng như khi người dùng click app, ...
  7. Timeline của việc sử dụng dữ liệu, gồm một số thông tin:
  • Một biểu đồ thể hiện mức tiêu thụ bộ nhớ.
  • Đường gạch ngang thể hiện số lượng đối tượng đang được lưu trữ
  • Icon thùng rác xuất hiện khi có hoạt động GC

How memory is counted

Hệ thống sẽ phân chia dữ liệu theo từng loại sau:

  1. Java: dữ liệu từ việc lưu trữ các đối tượng Java hoặc Kotlin.
  2. Native: dữ liệu từ việc lưu trữ các đối tượng của Native code (C / C++)
  3. Graphic: dữ liệu phục vụ cho bộ nhớ đệm để hiện thị pixels trên màn hình, kể cả GL surfaces, GL textures (chú thích phát là những dữ liệu này được chia sẽ với CPU, không phải với GPU)
  4. Stack: dữ liệu dành cho ngăn xếp của cả java và native, nó thường liên quan đến số lượng các threads đang chạy.
  5. Code: dữ liệu mà ứng dụng dùng cho code và tài nguyên, như dex bytecode, optimized hoặc compiled dex code, .so libraries, fonts ...
  6. Other: những thứ mà hệ thông không thể phân loại được
  7. Allocated: số lượng đối tượng của java/ kotlin đang được lưu trữ, không phải gồm các đối tương native.

Theo kinh nghiệm của mình thì việc thể hiện phân loại này khá là tương đối tùy thuộc và từng loại device và tưng version android khác nhau.

Tip

Để thêm thông tin về một số phương phảm giảm tải và tối ưu hóa việc sử dụng bộ nhớ, các bạn có thể xem thêm ở đây

The ends

Hy vọng công cụ này có thể trở thành một trợ thủ đắc lực của bạn trong việc quản lý hiệu năng và hoạt động bộ nhớ ứng dụng của bạn. Have fun !

0