Lập trình Go 22/09/2026 10 phút

Write barrier trong Go: cái giá ẩn của GC đồng thời, đo tận assembly

GC chạy song song với chương trình bắt buộc phải có write barrier, nếu không sẽ thu nhầm object sống. Đo thật: assembly cho thấy ghi con trỏ có gcWriteBarrier còn ghi số thì không, và ghi con trỏ chậm 2.8 lần (0.636 vs 0.226 ns) vì kiểm cờ barrier. Bất biến tricolor và chi phí thật. Go 1.23.

Lập trình Go 22/09/2026 9 phút

Stop-the-world trong Go: GC còn dừng chương trình ở đâu, và bao lâu

GC Go dừng toàn bộ chương trình ở đúng hai điểm mỗi chu kỳ để chuyển pha an toàn. Đo thật: STW chỉ vài chục tới vài trăm micro-giây, tăng nhẹ từ 39 us (100 goroutine) lên 161 us (100k) nhưng luôn dưới 1 ms kể cả nửa triệu goroutine. Vì sao vẫn cần STW và điều gì làm nó dài ra. Go 1.23.

Lập trình Go 22/09/2026 9 phút

Giảm áp lực GC thực chiến: gộp mọi kỹ thuật, cắt GC 4 lần

Giảm áp lực GC không phải một mẹo mà là gộp nhiều kỹ thuật. Đo thật cùng tác vụ: tái dùng strings.Builder + Grow prealloc + tránh fmt.Sprintf boxing cắt cấp phát từ 2756 xuống 901 alloc mỗi lần, làm GC chạy 511 thay vì 2068 lần và nhanh 4.2 lần. Quy trình thực chiến đo-tìm-sửa-đo lại. Go 1.23.

Lập trình Go 22/09/2026 10 phút

Finalizer trong Go: vì sao runtime.SetFinalizer là công cụ nguy hiểm, đo thật cạm bẫy

SetFinalizer đăng ký hàm chạy khi object thành rác, nghe tiện để dọn tài nguyên nhưng đầy cạm bẫy. Đo thật: finalizer chỉ chạy sau GC (0 trước), bất đồng bộ (9998/10000), giữ object sống thêm một chu kỳ GC (19MB vs 0MB), và KHÔNG chạy nếu chương trình thoát trước GC. Go 1.23.

Công cụ 22/09/2026 5 phút

git gc, fsck và bảo trì kho: dọn rác, nén, và vì sao reflog cứu object khỏi bị xóa

Thư mục .git tự phình rồi tự dọn. Bài cuối sê-ri Git đo thật: gc gom loose object thành packfile nén (9 object 36 KiB xuống 1.86 KiB), fsck báo object mồ côi, và điểm nhiều người hiểu sai — gc --prune=now KHÔNG xóa object mà reflog còn giữ; phải hết hạn reflog rồi gc mới xóa thật. Đây chính là lưới an toàn cứu commit tưởng đã mất.