Mục lục
Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu hiểu các tùy chọn thường được sử dụng để cấu hình Java Virtual Machine.
Cấu hình Heap Memory – Xms, Xmx Options
Một trong những phương pháp phổ biến nhất liên quan đến hiệu suất của ứng dụng là khởi tạo bộ nhớ heap theo yêu cầu ứng dụng.
Đó là lý do tại sao chúng ta nên chỉ định kích thước heap tối thiểu và tối đa, để cấu hình 2 thông số này chúng ta có thể cấu hình như sau
-Xms<heap size>[unit] -Xmx<heap size>[unit]
Trong đó, unit biểu thị đơn vị ‘g’ tương tứng GB, ‘m’ tương ứng MB và ‘k’ for KB. Ví dụ chúng ta muốn chỉ định kích thước heap memory tối thiếu là 2gb và tối đa là 4gb
-Xms2G -Xmx4G
JDK8: Metaspace
Kể từ Java 8, classes metadata được lưu trữ trong heap và vùng nhớ này được gọi Metaspace. Chúng ta có một số options sau để cấu hình cho vùng nhớ này.
XX:MetaspaceSize=<NNN>
XX:MaxMetaspaceSize=<NNN>
Trong đó <NNN> là lượng không gian tối đa được cấp cho Metaspace (tính bằng byte)
Garbage Collection
Garbage Collection (GC) – Trình dọn rác là một thành phần rất quan trọng có thể ảnh hưởng đến toàn bộ quá trình vận hành của ứng dụng.
JVM có 4 loại GC :
- Serial Garbage Collector
- Parallel Garbage Collector
- CMS Garbage Collector
- G1 Garbage Collector
Mỗi loại GC trên sẽ có cách hoạt động khác nhau, chúng ta có thể chỉ định một trong số chúng bằng cách
-XX:+UseSerialGC => sử dụng Serial Garbage Collector -XX:+UseParallelGC => sử dụng Parallel Garbage Collector -XX:+USeParNewGC => sử dụng CMS Garbage Collector -XX:+UseG1GC => sử dụng G1 Garbage Collector
Việc lựa chọn một loại GC phù hợp với ứng dụng là vô cùng quan trọng vì nó ảnh hưởng đến quá trình vận hành của toàn ứng dụng. Do việc việc lựa chọn đúng GC là cần thiết, để biết thêm thông tin về cách vận hành của mỗi loại GC các bạn có thể tìm hiểu tại đây.
GC Logging
Để đảm bảo ứng dụng luôn hoạt động ổn định, chúng ta phải thường xuyên kiểm tra tình trạng hoạt động của GC. Cách dễ nhất để làm điều này là ghi lại hoạt động GC, để chúng ta có thể kiểm tra nó khi ứng dụng có các lỗi liên quan đến bộ nhớ xảy ra.
Dưới đây là một số options để chúng ta có thể cấu hình GC Logging
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=< number of log files > -XX:GCLogFileSize=< file size >[ unit ] -Xloggc:/path/to/gc.log
Trong đó:
- UseGCLogFileRotation – việc ghi log sẽ xoay vòng qua từng file khi nó đạt đến giới hạn kích thước và số lượng file
- XX:NumberOfGCLogFiles – Số lượng log file tối đa được ghi của một ứng dụng, những file cũ nhất sẽ được xóa đi nhường chỗ cho các file mới được ghi vào
- GCLogFileSize – kích thước tối đa của một file log
- Xloggc – Vị trí đặt file log
Ví dụ
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Xloggc:/home/user/log/gc.log
Tuy nhiên, vấn đề là sẽ có thêm daemon thread bổ sung luôn được sử dụng để theo dõi thời gian hệ thống ở chế độ background. Việc này ít nhiều sẽ ảnh hưởng đến hiệu xuất của ứng dụng, và chúng ta không nên sử dụng những cấu hình này khi chạy ứng dụng trên môi trường production.
32/64 Bit
Trong môi trường OS nơi cài đặt cả 2 package 32 và 64 bit, JVM tự động chọn 32bit theo mặc định. Nếu chúng ta muốn thay đổi environment sang 64 bit thì có thể thêm option sau
-d<OS bit>
Tóm lược
Trên đây là một số options thường xuyên được sử dụng để cấu hình JVM. Tuy nhiên bạn đang quá trình tìm hiểu và học tìm hiểu về Java thì không cần phải quan tâm quá nhiều đến những cấu hình này. Vì những cấu hình mặc định cơ bản đã đáp ứng đủ nhu cầu. Tuy nhiên nếu bạn đang vận hành và duy trì ứng dụng chạy trên môi trường production thì các bạn nên quan tâm đến những cấu hình này để có thể vận hành ứng dụng cách hiệu quả hơn.
Nguồn tham khảo
https://blogs.oracle.com/poonam/about-g1-garbage-collector,-permanent-generation-and-metaspace