2013-04-01 34 views
5

Tôi có một ứng dụng java sử dụng càng nhiều CPU càng tốt và, với nó, rất nhiều bộ nhớ (lên đến 80Gb).Cho CPU nhiều thời gian hơn vào GC trong java?

Tôi đang tối ưu hóa GC cho ứng dụng đó và tôi muốn yêu cầu JVM sử dụng phần trăm thời gian nhất định (60%) cho GC, nếu không, thời gian máy không ở trong GC đang xử lý và phân bổ nhiều hơn ký ức.

tôi muốn khẳng định rằng tham số -XX:CMSIncrementalDutyCycle=60 là điều tôi đang tìm kiếm và nếu có bất kỳ thông số khác để trao thêm quyền lực cho GC (Tôi đã nhìn thấy CMSIncrementalPacingCMSIncrementalDutyCycleMin)

Cảm ơn một bó!

+1

"Tôi muốn xác nhận rằng tham số XX: CMSIncrementalDutyCycle = 60 là thig mà tôi đang tìm kiếm" - thử nó, bật ghi nhật ký GC và xem? Ngoài ra, ngoài sự tò mò: bạn đang làm gì mà tạo ra đủ lượng rác thải cho 60% thời gian dành cho GC để không phải là rất nhiều? – millimoose

Trả lời

1

Bạn không thể đặt a trần để sử dụng CPU trong khi thu thập GC.

Các CMSIncrementalDutyCycle được sử dụng để đặt thời gian giữa các bộ sưu tập nhỏ (xem [1]), vì vậy bạn có thể kiểm soát mức độ thường xuyên chạy GC và do đó gián tiếp việc sử dụng CPU. Tuy nhiên, không có tham số nào cho phép bạn kiểm soát việc sử dụng CPU trực tiếp.

+1

Thực tế CMSIncrementalDutyCycle chỉ cho phép điều khiển gián tiếp của nó. Than ôi, vấn đề của tôi đã được giải quyết bằng cách giảm đáng kể thế hệ trẻ. Cảm ơn tất cả. – mors

1

tôi muốn khẳng định rằng XX: CMSIncrementalDutyCycle = 60 tham số là thig Tôi đang tìm kiếm và nếu có bất kỳ thông số khác để trao thêm quyền lực cho GC (Tôi đã nhìn thấy CMSIncrementalPacing và CMSIncrementalDutyCycleMin)

Không, bạn đã sai. Cờ này sẽ không kiểm soát phần trăm CPU sẵn có nào sẽ được phân bổ cho GC của JVM. Các tài liệu khẳng định:

-XX:CMSIncrementalDutyCycle=<N> default: 50 

Đây là tỷ lệ phần trăm (0-100) thời gian giữa bộ sưu tập nhỏ mà các nhà sưu tập đồng thời được phép chạy. Nếu CMSIncrementalPacing được kích hoạt là thì đây chỉ là giá trị ban đầu.

Vì vậy, giả sử bạn đang sử dụng bộ thu CMS (-XX:+UseConcMarkSweepGC), thì cờ phía trên kiểm soát phần trăm thời gian CMS được phép thực hiện giữa các bộ sưu tập GC nhỏ.

Không có cờ cho phép bạn kiểm soát trực tiếp lượng thời gian mà chuỗi GC thực thi.

+0

ok. Vì vậy, những gì xảy ra giữa các bộ sưu tập nhỏ bên cạnh GC chạy? – mors

+0

ứng dụng của bạn thực hiện, jit biên dịch các phương thức, vv –

+0

Bạn cũng nên giả định rằng -XX: + CMSIncrementalMode được kích hoạt, đó không phải là ý tưởng tốt cho hộp "lớn" –

1

Đầu tiên, CMSIncreamentalDutyCycle ảnh hưởng đến việc tăng số lượng CMS tăng dần (cần được bật bởi -XX:+CMSIncrementalMode). Chế độ gia tăng là xấu cho công việc của bạn theo bất kỳ cách nào.

Thứ hai, bạn có thể giới hạn số lõi CPU được tiêu thụ bởi các nhiệm vụ GC.

  • -XX:ParallelGCThreads=N bộ số cốt lõi cho các giai đoạn Stop-the-Thế giới
  • -XX:ConcGCThreads=N bộ số cốt lõi cho các nhiệm vụ đồng thời (chỉ dành cho CMS)

Bạn có thể tìm thêm GC liên quan lựa chọn here.

Các vấn đề liên quan