Thuật ngữ bộ nhớ

Meggin Kearney
Meggin Kearney

Phần này mô tả các thuật ngữ phổ biến dùng trong việc phân tích bộ nhớ và có thể áp dụng cho nhiều công cụ phân tích bộ nhớ cho nhiều ngôn ngữ.

Các thuật ngữ và khái niệm được mô tả ở đây tham chiếu đến Trình phân tích vùng nhớ khối xếp trong Công cụ của Chrome cho nhà phát triển. Nếu bạn đã từng làm việc với Java, .NET hoặc một số trình phân tích bộ nhớ khác, thì đây có thể là tài liệu để ôn lại kiến thức.

Kích thước đối tượng

Hãy coi bộ nhớ là một biểu đồ với các loại nguyên hàm (như số và chuỗi) và đối tượng (mảng kết hợp). Điểm này có thể được biểu thị trực quan dưới dạng biểu đồ với một số điểm kết nối với nhau như sau:

Minh hoạ bằng hình ảnh về bộ nhớ

Một đối tượng có thể lưu giữ bộ nhớ theo 2 cách:

  • Trực tiếp bởi chính đối tượng đó.
  • Theo cách ngầm ẩn bằng cách giữ lại thông tin tham chiếu đến các đối tượng khác, do đó ngăn các đối tượng đó bị trình thu gom rác tự động xử lý (gọi tắt là GC).

Khi làm việc với Trình phân tích vùng nhớ khối xếp trong Công cụ cho nhà phát triển (một công cụ điều tra các vấn đề về bộ nhớ trong phần "Hồ sơ"), bạn có thể sẽ thấy mình xem một số cột thông tin. Hai kích thước nổi bậtKích thước được giữ lại có ý nghĩa gì?

Kích thước của đối tượng và kích thước được giữ lại

Kích thước của đối tượng

Đây là kích thước của bộ nhớ do chính đối tượng giữ.

Các đối tượng JavaScript thông thường có một số bộ nhớ dành riêng cho mục đích mô tả và lưu trữ các giá trị ngay lập tức. Thông thường, chỉ các mảng và chuỗi mới có thể có kích thước nông đáng kể. Tuy nhiên, các chuỗi và mảng bên ngoài thường có bộ nhớ chính trong bộ nhớ kết xuất đồ hoạ, chỉ hiển thị một đối tượng trình bao bọc nhỏ trên vùng nhớ khối xếp JavaScript.

Bộ nhớ kết xuất là toàn bộ bộ nhớ của quy trình kết xuất một trang được kiểm tra: bộ nhớ gốc + bộ nhớ vùng nhớ khối xếp JS của trang + bộ nhớ vùng nhớ khối xếp JS của tất cả trình thực thi chuyên dụng bắt đầu bởi trang. Tuy nhiên, ngay cả một đối tượng nhỏ cũng có thể gián tiếp chứa một lượng lớn bộ nhớ bằng cách ngăn quy trình thu gom rác tự động xử lý các đối tượng khác.

Kích thước được giữ lại

Đây là kích thước của bộ nhớ được giải phóng sau khi chính đối tượng đó bị xoá cùng với các đối tượng phụ thuộc không thể truy cập được qua gốc GC.

Gốc GC bao gồm các tên người dùng được tạo (cục bộ hoặc toàn cục) khi tham chiếu từ mã gốc đến đối tượng JavaScript bên ngoài V8. Bạn có thể tìm thấy tất cả các tên người dùng như vậy trong ảnh chụp nhanh của vùng nhớ khối xếp trong mục gốc GC > Phạm vi xử lýgốc GC > Tên người dùng chung. Việc mô tả các tên người dùng trong tài liệu này mà không đi sâu vào chi tiết về cách triển khai trình duyệt có thể gây nhầm lẫn. Bạn không cần lo lắng về cả gốc GC và trình điều khiển.

Có rất nhiều gốc GC nội bộ mà hầu hết đều không thú vị đối với người dùng. Từ quan điểm của ứng dụng, có các loại gốc sau:

  • Đối tượng chung của cửa sổ (trong mỗi iframe). Có một trường khoảng cách trong ảnh chụp nhanh của vùng nhớ khối xếp, đó là số tham chiếu thuộc tính trên đường dẫn giữ lại ngắn nhất từ cửa sổ.
  • Cây DOM tài liệu bao gồm tất cả các nút DOM gốc có thể truy cập được bằng cách truyền tải tài liệu. Không phải tất cả các tệp đều có trình bao bọc JS, nhưng nếu chúng có trình bao bọc thì sẽ vẫn hoạt động trong khi tài liệu đang hoạt động.
  • Đôi khi, các đối tượng có thể được giữ lại bởi ngữ cảnh của trình gỡ lỗi và bảng điều khiển Công cụ cho nhà phát triển (ví dụ: sau khi đánh giá bảng điều khiển). Tạo ảnh chụp nhanh của vùng nhớ khối xếp bằng bảng điều khiển rõ ràng và không có điểm ngắt nào đang hoạt động trong trình gỡ lỗi.

Biểu đồ bộ nhớ bắt đầu bằng một thư mục gốc, có thể là đối tượng window của trình duyệt hoặc đối tượng Global của mô-đun Node.js. Bạn không thể kiểm soát cách GC của đối tượng gốc này.

Không thể kiểm soát đối tượng gốc

Nội dung không truy cập được qua thư mục gốc sẽ được GC.

Cây giữ lại các đối tượng

Vùng nhớ khối xếp là một mạng các đối tượng được kết nối với nhau. Trong lĩnh vực toán học, cấu trúc này được gọi là biểu đồ hay biểu đồ bộ nhớ. Một biểu đồ được xây dựng từ các nút được kết nối với nhau bằng các cạnh, cả hai đều có nhãn nhất định.

  • Nút (hoặc đối tượng) được gắn nhãn theo tên của hàm hàm khởi tạo dùng để tạo các nút đó.
  • Edges được gắn nhãn bằng tên của thuộc tính.

Tìm hiểu cách ghi lại hồ sơ bằng Trình phân tích vùng nhớ khối xếp. Một số điều bắt mắt chúng ta có thể thấy trong bản ghi của Trình phân tích vùng nhớ khối xếp dưới đây gồm có khoảng cách: khoảng cách từ gốc GC. Bạn nên kiểm tra nếu gần như tất cả các đối tượng cùng loại ở cùng khoảng cách và một vài đối tượng ở khoảng cách lớn hơn.

Khoảng cách từ gốc

Loa ưu tiên

Các đối tượng thống trị bao gồm một cấu trúc cây vì mỗi đối tượng chỉ có đúng một đối tượng thống trị. Một đối tượng thống trị có thể thiếu thông tin tham chiếu trực tiếp đến một đối tượng mà đối tượng đó thống trị; nghĩa là cây của đối tượng này không phải là cây bao trùm của biểu đồ.

Trong sơ đồ dưới đây:

  • Nút 1 thống trị nút 2
  • Nút 2 bao gồm nút 3, 4 và 6
  • Nút 3 thống trị nút 5
  • Nút 5 thống trị nút 8
  • Nút 6 thống trị nút 7

Cấu trúc cây thống trị

Trong ví dụ bên dưới, nút #3 là nút chủ đạo của #10, nhưng #7 cũng tồn tại trong mọi đường dẫn đơn giản từ GC đến #10. Do đó, đối tượng B là đối tượng thống trị của đối tượng A nếu B tồn tại trong mọi đường dẫn đơn giản từ gốc đến đối tượng A.

Hình minh hoạ đối tượng kiểm soát bằng ảnh động

Thông tin cụ thể về phiên bản 8

Khi phân tích bộ nhớ, bạn cần nắm được lý do tại sao ảnh chụp nhanh của vùng nhớ khối xếp trông có vẻ nhất định. Phần này mô tả một số chủ đề liên quan đến bộ nhớ cụ thể tương ứng với máy ảo JavaScript V8 (máy ảo hoặc máy ảo V8).

Biểu diễn đối tượng JavaScript

Có 3 loại nguyên hàm:

  • Số (ví dụ: 3,14159..)
  • Boolean (đúng hoặc sai)
  • Chuỗi (ví dụ: "Werner Heisenberg")

Chúng không thể tham chiếu các giá trị khác và luôn là lá hay nút kết thúc.

Số có thể được lưu trữ dưới dạng:

  • một giá trị số nguyên 31 bit tức thì được gọi là số nguyên nhỏ (SMI) hoặc
  • các đối tượng vùng nhớ khối xếp, được gọi là số vùng nhớ khối xếp. Số vùng nhớ khối xếp được dùng để lưu trữ các giá trị không phù hợp với biểu mẫu SMI, chẳng hạn như double hoặc khi một giá trị cần được đóng hộp, chẳng hạn như đặt thuộc tính cho giá trị đó.

Bạn có thể lưu trữ Chuỗi trong:

  • vùng nhớ khối xếp ảo, hoặc
  • bên ngoài trong bộ nhớ của trình kết xuất. Một đối tượng trình bao bọc được tạo và dùng để truy cập vào bộ nhớ ngoài, chẳng hạn như nguồn tập lệnh và nội dung khác nhận được từ web được lưu trữ, thay vì sao chép vào vùng nhớ khối xếp ảo.

Bộ nhớ dành cho các đối tượng JavaScript mới được phân bổ từ một vùng nhớ khối xếp JavaScript chuyên dụng (hoặc vùng nhớ khối xếp ảo). Các đối tượng này do trình thu gom rác của V8 quản lý nên sẽ vẫn tồn tại miễn là có ít nhất một tham chiếu rõ ràng đến chúng.

Đối tượng gốc là mọi đối tượng khác không có trong vùng nhớ khối xếp JavaScript. Trái ngược với đối tượng vùng nhớ khối xếp, đối tượng gốc không được trình thu thập rác V8 quản lý trong suốt thời gian hoạt động và chỉ có thể truy cập được qua JavaScript bằng đối tượng trình bao bọc JavaScript.

Chuỗi lỗi là một đối tượng bao gồm các cặp chuỗi được lưu trữ rồi kết hợp với nhau. Đây cũng là kết quả của quá trình nối. Việc liên kết nội dung chuỗi cons chỉ xảy ra khi cần. Ví dụ như khi cần tạo một chuỗi con của chuỗi đã tham gia.

Ví dụ: nếu nối ab, bạn sẽ nhận được một chuỗi (a, b) biểu thị kết quả của phép nối. Nếu sau đó bạn nối d với kết quả đó, thì bạn sẽ nhận được một chuỗi nhược điểm khác ((a, b), d).

Mảng – Mảng là một Đối tượng có các khoá số. Chúng được sử dụng rộng rãi trong máy ảo V8 để lưu trữ một lượng lớn dữ liệu. Các tập hợp cặp khoá-giá trị được dùng như từ điển được sao lưu bằng các mảng.

Đối tượng JavaScript điển hình có thể là một trong hai loại mảng được dùng để lưu trữ:

  • các thuộc tính được đặt tên và
  • phần tử số

Trong trường hợp có rất ít thuộc tính, các thuộc tính đó có thể được lưu trữ nội bộ trong chính đối tượng JavaScript.

Ánh xạ – một đối tượng mô tả loại đối tượng và bố cục của đối tượng đó. Ví dụ: bản đồ được dùng để mô tả hệ phân cấp đối tượng ngầm ẩn nhằm truy cập nhanh vào thuộc tính.

Nhóm đối tượng

Mỗi nhóm đối tượng gốc được tạo thành từ các đối tượng chứa tham chiếu lẫn nhau. Ví dụ: hãy xem xét cây con DOM, trong đó mỗi nút đều có một đường liên kết đến thành phần mẹ và liên kết đến thành phần con tiếp theo cũng như thành phần đồng cấp tiếp theo, từ đó tạo thành một biểu đồ liên kết. Xin lưu ý rằng các đối tượng gốc không được biểu thị trong vùng nhớ khối xếp JavaScript. Đó là lý do các đối tượng gốc có kích thước bằng 0. Thay vào đó, các đối tượng trình bao bọc sẽ được tạo.

Mỗi đối tượng trình bao bọc chứa một tham chiếu đến đối tượng gốc tương ứng để chuyển hướng các lệnh đến đối tượng đó. Một nhóm đối tượng sẽ lưu giữ các đối tượng trình bao bọc. Tuy nhiên, điều này không tạo ra chu kỳ không thể thu thập vì GC đủ thông minh để giải phóng các nhóm đối tượng có trình bao bọc không còn được tham chiếu nữa. Tuy nhiên, việc quên phát hành một trình bao bọc duy nhất sẽ giữ lại toàn bộ nhóm và các trình bao bọc được liên kết.