Hướng dẫn các thông số JVM quan trọng nhất

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ khám phá các tùy chọn nổi tiếng nhất có thể được sử dụng để định cấu hình Máy ảo Java.

2. Bộ nhớ Heap rõ ràng - Tùy chọn Xms và Xmx

Một trong những phương pháp phổ biến nhất liên quan đến hiệu suất 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ác thông số dưới đây có thể được sử dụng để đạt được nó:

-Xms[unit] -Xmx[unit]

Ở đây, đơn vị biểu thị đơn vị mà bộ nhớ (được biểu thị bằng kích thước heap ) sẽ được khởi tạo. Các đơn vị có thể được đánh dấu là 'g' cho GB, 'm' cho MB và 'k' cho KB.

Ví dụ: nếu chúng ta muốn gán tối thiểu 2 GB và tối đa 5 GB cho JVM, chúng ta cần viết:

-Xms2G -Xmx5G

Bắt đầu với Java 8, kích thước của Metaspace không được xác định. Khi nó đạt đến giới hạn chung, JVM sẽ tự động tăng nó lên, Tuy nhiên, để khắc phục mọi sự bất ổn không cần thiết, chúng ta có thể đặt kích thước Metaspace bằng:

-XX:MaxMetaspaceSize=[unit]

Ở đây, kích thước metaspace biểu thị dung lượng bộ nhớ mà chúng ta muốn gán cho Metaspace .

Theo hướng dẫn của Oracle, sau tổng bộ nhớ khả dụng, yếu tố ảnh hưởng lớn thứ hai là tỷ lệ heap dành cho Thế hệ trẻ. Theo mặc định, kích thước tối thiểu của YG là 1310 MB và kích thước tối đa là không giới hạn .

Chúng tôi có thể chỉ định chúng một cách rõ ràng:

-XX:NewSize=[unit] -XX:MaxNewSize=[unit]

3. Thu gom rác

Để ứng dụng ổn định hơn, việc lựa chọn thuật toán Thu gom rác phù hợp là rất quan trọng.

JVM có bốn kiểu triển khai GC :

  • Bộ thu gom rác nối tiếp
  • Bộ thu gom rác song song
  • Bộ thu gom rác CMS
  • Bộ thu gom rác G1

Các triển khai này có thể được khai báo với các tham số dưới đây:

-XX:+UseSerialGC -XX:+UseParallelGC -XX:+USeParNewGC -XX:+UseG1GC

Bạn có thể tìm thêm thông tin chi tiết về triển khai Thu gom rác tại đây.

4. Ghi nhật ký GC

Để giám sát chặt chẽ tình trạng ứng dụng, chúng ta phải luôn kiểm tra hiệu suất Thu gom rác của JVM . Cách dễ nhất để làm điều này là ghi lại hoạt động GC ở định dạng con người có thể đọc được.

Sử dụng các tham số sau, chúng tôi có thể ghi lại hoạt động GC :

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles= -XX:GCLogFileSize=[ unit ] -Xloggc:/path/to/gc.log

UseGCLogFileRotation chỉ định chính sách luân chuyển tệp nhật ký, giống như log4j, s4lj, v.v. NumberOfGCLogFiles biểu thị số lượng tệp nhật ký tối đa có thể được ghi cho một vòng đời ứng dụng. GCLogFileSize chỉ định kích thước tối đa của tệp. Cuối cùng, loggc biểu thị vị trí của nó.

Điểm cần lưu ý ở đây là, có thêm hai tham số JVM có sẵn ( -XX: + PrintGCTimeStamps-XX: + PrintGCDateStamps ) có thể được sử dụng để in dấu thời gian theo ngày tháng trong nhật ký GC .

Ví dụ: nếu chúng tôi muốn gán tối đa 100 tệp nhật ký GC , mỗi tệp có kích thước tối đa là 50 MB và muốn lưu trữ chúng ở vị trí ' / home / user / log /' , chúng tôi có thể sử dụng cú pháp dưới đây:

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Xloggc:/home/user/log/gc.log

Tuy nhiên, vấn đề là một luồng daemon bổ sung luôn được sử dụng để theo dõi thời gian hệ thống ở chế độ nền. Hành vi này có thể tạo ra một số tắc nghẽn hiệu suất; đó là lý do tại sao tốt hơn hết là không nên sử dụng thông số này trong quá trình sản xuất.

5. Xử lý hết bộ nhớ

Việc một ứng dụng lớn gặp lỗi hết bộ nhớ là điều rất phổ biến, do đó dẫn đến lỗi ứng dụng. Đây là một kịch bản rất quan trọng và rất khó lặp lại để khắc phục sự cố.

Đó là lý do tại sao JVM đi kèm với một số tham số kết xuất bộ nhớ heap vào một tệp vật lý có thể được sử dụng sau này để tìm ra các rò rỉ:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid.hprof -XX:OnOutOfMemoryError=";" -XX:+UseGCOverheadLimit

Một số điểm cần lưu ý ở đây:

  • HeapDumpOnOutOfMemoryError hướng dẫn JVM kết xuất heap vào tệp vật lý trong trường hợp OutOfMemoryError
  • HeapDumpPath biểu thị đường dẫn nơi tệp sẽ được ghi; bất kỳ tên tệp nào có thể được cung cấp; tuy nhiên, nếu JVM tìm thấytrong tên, id tiến trình của tiến trình hiện tại gây ra lỗi hết bộ nhớ sẽ được thêm vào tên tệp có định dạng .hprof
  • OnOutOfMemoryError được sử dụng để đưa ra các lệnh khẩn cấp được thực hiện trong trường hợp lỗi hết bộ nhớ; lệnh thích hợp nên được sử dụng trong không gian của cmd args. Ví dụ: nếu chúng ta muốn khởi động lại máy chủ ngay khi hết bộ nhớ, chúng ta có thể đặt tham số:
-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit là một chính sách giới hạn tỷ lệ thời gian của VM mà là chi tiêu trong GC trước một OutOfMemory lỗi được ném

6. 32/64 Bit

Trong môi trường OS nơi cài đặt cả gói 32 và 64 bit, JVM tự động chọn gói môi trường 32 bit.

Nếu chúng ta muốn đặt môi trường thành 64 bit theo cách thủ công, chúng ta có thể làm như vậy bằng cách sử dụng tham số dưới đây:

-d

Bit hệ điều hành có thể là 32 hoặc 64 . Thông tin thêm về điều này có thể được tìm thấy ở đây.

7. Khác

  • -server : cho phép “Server Hotspot VM”; tham số này được sử dụng theo mặc định trong JVM 64 bit
  • -XX: + UseStringDeduplication : Java 8u20 đã giới thiệu tham số JVM này để giảm việc sử dụng bộ nhớ không cần thiết bằng cách tạo quá nhiều trường hợp của cùng một chuỗi; điều này tối ưu hóa bộ nhớ heap bằng cách giảmcác giá trị Chuỗi trùng lặpthành một mảng char [] chung duy nhất
  • -XX: + UseLWPSynchronization : đặtchính sách đồng bộ hóa dựa trên LWP ( Light Weight Process ) thay vì đồng bộ hóa dựa trên luồng
  • -XX: LargePageSizeInBytes : đặt kích thước trang lớn được sử dụng cho Java heap; nó nhận đối số bằng GB / MB / KB; với kích thước trang lớn hơn, chúng tôi có thể sử dụng tốt hơn tài nguyên phần cứng bộ nhớ ảo; tuy nhiên, điều này có thể gây ra kích thước không gian lớn hơn cho PermGen , do đó có thể buộc phải giảm kích thước của không gian heap Java
  • -XX: MaxHeapFreeRatio : đặt tỷ lệ phần trăm tối đa của đống trống sau GC để tránh bị thu hẹp.
  • -XX: MinHeapFreeRatio : đặt tỷ lệ phần trăm tối thiểu của heap trống sau GC để tránh mở rộng; để theo dõi việc sử dụng heap, bạn có thể sử dụng VisualVM được vận chuyển cùng với JDK.
  • -XX: SurvivorRatio : Tỷ lệ của kích thước không gian eden / người sống sót - ví dụ : -XX: SurvivorRatio = 6 đặt tỷ lệ giữa mỗi không gian sống sót không gian mở rộng là 1: 6,
  • -XX: + UseLargePages : sử dụng bộ nhớ trang lớn nếu nó được hệ thống hỗ trợ; xin lưu ý rằng OpenJDK 7 có xu hướng bị lỗi nếu sử dụng thông số JVM này

  • -XX: + UseStringCache : cho phép bộ nhớ đệm của chuỗi thường được phân bổ có sẵn trong chuỗi hồ bơi

  • -XX: + UseCompressedStrings : sử dụng kiểu byte [] chocác đối tượng Chuỗi có thể được biểu diễn ở định dạng ASCII thuần túy
  • -XX: + OptimizeStringConcat : nó tối ưu hóa cáchoạt động nối chuỗi nếu có thể

8. Kết luận

Trong bài viết nhanh này, chúng ta đã tìm hiểu về một số tham số JVM quan trọng - có thể được sử dụng để điều chỉnh và cải thiện hiệu suất ứng dụng chung.

Một số trong số này cũng có thể được sử dụng cho mục đích gỡ lỗi.

Nếu bạn muốn khám phá các thông số tham chiếu chi tiết hơn, bạn có thể bắt đầu tại đây.