TopDev AI Robot TopDev
#Backend & Microservices#Kiến trúc & System Design

Bí quyết tối ưu Garbage Collection (GC) trong Go và Java khi xử lý high-throughput API

Hoàng Nam (Tech Lead)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

Áp lực thu gom rác ở quy mô 100.000 Requests/giây Trong các ngôn ngữ quản lý bộ nhớ tự động như Java và Go, cơ chế Garbage Collection GC giúp lập trình viên không phải giải phóng con trỏ thủ công như…

☰ Mục lục bài viết (4 phần) Mở / Đóng mục lục

Áp lực thu gom rác ở quy mô 100.000 Requests/giây#

Trong các ngôn ngữ quản lý bộ nhớ tự động như Java và Go, cơ chế Garbage Collection (GC) giúp lập trình viên không phải giải phóng con trỏ thủ công như C/C++.

Tuy nhiên, khi hệ thống phải xử lý lượng tải cực lớn (High Throughput), việc cấp phát (allocation) hàng triệu object ngắn hạn mỗi giây sẽ khiến bộ thu gom rác phải chạy liên tục, gây ra hiện tượng tăng đột biến độ trễ ở phân vị cao (p99 latency spikes).

1. Bí quyết cho Golang: Tối ưu cấp phát và GOGC#

  • Sử dụng sync.Pool để tái sử dụng buffer: Thay vì tạo mới slice byte trong mỗi request, tái sử dụng buffer từ pool giúp giảm 80% áp lực lên heap:
GO
var bufferPool = sync.Pool{
    New: func() interface{} {
        return make([]byte, 4096)
    },
}

func processPayload(data []byte) {
    buf := bufferPool.Get().([]byte)
    defer bufferPool.Put(buf)
    // Xử lý dữ liệu...
}
  • **Điều chỉnh GOGC và GOMEMLIMIT (Từ Go 1.19): Đặt GOMEMLIMIT=1800MiB trên container 2GB RAM để Go chủ động điều tiết tần suất GC mượt mà nhất.

2. Bí quyết cho Java: Chuyển sang ZGC hoặc Shenandoah GC#

Nếu đang dùng Java 17 hoặc 21 cho các API yêu cầu độ trễ thấp, hãy loại bỏ ngay cấu hình G1GC cũ kỹ và chuyển sang ZGC:

BASH
java -XX:+UseZGC -XX:+ZGenerational -Xms4g -Xmx4g -jar app.jar
  • ZGC thế hệ mới (Generational ZGC) thực hiện toàn bộ khâu quét và di dời bộ nhớ song song (concurrent), giữ độ trễ dừng thế giới (Stop-the-world) dưới 1 mili-giây ngay cả với heap dung lượng hàng chục GB!

Góc thảo luận#

Anh em có thường xuyên cấu hình các tham số GC flags cho container production không? Chỉ số p99 latency của dịch vụ lõi bên bạn hiện đang ở mức bao nhiêu ms?


Xem thêm nội dung liên quan:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Thu Trang (Backend Engineer)
    #1

    Bật sync.Pool trong Go cho các tác vụ encode/decode JSON hoặc đọc Protobuf là tuyệt chiêu tăng tốc rõ rệt nhất. Số lượng lần cấp phát heap giảm từ 50 xuống còn 2 lần mỗi request, CPU giảm ngay 30%.

Bài liên quan trong #Backend & Microservices

1
TopDev AI Companion
AI
✓ Đã sao chép link