Những ví dụ này cho thấy cách sử dụng tính năng theo dõi hệ thống bằng Macrobenchmark, cùng với cấu hình bộ nhớ, để đo lường và cải thiện một số vấn đề về hiệu suất nhất định.
Gỡ lỗi khởi động ứng dụng bằng systrace
Khi gỡ lỗi về thời gian khởi động, bạn nên sử dụng nhật ký systrace. Systrace là một hệ thống sử dụng mã được đo lường trước để xuất ra thời lượng của các sự kiện nhất định khi chúng xảy ra. Các dấu vết này cho phép bạn xem điều gì đang diễn ra trong ứng dụng của mình hoặc thậm chí là trong các quy trình khác trên hệ thống. Thư viện Android và Jetpack có khả năng đo lường nhiều sự kiện quan trọng trong một ứng dụng và những sự kiện này được ghi lại tương ứng. Bạn cũng có thể đo lường các ứng dụng của mình bằng dấu vết tuỳ chỉnh riêng, các thông tin này sẽ hiển thị trong các công cụ hình ảnh systrace tương tự, để cung cấp thông tin tổng thể về những gì đã xảy ra trong ứng dụng.
Sử dụng systrace hoặc Perfetto
Để tìm hiểu thêm về cách sử dụng systrace cơ bản, hãy xem video sau: Gỡ lỗi hiệu suất ứng dụng.
Để phân tích thời gian khởi động, trước tiên, bạn phải hiểu điều gì sẽ xảy ra trong quá trình khởi động. Nếu bạn muốn biết thêm thông tin so với nội dung giải thích trên trang này, tài liệu về Thời gian khởi động ứng dụng sẽ cung cấp thông tin tổng quan về quy trình khởi động ứng dụng.
Các giai đoạn khởi động ứng dụng là:
- Chạy quy trình này
- Khởi động đối tượng ứng dụng chung
- Tạo và khởi động hoạt động
- Tăng cường bố cục
- Vẽ khung đầu tiên
Các loại khởi động có những giai đoạn sau:
- Khởi động nguội: Quá trình này xảy ra khi ứng dụng được khởi động lần đầu tiên kể từ khi khởi động hoặc từ khi quá trình đăng ký bị người dùng hoặc hệ thống dừng. Việc khởi động tạo ra một quy trình mới chưa được lưu trạng thái.
- Khởi động ấm: Quá trình này xảy ra khi ứng dụng đang chạy ở chế độ nền nhưng phải tạo lại và đưa hoạt động này lên nền trước. Hoạt động được tạo lại trong khi sử dụng lại quy trình hiện có hoặc quy trình được tạo lại với trạng thái đã lưu. Thư viện thử nghiệm Macrobenchmark hỗ trợ việc thử nghiệm khởi động ấm một cách nhất quán bằng cách sử dụng lựa chọn đầu tiên.
- Khởi động nóng: Quá trình này xảy ra khi quá trình và hoạt động vẫn đang chạy và chỉ cần được đưa lên nền trước, có thể tạo lại một số đối tượng khi cần thiết, cũng như hiển thị hoạt động mới trên nền trước. Đây là trường hợp khởi động ngắn nhất.
Bạn nên thu thập systraces sử dụng ứng dụng theo dõi hệ thống trên thiết bị có sẵn trong Tuỳ chọn cho nhà phát triển. Nếu bạn muốn sử dụng công cụ dòng lệnh, Perfetto sẽ có sẵn để sử dụng với Android 10 (API cấp 29) trở lên, trong khi các thiết bị trên phiên bản cũ hơn nên sử dụng systrace.
Xin lưu ý rằng thuật ngữ “khung hình đầu tiên” là một giá trị sai vì các ứng dụng có thể thay đổi đáng kể về cách xử lý hoạt động khởi động sau khi tạo hoạt động ban đầu. Một số ứng dụng sẽ tiếp tục tăng cường trong một số khung hình, trong khi các ứng dụng khác thậm chí sẽ ngay lập tức khởi chạy một hoạt động phụ.
Nếu có thể, bạn nên thêm lệnh gọi
reportFullyDrawn
(có trên Android 10 trở lên) khi hoàn tất quá trình khởi động từ
góc độ của ứng dụng.
Bạn cần chú ý đến một số vấn đề trong những dấu vết hệ thống này:
Hình 1. Việc cạnh tranh các tài nguyên được bảo vệ bằng theo dõi có thể làm
trì hoãn đáng kể khi khởi động ứng dụng.
Hình 2. Tìm các giao dịch không cần thiết trong đường dẫn quan trọng của ứng dụng.
Hình 3. Việc thu gom rác đồng thời là một hiện tượng thường thấy và có tác động tương đối
thấp, nhưng nếu bạn gặp vấn đề này, hãy cân nhắc điều tra vấn đề bằng
trình phân tích bộ nhớ trong Android Studio.
Hình 4. Kiểm tra I/O trong khi khởi động và tìm các stall
dài.
Với hình 4, lưu ý rằng các quy trình khác thực hiện I/O cùng một lúc có thể gây tranh chấp về I/O, vì vậy hãy đảm bảo rằng các quy trình khác không chạy.
Hoạt động quan trọng trên các luồng khác có thể ảnh hưởng đến luồng giao diện người dùng. Vì vậy, hãy chú ý đến thao tác trong nền khi khởi động. Xin lưu ý rằng các thiết bị có thể có các cấu hình CPU khác nhau, do đó, số lượng luồng có thể chạy song song có thể khác nhau trên các thiết bị.
Ngoài ra, hãy xem hướng dẫn về các nguồn phổ biến của hiện tượng giật
Sử dụng trình phân tích bộ nhớ trong Android Studio
Trình phân tích bộ nhớ trong Android Studio là một công cụ mạnh mẽ giúp giảm áp lực bộ nhớ mà nguyên nhân có thể là do rò rỉ bộ nhớ hoặc do thói quen sử dụng không tốt. Công cụ này cung cấp chế độ xem trực tiếp về các bộ sưu tập và phân bổ đối tượng.
Để khắc phục sự cố về bộ nhớ trong ứng dụng của mình, bạn có thể sử dụng trình phân tích bộ nhớ để theo dõi lý do tại sao và tần suất xảy ra tình trạng thu gom rác, cũng như liệu khả năng rò rỉ bộ nhớ có thể khiến vùng nhớ khối xếp của bạn liên tục tăng theo thời gian hay không.
Việc phân tích bộ nhớ ứng dụng sẽ chia nhỏ theo các bước sau:
1. Phát hiện vấn đề về bộ nhớ
Để phát hiện các vấn đề về bộ nhớ, hãy bắt đầu bằng cách ghi lại phiên phân tích bộ nhớ cho ứng dụng của bạn. Tiếp theo, hãy tìm kiếm một đối tượng có mức sử dụng bộ nhớ đang tăng lên, cuối cùng kích hoạt một sự kiện thu gom rác.
Hình 5. Trình phân tích bộ nhớ hiển thị mức phân bổ tăng dần của các đối tượng
theo thời gian.
Hình 6. Trình phân tích bộ nhớ hiển thị các sự kiện thu gom rác.{.:image-caption}
Sau khi bạn đã xác định được trường hợp sử dụng gây ra áp lực bộ nhớ, hãy bắt đầu phân tích nguyên nhân cốt lõi.
2. Chẩn đoán các điểm nóng về áp lực bộ nhớ
Chọn một dải ô trong tiến trình để hình ảnh hoá cả mô hình phân bổ và kích thước của đối tượng.
Hình 7. Trình phân tích bộ nhớ hiển thị mức phân bổ và kích thước cho một phạm vi
đã chọn trong tiến trình.
Có nhiều cách để sắp xếp dữ liệu này. Các phần sau đây cung cấp một số ví dụ về cách mỗi chế độ xem có thể giúp bạn phân tích vấn đề.
Sắp xếp theo lớp
Việc sắp xếp theo lớp là cách hữu ích khi bạn muốn tìm các lớp đang tạo các đối tượng nên được lưu vào bộ nhớ đệm hoặc sử dụng lại từ nhóm bộ nhớ.
Ví dụ: giả sử bạn thấy một ứng dụng đang tạo 2.000 đối tượng của lớp có tên là “Vertex” mỗi giây. Điều này sẽ làm tăng số lượt phân bổ thêm 2.000 mỗi giây và bạn sẽ thấy số liệu này khi sắp xếp theo lớp. Các đối tượng đó có nên được sử dụng lại để tránh tạo ra rác không? Nếu câu trả lời là có, thì có thể bạn sẽ cần phải triển khai một nhóm bộ nhớ.
Sắp xếp theo ngăn xếp lệnh gọi
Việc sắp xếp theo ngăn xếp lệnh gọi rất hữu ích khi có một đường dẫn nóng, trong đó bộ nhớ đang được phân bổ, chẳng hạn như bên trong một vòng giữ cố định hoặc một hàm cụ thể thực hiện rất nhiều công việc phân bổ. Khi xem theo ngăn xếp lệnh gọi, bạn sẽ có thể xem các điểm phát sóng phân bổ đó.
Kích thước của đối tượng so với kích thước được giải phóng
Kích thước của đối tượng chỉ theo dõi bộ nhớ của chính đối tượng, vì vậy, tốt nhất nên theo dõi các lớp đơn giản chủ yếu bao gồm các dữ liệu gốc.
Kích thước được giải phóng cho biết tổng bộ nhớ được đối tượng phân bổ trực tiếp cũng như các đối tượng khác được phân bổ chỉ được đối tượng đó tham chiếu. Quá trình này rất hữu ích trong việc theo dõi áp lực bộ nhớ do các đối tượng phức tạp yêu cầu phân bổ các đối tượng khác chứ không chỉ các trường dữ liệu gốc. Để lấy giá trị này, hãy tạo kết xuất bộ nhớ bằng trình phân tích bộ nhớ. Các đối tượng được phân bổ trong vùng nhớ khối xếp đó được thêm vào màn hình.
Hình 8. Bạn có thể tạo một vùng nhớ khối xếp bộ nhớ bất cứ lúc nào bằng cách nhấp vào nút Dump
Java heap trong thanh công cụ trình phân tích bộ nhớ.
Hình 9. Việc kết xuất vùng nhớ khối xếp bộ nhớ sẽ hiển thị một cột cho biết các vị trí
đối tượng trong vùng nhớ khối xếp đó.
3. Đo lường tác động của tính năng tối ưu hoá
Một điểm cải tiến giúp tối ưu hoá bộ nhớ dễ dàng đo lường là việc thu gom rác. Khi tối ưu hoá làm giảm áp lực bộ nhớ, bạn sẽ thấy ít bộ thu gom rác (GC) hơn. Để đo lường mức giảm này, hãy đo thời gian giữa các GC trong tiến trình của trình phân tích tài nguyên. Bạn sẽ thấy khoảng thời gian dài hơn giữa các GC sau khi tối ưu hoá bộ nhớ.
Những tác động cuối cùng của việc cải thiện bộ nhớ, chẳng hạn như:
- Ứng dụng sẽ ít bị gỡ bỏ hơn do vấn đề Hết bộ nhớ nếu ứng dụng không liên tục bị áp lực bộ nhớ.
- Việc có ít GC cải thiện chỉ số giật. Nguyên nhân là do GC gây ra tranh chấp về CPU, có thể dẫn đến việc hiển thị các nhiệm vụ bị trì hoãn trong khi GC đang diễn ra.