Mọi chương trình đều phải trả lời một câu hỏi tưởng nhỏ mà định hình cả tính cách của ngôn ngữ: khi nào thì giải phóng một vùng nhớ đã cấp? Giải phóng quá sớm thì có kẻ còn đang dùng — sập. Giải phóng quá muộn, hoặc quên giải phóng, thì bộ nhớ rò rỉ dần cho tới khi cạn. Có ba trường phái trả lời câu này, và mỗi trường phái hy sinh một thứ khác nhau.
Gom rác tự động
Chương trình cứ cấp phát thoải mái; định kỳ một bộ gom rác quét xem vùng nào không còn ai trỏ tới nữa rồi thu hồi. Được: lập trình viên gần như không phải nghĩ về bộ nhớ, và cả một lớp lỗi nguy hiểm — dùng vùng đã giải phóng, giải phóng hai lần — đơn giản là biến mất. Mất: những khoảng dừng khó đoán khi bộ gom chạy, và mức tiêu tốn RAM cao hơn nhu cầu thật, vì rác nằm chờ tới đợt quét mới được dọn. Phù hợp với dịch vụ máy chủ và ứng dụng nghiệp vụ, nơi tiết kiệm thời gian con người đáng giá hơn vài chục mili giây thỉnh thoảng bị khựng.
Đếm tham chiếu
Mỗi đối tượng mang một bộ đếm số kẻ đang trỏ tới nó. Thêm một tham chiếu thì tăng, bỏ đi thì giảm, về 0 là giải phóng ngay lập tức. Được: giải phóng đúng lúc, đều đặn, không có khoảng dừng lớn bất ngờ — bộ nhớ được trả lại ngay khi không còn ai cần. Mất: tốn một chút chi phí ở mỗi lần gán, và — điểm yếu chí mạng — nó không tự xử lý được vòng tham chiếu: nếu A giữ B và B giữ A, cả hai bộ đếm không bao giờ về 0 dù không còn ai bên ngoài cần tới chúng. Đó là lý do các hệ dùng đếm tham chiếu thường phải bổ sung cơ chế phá vòng.
Sở hữu và mượn
Trình biên dịch theo dõi ai đang sở hữu mỗi vùng nhớ, và chèn lệnh giải phóng vào đúng chỗ ngay tại thời điểm dịch. Không có bộ gom chạy nền, không có bộ đếm cập nhật lúc chạy — toàn bộ quyết định được chốt trước khi chương trình khởi động. Được: nhanh và đoán trước được như quản lý bộ nhớ thủ công, nhưng an toàn, vì trình biên dịch từ chối biên dịch những đoạn có nguy cơ. Mất: người viết phải học một mô hình tư duy mới và đôi khi khá khó, và một số cấu trúc dữ liệu — nhất là những thứ có nhiều mối trỏ chéo — trở nên khó diễn đạt hơn hẳn.
Không có lựa chọn thắng tuyệt đối
Ba trường phái không xếp hạng được, vì chúng tối ưu cho những thứ khác nhau. Hệ thống thời gian thực và phần mềm nhúng chọn cách sở hữu vì đơn giản là không chấp nhận được một khoảng dừng bất ngờ giữa lúc điều khiển động cơ. Ứng dụng web và công cụ nội bộ chọn gom rác vì thời gian của lập trình viên đắt hơn vài chục mili giây thỉnh thoảng. Cả hai lựa chọn đều đúng — chúng chỉ đang trả lời cùng một câu hỏi trong hai bối cảnh có cái giá hoàn toàn khác nhau. Hiểu ba trường phái này cũng là hiểu vì sao các ngôn ngữ có tính cách rất khác nhau ngay từ gốc.
Thảo luận