Instruments ObjectAlloc: Giải thích về byte trực tiếp & byte tổng thể


86

Tôi đang sử dụng công cụ ObjectAlloc của Instument nhằm tìm cách hiểu bộ nhớ mà ứng dụng của tôi (iPhone) đang làm và khi nào và ở đâu nó đang làm việc đó.

Tôi thực sự muốn được giải thích cơ bản về những thống kê này:

  • Số byte trực tiếp
  • #Cuộc sống
  • #Transitory
  • Tổng số byte

Khi tôi đang cố gắng tìm ra dung lượng bộ nhớ mà ứng dụng của tôi đang sử dụng, tôi có xem xét Byte trực tiếp hay byte tổng thể không? Điều này có bao gồm bộ nhớ bị rò rỉ không? Đối tượng chuyển tiếp là gì?

Cảm ơn


6
các cột có mô tả ngắn khi bạn di chuột qua tiêu đề của chúng.
Piotr Byzia,

Câu trả lời:


110

ObjectAlloc theo dõi tất cả phân bổ bộ nhớ và phân bổ giao dịch theo thời gian chương trình của bạn đang chạy.

Đây Living bytes, or Net byteslà dung lượng bộ nhớ mà ứng dụng của bạn đang sử dụng tại thời điểm bạn chọn trong dòng thời gian. Điều đó sẽ bao gồm bộ nhớ bị rò rỉ, vì bộ nhớ bị rò rỉ không bao giờ được phân bổ.

#Livinglà số lần phân bổ của một loại kích thước / đối tượng nhất định đã xảy ra (và vẫn được phân bổ). Điều này rất hữu ích khi tìm kiếm rò rỉ.

Ví dụ: nếu bạn thực hiện lặp đi lặp lại một hành động (như ra khỏi bộ điều khiển chế độ xem phương thức) và bạn thấy #Livingđối tượng đó tăng lên cùng một lượng mỗi lần, thì có thể bạn đang làm rò rỉ các đối tượng đó. Sau đó, bạn có thể xác nhận bằng cách đi sâu vào và xem dòng mã chính xác đang phân bổ các đối tượng và thậm chí xem chỉ mục thời gian mà mỗi đối tượng được tạo.

Overall bytesbao gồm bộ nhớ đã được giải phóng. Việc theo dõi con số đó cho mục đích tối ưu hóa hiệu suất là rất hữu ích, nhưng không phải nếu bạn chỉ đang cố gắng xem bộ nhớ hiện tại của mình hoặc tìm kiếm rò rỉ.


3
Bạn sẽ cố gắng tối ưu hóa điều gì về tổng số byte? Cố gắng giữ số lượng nhỏ có nghĩa là hiệu suất tốt hơn?
Dan Rosenstark

4
Vâng chính xác. Nguyên nhân phổ biến của các vấn đề về hiệu suất là vô tình chạy cùng một mã nhiều lần. Công cụ Phân bổ có thể là một cách hay để lưu ý. Ví dụ: ngay cả khi các đối tượng phụ không bị rò rỉ, bạn có thể nói, "Tại sao tôi lại tạo ra 3 đối tượng đó? Đáng lẽ chỉ có một!"
Ken Aspeslagh

2
Live byte là lượng bộ nhớ mà ứng dụng của bạn hiện đang sử dụng. Tổng thể chỉ là tổng số tất cả các phân bổ ứng dụng của bạn đã thực hiện (bao gồm cả bộ nhớ đã được giải phóng.)
Ken Aspeslagh

1
@KenAspeslagh tại sao tôi lại quan tâm đến tổng thể các byte, nếu nó cũng chứa các đối tượng được phát hành?
Dejell

3
Nếu bạn đang điều chỉnh hiệu suất, thì bạn muốn giảm thiểu số lượng phân bổ ứng dụng của bạn thực hiện khi nó chạy (ngay cả khi bạn không làm rò rỉ các phân bổ đã nói.) Phân bổ quá mức thường có thể là dấu hiệu cho thấy bạn đang làm sai.
Ken Aspeslagh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.