.NET Core - Thu gom rác
Trong chương này, chúng tôi sẽ đề cập đến khái niệm thu gom rác, đây là một trong những tính năng quan trọng nhất của nền tảng mã được quản lý .NET. Bộ thu gom rác (GC) quản lý việc cấp phát và giải phóng bộ nhớ. Bộ thu gom rác đóng vai trò là trình quản lý bộ nhớ tự động.
Bạn không cần biết cách cấp phát và giải phóng bộ nhớ hoặc quản lý thời gian tồn tại của các đối tượng sử dụng bộ nhớ đó
Việc phân bổ được thực hiện bất cứ khi nào bạn khai báo một đối tượng có từ khóa “mới” hoặc loại giá trị được đóng hộp. Phân bổ thường rất nhanh
Khi không có đủ bộ nhớ để cấp phát một đối tượng, GC phải thu thập và xử lý bộ nhớ rác để cung cấp bộ nhớ cho các cấp phát mới.
Quá trình này được gọi là garbage collection.
Ưu điểm của việc thu gom rác
Thu gom rác cung cấp những lợi ích sau:
Bạn không cần phải giải phóng bộ nhớ theo cách thủ công trong khi phát triển ứng dụng của mình.
Nó cũng phân bổ các đối tượng trên heap được quản lý một cách hiệu quả.
Khi các đối tượng không còn được sử dụng nữa thì nó sẽ lấy lại các đối tượng đó bằng cách xóa bộ nhớ của chúng và giữ cho bộ nhớ có sẵn cho các lần phân bổ trong tương lai.
Các đối tượng được quản lý sẽ tự động lấy nội dung rõ ràng để bắt đầu, vì vậy các hàm tạo của chúng không phải khởi tạo mọi trường dữ liệu.
Nó cũng cung cấp sự an toàn cho bộ nhớ bằng cách đảm bảo rằng một đối tượng không thể sử dụng nội dung của đối tượng khác.
Điều kiện thu gom rác
Việc thu gom rác xảy ra khi một trong các điều kiện sau là đúng.
Hệ thống có bộ nhớ vật lý thấp.
Bộ nhớ được sử dụng bởi các đối tượng được cấp phát trên heap được quản lý vượt qua ngưỡng chấp nhận được. Ngưỡng này liên tục được điều chỉnh khi quá trình chạy.
Các GC.Collectphương thức được gọi và trong hầu hết các trường hợp, bạn không cần phải gọi phương thức này, bởi vì bộ thu gom rác chạy liên tục. Phương pháp này chủ yếu được sử dụng cho các tình huống và thử nghiệm duy nhất.
Các thế hệ
.NET Garbage Collector có 3 thế hệ và mỗi thế hệ có heap riêng được sử dụng để lưu trữ các đối tượng được cấp phát. Có một nguyên tắc cơ bản là hầu hết các đối tượng đều tồn tại trong thời gian ngắn hoặc tồn tại lâu dài.
Thế hệ đầu tiên (0)
Trong Thế hệ 0, các đối tượng được cấp phát đầu tiên.
Trong thế hệ này, các đối tượng thường không tồn tại qua thế hệ đầu tiên, vì chúng không còn được sử dụng (ngoài phạm vi) vào thời điểm thu gom rác tiếp theo xảy ra.
Thế hệ 0 nhanh chóng được thu thập vì đống liên kết của nó nhỏ.
Thế hệ thứ hai (1)
Trong Thế hệ 1, các đối tượng có không gian cơ hội thứ hai.
Các vật thể tồn tại trong thời gian ngắn nhưng tồn tại từ tập hợp thế hệ 0 (thường dựa trên thời gian ngẫu nhiên) sẽ chuyển sang thế hệ 1.
Bộ sưu tập thế hệ 1 cũng nhanh chóng vì đống liên kết của nó cũng nhỏ.
Hai đống đầu tiên vẫn còn nhỏ vì các đối tượng hoặc được thu thập hoặc được thăng cấp lên đống thế hệ tiếp theo.
Thế hệ thứ ba (2)
Trong Thế hệ 2, tất cả các vật thể dài đều được tồn tại và đống của nó có thể phát triển rất lớn.
Những đồ vật ở thế hệ này có thể tồn tại lâu dài và không có đống thế hệ tiếp theo để phát huy thêm các đồ vật.
Garbage Collector có một đống bổ sung cho các đối tượng lớn được gọi là Large Object Heap (LOH).
Nó được dành riêng cho các đối tượng có kích thước 85.000 byte trở lên.
Các đối tượng lớn không được phân bổ vào đống thế hệ mà được phân bổ trực tiếp cho LOH
Bộ sưu tập thế hệ 2 và LOH có thể mất thời gian đáng kể đối với các chương trình đã chạy trong một thời gian dài hoặc hoạt động trên một lượng lớn dữ liệu.
Các chương trình máy chủ lớn được biết là có đống trong 10 GB.
GC sử dụng nhiều kỹ thuật khác nhau để giảm lượng thời gian mà nó chặn việc thực thi chương trình.
Phương pháp chính là thực hiện càng nhiều công việc thu gom rác càng tốt trên một luồng nền theo cách không can thiệp vào việc thực thi chương trình.
GC cũng chỉ ra một số cách để các nhà phát triển tác động đến hành vi của nó, điều này có thể khá hữu ích để cải thiện hiệu suất.