Một vài ghi chép về Java Hotspot VM Garbage Collector (JVM GC)
Java
77
GarbageCollector
1
White

studybot viết ngày 23/05/2015

Một vài ghi chép về Java Hotspot GC

Garbage collector thực hiện việc quản lý bộ nhớ thông qua 3 công việc:

  • Gán đối tượng vào pool các đối tượng mới (young generation) và tăng tuổi cho các đối tượng cũ (old generation)
  • Tìm các đối tượng cũ còn sống thông qua một quá trình marking đồng thời. Java HotSpot VM sẽ khởi động quá trình marking khi tổng bộ nhớ Java heap đang sử dụng lớn hơn một giá trị ngưỡng nào đó.
  • Tăng bộ nhớ có thể cấp phát bằng cách xếp các đối tượng (objects) đang sống gần nhau hơn thông qua thao tác copy song song (parallel copying)

Phần lớn các ứng dụng không cần phải điểu chỉnh GC. Tuy vậy với một số lớp ứng dụng với các đặc điểm sau, việc điều chỉnh GC là cần thiết:

  • Dữ liệu xử lý lớn (đơn vị GB)
  • Nhiều thread
  • Tỉ lệ transaction cao

Tương quan giữa throughput và thời gian GC. Thời gian GC càng dài, throughput của ứng dụng Java càng thấp. Nhìn biểu đồ ta có thể thấy, ứng dụng giảm throughput 80% khi thời gian GC chiếm 10% tổng thời gian chạy.

alt text

Sử dụng đúng chủng loại GC do đó có khả năng ảnh hưởng lớn đến performance.

Giá tri mặc định khi khởi động JVM

Bắt đầu từ J2SE 5.0, launcher có ngoài việc khởi động ứng dụng Java còn làm thêm một việc nữa là kiểm tra xem máy tính hiện tại có phải là máy chủ không. Dựa vào kết quả kiểm tra này mà launcher sẽ khởi động Java Hotspot Server Virtual Machine thay vì Java Hotspot Client Virtual Machine.

"máy chủ" là máy có ít nhất 2 CPUs (cores) và ít nhất là 2GB bộ nhớ.

GC mặc định cho đến tận Java1.7 vẫn là ParallelGC, dù rằng oracle giới thiệu G1 từ Java7. Do vậy cho đến hiện tại có các GC sau:

Khi khởi động JVM mà không xác định đối số gì cụ thể, JVM sẽ cố gắng phát hiện xem máy hiện tại là máy chủ hay máy trạm. Nếu là máy chủ JVM sẽ khởi động với các thông số sau:

  • Sử dụng parallelGC (-XX:+UseParallelGC)
  • Bộ nhớ heap tối thiểu được đặt bằng 1/64 bộ nhớ vật lý. Cài đặt giá trị này bằng lựa chọn (-Xms giá trị)
  • Bộ nhớ heap tối đa bằng 1/4 bộ nhớ vật lý và tối đa là 1GB (Nếu 1/4 bộ nhớ vật lý lớn hơn 1G, giá trị bộ nhớ heap tối đa sẽ là 1GB). Cài đặt giá trị này bằng lựa chọn (-Xmx giá trị)

Tuning ParallelGC

ParallelGC cho phép tự động tuning dựa vào các tiêu chí sau:

  • Thời gian tối đa cho GC hoạt động
  • Throughput
  • Footprint (kÍch thước heap)

Thời gian tối đa cho GC hoạt động được điều chỉnh bằng lựa chọn -XX:MaxGCPauseMillis=<N>. Giá trị này có ý nghĩa là: thời gian mong muốn tối đa mỗi lần GC hoạt động là N miliseconds. GC sẽ tự điều chỉnh các giá trị khác (độ lớn heap và các giá trị GC khác) để đảm bảo thời gian này. Giá trị throughput tổng thể có khả năng sẽ bị giảm

Giá trị throughput cho GC được tính bằng thời gian trong GC / thời gian ngoài GC (Thời gian dành cho ứng dụng của JVM). Mục tiêu này có thể được cài đặt bằng lựa chọn -XX:GCTimeRatio=<N>. Lựa chọn này có ý nghĩa là: tỉ lệ giữa thời gian GC và thời gian ứng dụng là 1 / (1+N)

VÍ dụ: -XX:GCTimeRatio=19 có nghĩa là có 1/(1+19) = 1/20 hay 5% thời gian JVM là cho hoạt động GC. Giá trị mặc định là 99 tương đương với việc JVM dành 1% thời gian cho hoạt động GC (Cũng có nghĩa là JVM throughput giảm 20% so với khi không có GC)

Kích thước heap được xác định bằng lựa chọn -Xmx<N>. Tuy vậy JVM có xu hướng giảm thiểu tối đa bộ nhớ heap khi các chỉ số khác đạt được.

Thứ tự các mục tiêu. Khi mục tiêu trước đạt được rồi, GC mới cố gắng cho mục tiêu tiếp theo.

  1. Thời gian dừng cho hoạt động GC
  2. Throughput
  3. Bộ nhớ heap

Tài liệu tham khảo

Lược dịch và tóm tắt từ các tài liệu sau:

  1. http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#ergonomics
  2. http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

studybot

15 bài viết.
9 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
14 12
Một vài thủ thuật vim mới biết, ghi lại cho khỏi quên Căn lề các cột dữ liệu Để căn lề ấn phím esc (để sang command mode) :%column t Chọn th...
studybot viết hơn 3 năm trước
14 12
White
10 9
Javascript context (ngữ cảnh?) là một khái niệm khó hiểu trong Javascript. Tuy vậy để code Javascript thành thạo thì việc nắm vững context là điểu ...
studybot viết 3 năm trước
10 9
White
8 3
Javascript là ngôn ngữ có nhiều điểm rất thú vị. Dưới đây là một vài ví dụ cho thấy sự thú vị của Javascript. Ví dụ 1 javascript a = "zero","on...
studybot viết 3 năm trước
8 3
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết gần 3 năm trước
0 0
Male avatar
9 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết gần 2 năm trước
9 5
White
4 2
Một số hàm giúp mapping data đơn giản với Groovy Ví dụ với list data như sau: def student1 = name: "Huan", age: 22, gender: "male"] def student...
Tất Huân viết 5 ngày trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
15 bài viết.
9 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!