Ghi lại quá trình phân bổ cho mã gốc
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Nếu bạn đang viết mã gốc và lo ngại về mức sử dụng bộ nhớ của mã đó, bạn nên phân tích mức phân bổ mã gốc của ứng dụng để tìm hiểu xem có cơ hội tối ưu hoá hay không.
Tại sao bạn nên phân tích bộ nhớ ứng dụng
Android cung cấp một môi trường bộ nhớ được quản lý – khi nhận thấy ứng dụng của bạn không còn sử dụng một số đối tượng, trình thu gom rác sẽ giải phóng bộ nhớ không dùng đến trở về vùng nhớ khối xếp. Tuy Android liên tục cải tiến cách tìm bộ nhớ không dùng đến, nhưng đến một thời điểm nào đó trên mọi phiên bản Android, hệ thống sẽ phải tạm dừng mã của bạn trong giây lát. Trong hầu hết trường hợp, bạn sẽ không nhận thấy việc tạm dừng.
Tuy nhiên, nếu ứng dụng của bạn phân bổ bộ nhớ nhanh hơn tốc độ hệ thống thu thập bộ nhớ, thì ứng dụng của bạn có thể bị gián đoạn trong khi trình thu gom giải phóng đủ bộ nhớ để đáp ứng mức phân bổ. Tình trạng trễ này có thể khiến ứng dụng của bạn bỏ qua khung hình cũng như làm chậm khung hình.
Để biết thông tin về các phương pháp lập trình có thể làm giảm mức sử dụng bộ nhớ của ứng dụng, hãy đọc nội dung Quản lý bộ nhớ của ứng dụng.
Tổng quan về mức phân bổ cho mã gốc
Khi bạn chạy tác vụ Theo dõi mức sử dụng bộ nhớ (Phân bổ mã gốc), Trình phân tích tài nguyên Android Studio sẽ theo dõi quá trình phân bổ và giải phóng các đối tượng trong mã gốc trong khoảng thời gian mà bạn chỉ định, đồng thời cung cấp các thông tin sau:
- Allocations (Phân bổ): Số lượng đối tượng được phân bổ bằng
malloc()
hoặc toán tử new
trong khoảng thời gian đã chọn.
- Deallocations: Số lượng đối tượng được giải phóng bằng
free()
hoặc toán tử delete
trong khoảng thời gian đã chọn.
- Allocations Size (Kích thước phân bổ): Kích thước tổng hợp tính bằng byte của mọi lượt phân bổ trong khoảng thời gian đã chọn.
- Deallocations Size (Kích thước giải phóng): Kích thước tổng hợp tính bằng byte của mọi mức bộ nhớ đã được giải phóng trong khoảng thời gian đã chọn.
- Total Count (Tổng số): Giá trị trong cột Allocations (Phân bổ) trừ đi giá trị trong cột Deallocations (Giải phóng).
- Remaining Size (Kích thước còn lại): Giá trị trong cột Allocations Size (Kích thước phân bổ) trừ đi giá trị trong cột Deallocations Size (Kích thước giải phóng).

Thẻ Hình ảnh hiển thị chế độ xem tổng hợp của tất cả đối tượng liên quan đến mã gốc trong ngăn xếp lệnh gọi trong phạm vi thời gian đã chọn. Về cơ bản, thông tin này cho bạn biết tổng dung lượng bộ nhớ mà ngăn xếp lệnh gọi với các thực thể hiển thị chiếm dụng.
Hàng đầu tiên cho biết tên chuỗi tin nhắn. Theo mặc định, các đối tượng được xếp chồng từ trái sang phải dựa trên kích thước phân bổ; hãy sử dụng trình đơn thả xuống để thay đổi thứ tự.

Theo mặc định, trình phân tích tài nguyên sử dụng kích thước mẫu là 2048 byte: mỗi khi phân bổ được 2048 byte bộ nhớ, hệ thống sẽ chụp nhanh bộ nhớ. Kích thước mẫu nhỏ hơn giúp việc chụp thông tin tổng quan nhanh xảy ra thường xuyên hơn, mang lại nhiều dữ liệu chính xác hơn về mức sử dụng bộ nhớ. Kích thước mẫu lớn hơn khiến giảm độ chính xác của dữ liệu, nhưng sẽ tốn ít tài nguyên hệ thống hơn và cải thiện hiệu suất trong quá trình ghi. Để thay đổi kích thước mẫu, hãy xem phần Chỉnh sửa cấu hình bản ghi.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Record native allocations\n\nIf you're writing native code and concerned about its memory usage, it's helpful\nto profile your app's native allocations to discover if there's opportunity to\noptimize.\n\nWhy you should profile your app memory\n--------------------------------------\n\nAndroid provides a [managed memory\nenvironment](/topic/performance/memory-overview)---when Android determines that\nyour app is no longer using some objects, the garbage collector releases the\nunused memory back to the heap. How Android goes about finding unused memory is\nconstantly being improved, but at some point on all Android versions, the system\nmust briefly pause your code. Most of the time, the pauses are imperceivable.\nHowever, if your app allocates memory faster than the system can collect it,\nyour app might be delayed while the collector frees enough memory to satisfy\nyour allocations. The delay could cause your app to skip frames and cause\nvisible slowness.\n\nFor information about programming practices that can reduce your app's memory\nuse, read [Manage your app's memory](/topic/performance/memory).\n\nNative allocations overview\n---------------------------\n\nWhen you run the [**Track Memory Consumption (Native Allocations)**](/studio/profile#start-profiling) task,\nthe Android Studio Profiler tracks allocations and deallocations of objects in\nnative code for the time period that you specify and provides the following\ninformation:\n\n- **Allocations** : A count of objects allocated using `malloc()` or the `new` operator during the selected time period.\n- **Deallocations** : A count of objects deallocated using `free()` or the `delete` operator during the selected time period.\n- **Allocations Size**: The aggregated size in bytes of all allocations during the selected time period.\n- **Deallocations Size**: The aggregated size in bytes of all freed memory during the selected time period.\n- **Total Count** : The value in the **Allocations** column minus the value in the **Deallocations** column.\n- **Remaining Size** : The value in the **Allocations Size** column minus the value in the **Deallocations Size** column.\n\nThe **Visualization** tab shows an aggregated view of all the objects related to\nnative code in the call stack during the time range selected. It essentially\nshows you how much total memory the callstack with the instances shown takes.\nThe first row shows the thread name. By default, the objects are stacked left to\nright based on allocation size; use the drop-down to change the ordering.\n\nBy default, the profiler uses a sample size of 2048 bytes: Every time 2048 bytes\nof memory are allocated, a snapshot of memory is taken. A smaller sample size\nresults in more frequent snapshots, yielding more accurate data about memory\nusage. A larger sample size yields less accurate data, but it consumes fewer\nsystem resources and improves performance while recording. To change the sample\nsize, see [Edit the recording configuration](/studio/profile#edit-recording)."]]