2009-03-08 31 views
21

Tôi đã đọc rất nhiều bài viết về cách điều chỉnh GC trong Java và thường tự hỏi có bao nhiêu người thực sự sử dụng một số tính năng nâng cao hơn.Có ai đã tìm thấy Bộ sưu tập rác được điều chỉnh để hữu ích không?

Tôi luôn tránh điều chỉnh khi có thể và tập trung vào việc viết mã đơn giản nhất có thể (lời khuyên của Brian Goetz) - điều này dường như đã làm việc tốt cho tôi cho đến nay.

Các chiến lược điều chỉnh này có phù hợp để thay đổi trên các phiên bản VM hay không yêu cầu phải đánh giá lại liên tục?

Điều chỉnh một mà tôi đã sử dụng là cờ máy chủ.

+0

Lưu ý rằng cờ máy chủ thường không cần thiết nếu bạn đang thực sự triển khai trên máy chủ. JVM sẽ phát hiện loại môi trường nào đang chạy trong –

+1

Điều này không hoạt động trên Windows. Nó hoạt động trên Linux và Solaris. Hầu hết các hộp Windows đều vượt quá các yêu cầu máy chủ tiêu chuẩn. Có lẽ giả định là chúng sẽ được sử dụng để sử dụng cho khách hàng. – Fortyrunner

Trả lời

20

Một phần công việc hiện tại của tôi là chăm sóc và cho ăn một ứng dụng java lớn được thiết kế để chạy với một lượng bộ nhớ lớn (hiện tại 8 Gb), chủ yếu là do tính toán liên tục với nhiều dữ liệu được lưu trong bộ nhớ cache. Tôi đã triển khai ban đầu với thiết lập GC chuẩn, chủ yếu là do không có cách nào đơn giản để mô phỏng môi trường sản xuất chạy ở chế độ nghiêng đầy đủ.

Trong các giai đoạn, trong vài tháng tới, tôi đã tùy chỉnh cài đặt GC. Nói chung, núm có sẵn lớn nhất dường như là điều chỉnh tần số và cường độ của gc gia tăng - cải tiến lớn nhất đã được giao dịch ngoài gc định kỳ lớn đối với những cái nhỏ hơn và thường xuyên hơn. Nhưng chúng tôi chắc chắn có thể thấy các cải tiến hiệu suất.

Tôi sẽ không đăng cài đặt cụ thể của mình vì a) chúng dành riêng cho thiết lập của chúng tôi và b) vì tôi không có tiện ích này :). Nhưng nói chung, những gì tôi đã tìm thấy là

  • đã có nhiều công việc được thực hiện trong điều chỉnh cài đặt gc mặc định. Hầu hết các mặc định hoạt động tốt hơn bất kỳ điều chỉnh nào tôi thực hiện.
  • Ít nhất đối với tôi, những tình huống mà gc chỉnh đã thực sự đáng giá là cực đủ rằng đó là bất hợp lý để cố gắng mô phỏng họ, vì vậy tôi đã phải làm điều đó thực nghiệm và từng bước.

Here's một tham chiếu tốt từ phiên bản trước. thảo luận stackoverflow.

8

Tôi phải nói rằng tôi không có nhu cầu bản thân mình để sử dụng điều chỉnh rất nhiều. Nhưng tôi làm việc chặt chẽ với những người viết mã nơi độ trễ là rất quan trọng: họ tận dụng nhiều điều chỉnh như vậy - chỉ định thuật toán GC nào để sử dụng, thời gian tạm dừng tối đa, tỷ lệ sống sót, v.v.

Tôi đoán câu trả lời là: nếu độ trễ rất quan trọng đối với ứng dụng, bạn có thể cần xem xét điều chỉnh GC

10

Phần lớn các nhà phát triển sẽ không bao giờ phải (hoặc muốn) điều chỉnh GC. Tôi đã làm việc với những người đã phải điều chỉnh nó và đây là những lời khuyên:

Trước khi bạn cố gắng để điều chỉnh rác thu làm cho chắc chắn 100% bạn đã xác minh, với một hồ sơ. là gì đang diễn ra. Khi bạn bắt đầu điều chỉnh, hãy thực hiện chắc chắn rằng bạn xác minh, với một hồ sơ, rằng nó có tác động tích cực.

Bạn cũng nên xem lại các thay đổi với mỗi phiên bản VM bạn chạy trên (các máy ảo khác nhau sẽ có các chiến lược điều chỉnh khác nhau).

Tôi đã từng giúp một người nào đó gặp vấn đề về GC hóa ra họ không đóng các bộ kết quả JDBC (hoặc một số vấn đề như thế). Điều này gây ra bộ nhớ để không bao giờ được giải phóng (mã của ông được tổ chức vào chúng vì một lý do nào đó). Khắc phục sự cố đó khiến chương trình chuyển từ 20 phút sang 30 giây hoặc vài phút. Việc sử dụng bộ nhớ cũng giảm xuống.

+0

Đó là những gì tôi quan tâm. Bất kỳ chiến lược điều chỉnh nào cũng sẽ cần phải được kiểm tra bất cứ khi nào một bản phát hành JVM diễn ra và thậm chí trong khoảng thời gian đều đặn trong suốt chu kỳ dev - đó là lý do tại sao tôi tránh điều chỉnh. – Fortyrunner

+0

VM dễ biến động, chúng thay đổi/cải thiện GC với mỗi bản phát hành, vì vậy ngay cả "huyền thoại đô thị" về cải thiện hiệu suất có thể sai khi bạn nghe thấy ... luôn viết mã cho bạn và tôi có thể sẽ nhanh chóng đủ, nếu không nó sẽ được dễ dàng hơn để tăng tốc độ nó lên. – TofuBeer

3

Tôi muốn nói điều phổ biến nhất cần điều chỉnh là kích thước bộ nhớ tối đa. Hầu hết các tùy chọn bộ nhớ khác có mặc định hợp lý và thường được điều chỉnh trên IMHO. tức là Đặt khi nó thực sự không tạo ra nhiều khác biệt. Tôi thường thấy mọi người đặt nhiều tùy chọn khi một nửa trong số đó là mặc định trong mọi trường hợp. ;)

Sử dụng một hồ sơ là cách hữu ích nhất để cải thiện hành vi GC (bằng cách giảm số lượng các đối tượng được tạo)

+0

Tôi không chắc chắn rằng hầu hết mọi người sẽ thấy thiết lập tham số Xmx là "điều chỉnh" GC. –

+0

Tôi không đồng ý một chút. Nếu bạn có một hộp bận và phân bổ quá nhiều bộ nhớ - điều này có thể làm cho hộp trao đổi bộ nhớ quá nhiều. – Fortyrunner

+1

Điểm tốt, sử dụng -mx có thể không được coi là điều chỉnh GC, nhưng nó thường là thứ duy nhất bạn cần để có được quyền. Vì @Fortyrunner chỉ ra rằng bạn không muốn nó quá lớn hoặc quá nhỏ. Tôi đã tìm thấy bạn không muốn JVM sử dụng nhiều hơn một ngân hàng bộ nhớ nếu bạn có thể giúp nó. –

3

Tôi có nhưng không phải thời gian gần đây. Ứng dụng mà tôi đang thực hiện là hiển thị thời gian thực của luồng video được tạo từ các hình ảnh JPEG chuyển động riêng lẻ. Vào thời điểm đó (khoảng JDK 1.2 và 1.3), cài đặt -Xincgc sẽ chuyển bộ thu gom rác của khách hàng từ nhiều lần dọn dẹp lớn hơn sang chế độ mà một chút rác được làm sạch thường xuyên. Kết quả là, sự phân bố độ trễ khung hình thấp hơn nhiều, tạo ấn tượng cho một video mượt mà hơn (thay vì 1-2-3-tạm dừng, 1-2-3 tạm dừng).

Tôi chưa xem mã đó trong một thời gian dài nhưng tôi nghi ngờ rằng, với các thuật toán thu gom rác hiện đại, -Xincgc thực sự sẽ giảm hiệu suất.

Trong thế giới ngày nay, tôi sẽ nói rằng sự hoài nghi tối ưu hóa tiêu chuẩn nên luôn áp dụng: hồ sơ hồ sơ cá nhân. Bạn có chắc chắn rằng nút cổ chai thực sự là bộ thu gom rác ...?

+0

Nó có thể làm giảm hiệu suất tổng thể nhưng nó vẫn có thể cải thiện độ trễ rất nhiều.Ví dụ: C++ shared_ptr reference reference, có thể chậm hơn Java GC nhưng hiệu ứng tổng thể là * mượt mà hơn nhiều *. –

+0

@Zan, tôi không nghĩ rằng tôi hiểu nhận xét của bạn. Những gì tôi đã nói là -Xincgc bây giờ là quá ngây thơ. GC hiện đại có nhiều tùy chọn hữu ích hơn. Tôi thậm chí sẽ không kết luận rằng -Xincgc sẽ dẫn đến độ trễ mượt mà hơn mà không cần kiểm tra. –

+0

Điểm của nhận xét của tôi là việc thực hiện các lần dọn dẹp nhỏ liên tục có thể khiến ứng dụng mất nhiều thời gian hơn để chạy, nhưng sẽ dễ chịu hơn nếu sử dụng (nếu ứng dụng tương tác với người dùng). –

2

Tóm lại, có, nó rất hữu ích để điều chỉnh bất kỳ ứng dụng Java nghiêm trọng nào. Chúng tôi thường thấy rằng trong kịch bản sản xuất, đó là sự khác biệt giữa một ứng dụng ổn định và một ứng dụng hoàn toàn không thể đoán trước. Nó chắc chắn không phải là điều đầu tiên tôi làm nhưng một khi bạn có một ứng dụng làm việc và có thể áp dụng tải thực sự cho nó, nó là một trong những điều đầu tiên để điều tra tại thời điểm đó.

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