Về tất cả bài viếtNguyen ThuyenHướng Dẫn0 lượt xem9 phút đọc

Hướng Dẫn Tối Ưu JVM Flag Cho Server Minecraft

Tìm hiểu Aikar flags Minecraft và JVM flag cho server G1GC, giúp giảm lag do bộ gom rác và sử dụng PaperMC start script generator để phân bổ RAM tối ưu.

Aikar Flags Minecraft là gì và tối ưu JVM flag thế nào?

Aikar flags Minecraft là bộ tham số khởi động JVM tối ưu hóa bộ gom rác G1GC, được thiết kế nhằm kiểm soát tốc độ cấp phát bộ nhớ tới 800MB/giây của máy chủ Paper, giữ thời gian dừng xử lý dưới mốc 200 mili-giây.

Tóm tắt nhanh:

  • Đồng bộ -Xms bằng -Xmx để JVM giữ vùng nhớ liên tục, tránh nghẽn khi cấp phát động.

  • Cắt giảm 1.000–1.500MB RAM khỏi tổng dung lượng máy chủ để tránh bị tiến trình OOMKiller can thiệp.

  • Ép G1NewSizePercent=30 và MaxTenuringThreshold=1 giúp các đối tượng dữ liệu tạm biến mất ngay trong Young Generation.

  • Công cụ PaperMC Start Script Generator giúp tự động kết xuất chuỗi cờ chuẩn cho từng dung lượng RAM.

JVM flag là gì và tại sao cấu hình mặc định gây lag server?

Bộ tham số JVM flag điều khiển cách Java phân bổ CPU và RAM khi vận hành máy chủ Minecraft. Ở cấu hình mặc định, một máy chủ 30 người chơi xả rác bộ nhớ tới 800MB/giây, khiến bộ gom rác chạy 1–2 lần mỗi giây và gây tụt tick rate nghiêm trọng.

Máy ảo Java (JVM) là nền tảng khởi chạy tệp tin paper.jar hoặc purpur.jar. Mặc định, JVM được cấu hình cho các ứng dụng doanh nghiệp dài hạn thay vì các tác vụ đòi hỏi độ trễ cực thấp theo từng tick (50ms/tick) của game server. Khi người chơi liên tục di chuyển, tải chunk mới, kích hoạt redstone và sinh mob, hàng triệu đối tượng ngắn hạn như tọa độ khối (BlockPos) liên tục được tạo ra rồi bị vứt bỏ.

Nếu chạy với cờ mặc định, Java sẽ gặp các vấn đề cố hữu sau:

  • Tần suất dọn rác dồn dập: Vùng nhớ mới (Young/Eden Generation) mặc định chỉ chiếm khoảng 5% dung lượng heap, khiến không gian bị lấp đầy chỉ trong vài trăm mili-giây.

  • Trì hoãn xử lý (Stop-The-World): Mỗi khi bộ gom rác (Garbage Collector - GC) kích hoạt dọn dẹp, toàn bộ tiến trình xử lý game loop bị tạm dừng khiến TPS lao dốc đột ngột.

  • Đẩy nhầm dữ liệu sang Old Generation: Do vùng nhớ mới quá chật hẹp, các dữ liệu rác tồn tại ngắn hạn bị đẩy nhầm sang phân vùng dữ liệu dài hạn, tích tụ dần và dẫn tới các đợt dọn rác tổng (Full GC) kéo dài hàng giây.

Nếu người vận hành giữ nguyên thiết lập mặc định của Java, máy chủ sẽ bị giảm gián đoạn định kỳ sau mỗi 30–60 giây dù chỉ số CPU và RAM hiển thị trên bảng điều khiển chưa chạm ngưỡng quá tải. Để xử lý triệt để bài toán này, cấu hình chuyên biệt từ Aikar can thiệp trực tiếp vào hành vi của thuật toán G1GC.

Aikar Flags can thiệp vào bộ gom rác G1GC như thế nào?

Aikar flags cấu hình lại thuật toán G1GC bằng cách nâng kích thước vùng nhớ mới lên 30–40% thay vì 5% mặc định. Thiết lập này kéo dài khoảng cách giữa các đợt dọn rác, chặn đứng tình trạng các gói dữ liệu tạm bị đẩy sớm sang Old Generation.

Bộ tham số này do Aikar, lập trình viên thuộc dự án PaperMC, nghiên cứu dựa trên biểu đồ phân bổ bộ nhớ thực tế của Minecraft. Thay vì để GC tự điều tiết thụ động, chuỗi cờ ép JVM hoạt động theo cơ chế chủ động dọn dẹp từng phần nhỏ liên tục để bảo toàn tick rate 20 TPS.

Tham số cấu hình

Giá trị thiết lập

Cơ chế tác động kỹ thuật

Xms & Xmx

Đặt bằng nhau (vd: 10G)

Cấp phát bộ nhớ cố định ngay từ đầu, ngăn JVM tốn tài nguyên co giãn heap

XX:+AlwaysPreTouch

Kích hoạt (+)

Ép hệ điều hành gán sẵn các trang bộ nhớ vật lý liên tục ngay khi khởi động

XX:+DisableExplicitGC

Kích hoạt (+)

Chặn các plugin kém chất lượng tự ý gọi lệnh dọn rác cưỡng bức System.gc()

XX:G1NewSizePercent=30

30% tổng heap

Đảm bảo vùng nhớ mới luôn đủ rộng để chứa lượng lớn đối tượng BlockPos

XX:G1MaxNewSizePercent=40

40% tổng heap

Khống chế trần vùng nhớ mới, tránh việc mở rộng quá đà làm lấn chiếm Old Gen

XX:G1HeapRegionSize=8M

8 Megabytes

Ngăn ngừa các dữ liệu lớn hơn 4MB bị xếp vào dạng Humongous Allocation

XX:MaxGCPauseMillis=200

200 mili-giây

Đặt mục tiêu thời gian dừng tối đa cho mỗi chu kỳ GC không vượt quá 4 tick

XX:MaxTenuringThreshold=1

1 chu kỳ sống sót

Giải phóng nhanh đối tượng tạm, chỉ chuyển sang Old Gen nếu dữ liệu thực sự sống lâu

Việc vô hiệu hóa lệnh dọn rác thủ công (DisableExplicitGC) loại bỏ nguy cơ giật khung hình do plugin gây ra, bởi nhiều plugin cũ thường tự kích hoạt Full GC mà không tính toán đến tải trọng thực tế của máy chủ. Cùng với đó, tham số G1HeapRegionSize=8M bảo vệ phân vùng bộ nhớ khỏi tình trạng phân mảnh khi người chơi mở rộng bản đồ với tốc độ cao.

Hiểu được ý nghĩa của từng tham số là bước đầu, nhưng sai sót phổ biến nhất của các admin lại nằm ở khâu tính toán dung lượng RAM phân bổ cho tham số -Xms và -Xmx.

Làm thế nào để tính toán lượng RAM chuẩn với PaperMC Start Script Generator?

Công cụ Start Script Generator của PaperMC chuyển đổi dung lượng RAM vật lý thành các cờ khởi động tương thích riêng cho Paper, Velocity hoặc Folia. Khi gán thông số, quy tắc bắt buộc là trừ hao 1.000–1.500MB bộ nhớ ngoài heap để tránh tiến trình bị OOMKiller tiêu diệt đột ngột.

Nhiều người quản trị mắc sai lầm nghiêm trọng: máy chủ có 8GB RAM thì điền thẳng -Xmx8G. Trong thực tế, Java cần bộ nhớ ngoài heap (off-heap memory) để chứa Metaspace, luồng xử lý (threads), mã máy sau biên dịch JIT và phục vụ các thư viện mạng gốc. Nếu không chừa lại khoảng trống, hệ điều hành Linux sẽ kích hoạt cơ chế Out of Memory Killer (OOMKiller) và tắt ngang tiến trình server mà không để lại crash log.

Để tạo lệnh khởi động chuẩn xác, bạn thực hiện theo các bước sau:

  1. Truy cập công cụ PaperMC Start Script Generator.

  2. Chọn tên file Jar khởi động server (VD: server.jar )

  3. Chọn hệ điều hành máy chủ đang vận hành (Linux hoặc Windows).

  4. Chọn bộ cờ khởi động: tích chọn mục Aikar's.

  5. Phân bổ giá trị RAM thực tế dựa trên quy tắc trừ hao:

  • Gói hệ thống 8GB RAM: Phân bổ -Xms66560M -Xmx6656M (chừa ~1.5GB cho hệ thống).

  • Gói hệ thống 16GB RAM: Phân bổ -Xms14G -Xmx14G (chừa 2GB cho hệ thống).

Sau đó sao chép chuỗi Flag rồi dán vào tệp khởi động máy chủ. Nếu bạn sử dụng máy chủ tại LumineCloud, người quản trị có thể dán trực tiếp chuỗi cờ này vào trường cấu hình startup trong panel mà không cần điều chỉnh phức tạp. Khi cộng đồng mở rộng, panel cho phép nâng lẻ RAM mà không bắt buộc nâng cấp cả gói dịch vụ, giúp việc nới rộng heap diễn ra thuận tiện.

Việc trừ hao đúng dung lượng giúp máy chủ vận hành ổn định trong suốt các đợt lưu bản đồ nặng mà không lo bị ngắt kết nối đột ngột. Dẫu vậy, Aikar flags không phải là giải pháp vạn năng cho mọi quy mô máy chủ.

Khi nào máy chủ Minecraft không nên sử dụng Aikar Flags?

Aikar flags phát huy hiệu quả tốt nhất trên các máy chủ có heap từ 6GB đến 10GB vận hành trên Java 17 hoặc Java 21. Trong một số trường hợp phần cứng đặc thù, việc ép dùng bộ cờ này có thể làm giảm hiệu năng xử lý thay vì tăng tốc.

Các tình huống không nên hoặc không cần áp dụng bộ cờ:

  • Dung lượng RAM dưới 4GB: Thuật toán G1GC cần không gian bộ nhớ đủ rộng để chia nhỏ thành các Region. Khi heap dưới 3GB, việc ấn định G1NewSizePercent=30 sẽ bóp nghẹt Old Generation, khiến server nhanh chóng bị tràn bộ nhớ khi tải plugin nặng.

  • Cấu hình heap vượt quá 16GB đến 24GB: Gán quá nhiều RAM cho Minecraft Paper gây ra hiện tượng giảm hiệu suất biên (diminishing returns). Khi heap quá lớn, thời gian quét con trỏ của G1GC sẽ kéo dài, và việc chuyển sang Generational ZGC trên Java 21 sẽ đem lại độ trễ thấp hơn.

  • Môi trường Java 21 mặc định không có dấu hiệu nghẽn: Trình thu gom rác trên các bản JDK mới đã được cải tiến rất nhiều so với thời điểm Java 8. Nếu kiểm tra biểu đồ tick rate không thấy có hiện tượng micro-stutter do GC gây ra, việc giữ cấu hình mặc định là lựa chọn an toàn nhất.

Xác định đúng ngưỡng giới hạn giúp người quản trị tránh được tình trạng lãng phí tài nguyên, không đổ tiền thuê các máy chủ 32GB RAM vô ích trong khi nút thắt thực sự nằm ở xung nhịp đơn nhân của CPU.

Câu hỏi thường gặp về tối ưu JVM flag cho Minecraft

Tại sao phải đặt giá trị -Xms bằng với -Xmx khi chạy Aikar flags?

Đặt -Xms bằng -Xmx buộc hệ điều hành cấp phát trọn vẹn vùng nhớ liên tục ngay từ đầu. Nếu để hai giá trị lệch nhau, JVM sẽ phải liên tục xin cấp thêm hoặc thu hồi RAM từ hệ điều hành khi máy chủ đông người, gây ra hiện tượng khựng khung hình do co giãn heap.

Thêm nhiều RAM vượt mức 16GB có giúp server Paper mượt hơn không?

Không. Đa số các Software Minecraft vận hành đơn luồng trên vòng lặp chính của thế giới. Khi cấp phát vượt quá 16GB cho một cụm sinh tồn Paper thông thường, bộ gom rác G1GC mất nhiều thời gian hơn để quét qua các phân vùng bộ nhớ khổng lồ, làm tăng thời gian xử lý mà không cải thiện được chỉ số TPS.

Làm thế nào để thêm Aikar flags trên server LumineCloud?

Người quản trị chỉ cần truy cập vào portal LumineCloud, chọn máy chủ cần điều chỉnh và chuyển tới mục Startup. Tại đây, bạn điền các tham số Aikar flags vào ô cấu hình cờ khởi động rồi khởi động lại server, không cần thao tác dòng lệnh hay sửa file sh.

Làm sao để biết bộ gom rác G1GC có đang gây lag cho server hay không?

Bạn có thể cài đặt công cụ phân tích Spark profiler. Nếu nhật ký ghi nhận các đợt dừng GC vượt quá 100ms liên tục trùng với thời điểm TPS giảm, máy chủ đang bị nghẽn bộ nhớ.


Tự tạo Startup Flag qua công cụ của PaperMC và theo dõi chỉ số tick rate thực tế để kiểm chứng độ mượt của máy chủ. Nếu hiệu năng đơn nhân đang là rào cản khiến server gián đoạn, hạ tầng máy chủ chạy CPU AMD Ryzen 9 9950X hoặc Threadripper 3960X tại LumineCloud cung cấp tốc độ xử lý tick rate vượt trội, đồng thời bảng điều khiển hỗ trợ nâng lẻ RAM trực tiếp mà không cần cấu hình lại tệp tin khởi động.

Đọc tiếp