2012-04-09 5 views
6

Tôi thấy rằng với -Xmx2g, bộ nhớ cao điểm đạt đến 1G và có các bộ sưu tập chính (bộ thu marksweep). Với -Xmx3g, nó đạt 1,5G và thực hiện một bộ sưu tập lớn. Với -Xmg4g, nó đạt đến 2G và thực hiện các bộ sưu tập lớn. Nhưng, từ đây tôi đã cố gắng tăng bộ nhớ tối đa lên 6G, 8G, 12G và tất cả các lần bộ nhớ cao điểm đạt đến 2G thực hiện các bộ sưu tập chính.Sử dụng bộ nhớ tối đa không vượt quá giới hạn

Làm cách nào để sử dụng vượt quá 2G? Tôi đã không đi qua bất kỳ thiết lập cho điều này. Liệu -Xms có quan trọng ở đây không? Đối với những người -Xmx, tôi đã thực hiện -Xms một nửa -Xmx.

Tôi đang sử dụng Jetty, Java 1.6.024.

CẬP NHẬT: Có, tôi đang sử dụng JVM 64 bit. Các tùy chọn JVM tôi đang sử dụng là: -Xmx6g -Xms3g -XX: MaxPermSize = 256m Cách tôi xác định bộ nhớ đỉnh bằng cách xem biểu đồ bộ nhớ trong JConsole. Nó đạt đến 2G và giọt (bộ sưu tập lớn). Old Gen đạt 1,5G max và sau đó thả xảy ra.

Cảm ơn, Prams.

+4

Giả sử bạn đang sử dụng JVM 64 bit có phải là giả thiết không? Nó đáng để hỏi, vì JVM 32 bit có giới hạn kích thước 2GB được xây dựng. – duffymo

+0

Tôi nghĩ rằng nó an toàn để nói đó là một JVM 64 bit, vì Java sẽ chấm dứt mà không chạy chương trình nếu bạn chỉ định kích thước heap lớn hơn nhiều hơn 1500m (giới hạn chính xác là phụ thuộc vào JVM). – rob

+0

Bạn đã thử chơi với các thuộc tính -XX chưa? –

Trả lời

1

Bạn có ba vùng bộ nhớ, eden, người sống sót và không gian được thuê.

Điều tôi nghi ngờ là diễn biến là không gian được thuê hoặc không gian sẽ không tăng khi bạn tăng kích thước tối đa.

Lý do hai khu vực này quan trọng là khi không gian được lấp đầy đầy đủ GC được kích hoạt (tôi nghi ngờ kích thước này đang tăng) Khi không gian eden đầy và không có đủ không gian trong không gian sống sót để sao chép tất cả các đối tượng bên trái, một GC đầy đủ cũng được kích hoạt.

Nếu đây là nguyên nhân gây ra sự cố, bạn đang tạo một số lượng lớn các đối tượng trung bình có khả năng là vấn đề hiệu suất, trừ khi bạn có thể giảm số được tạo. Một giải pháp thay thế là chỉ định một kích thước mới lớn hơn làm tăng kích thước eden.

Hãy thử -mx12g -XX:NewSize=10g - verbosegc

Tùy chọn cuối cùng sẽ cung cấp cho bạn các kích thước của không gian cá nhân khi họ đang dọn dẹp.

+0

Peter, cảm ơn câu trả lời. Tôi có câu hỏi tiếp theo. Một trong những kích thước giữ lại của đối tượng của chúng tôi là khoảng 4MB. Và chúng ta tạo một đối tượng như vậy mỗi phút và thay thế nó bằng đối tượng của phút trước đó trong một ConcurrentHashMap tĩnh. Theo tôi có thể thấy đây là vật thể lớn nhất.Tất nhiên có rất nhiều đối tượng String khác và các đối tượng tạm thời khác, nhưng tất cả chúng đều nhỏ hơn 4MB. Đây có phải là một kích thước quá lớn cho một không gian Eden của 3G? Bởi vì khi tôi có 6G, tôi đã thử với NewRatio của 1 và điều đó không giúp ích cho việc sử dụng tối đa vượt quá 2G. Cảm ơn. – prams

+0

Các đối tượng lớn được phân bổ trực tiếp đến không gian đã thuê. Nếu bạn có một đối tượng thực sự được tạo thành từ rất nhiều đối tượng nhỏ thì chúng sẽ được phân bổ cho không gian eden. Đối với các đối tượng lớn như thế này, bạn nên tự mình tái chế chúng nếu bạn có thể theo cách đơn giản. –

+0

Cài đặt NewSize thành kích thước lớn giúp đạt được các đối tượng bộ nhớ cao nhất. Cảm ơn. Tôi sẽ cho bạn biết cấu hình của tôi và một số chi tiết về các đối tượng mà chúng tôi tạo ra. Và sẽ hỏi một câu hỏi (trong phần bình luận tiếp theo). Trình hồ sơ chỉ ra 2 địa điểm tiêu thụ nhiều bộ nhớ: 1) Khoảng 5 chuỗi (mỗi 110KB) mỗi giây được tạo. 2) Một đối tượng có chứa 4 đối tượng (của một lớp đơn) được tạo ra mỗi phút và được thay thế thành một concurrenthashmap tĩnh (vì vậy bản đồ chỉ chứa 1 đối tượng bất kỳ lúc nào). Mỗi trong số 4 đối tượng đó chứa danh sách mảng 10K, ngày 10K và các chuỗi khác, v.v. – prams