Tôi nghĩ bạn có hiểu lầm về cách JVM hoạt động. Đây không phải là vấn đề GC hoặc vấn đề "nhiệm vụ".
Nhiệm vụ của bạn bị rò rỉ bộ nhớ hoặc chúng được thiết kế để chứa nhiều bộ nhớ hơn.
-Xmx1024m đặt bộ nhớ tối đa mà JVM có thể cấp phát. Nó sẽ giống như nếu bạn chỉ có bộ nhớ vật lý 1024 megabyte và không có bộ nhớ ảo.
Sẽ hữu ích khi cập nhật câu hỏi của bạn với định nghĩa Nhiệm vụ. Có phải 5 JVM riêng biệt này không? Hoặc chỉ 5 đơn vị công việc trong một JVM đơn lẻ.
Cập nhật
Tôi không có ý định chương trình để sử dụng tất cả đống 1g luôn. Ý định của tôi là hướng dẫn JVM sử dụng heap 512m nếu có thể quản lý và sử dụng nhiều bộ nhớ hơn nếu cần. Khi bộ nhớ không còn cần thiết, để giảm trở lại 512m hoặc thậm chí ít hơn số lượng bộ nhớ.
Chỉ vì bạn đặt -Xmx1024m không có nghĩa là JVM S use sử dụng tất cả bộ nhớ đó. Nó chỉ là giới hạn tối đa. Đặt Xms cho đến khi đặt số lượng bộ nhớ tối thiểu được sử dụng. Chương trình của bạn cuối cùng sẽ xác định số lượng bộ nhớ đang chạy được sử dụng. Nếu nó đạt đến giới hạn được thiết lập bởi -Xmx thì nó sẽ ném một OutOfMemoryError
Bạn có thể đề xuất với JVM để chạy Bộ thu gom rác bằng cách gọi System.gc()
. Chú ý tôi đã đề nghị, bạn không thể ép buộc GC chạy. Bạn có thể chạy trên một nền tảng từ chối thậm chí làm GC. Bạn cũng cần phải xem xét những gì thuật toán GC nó được lựa chọn cho ứng dụng của bạn. Tôi sẽ xem xét ở đây Tuning Garbage Collector.
Nếu bạn cần các điều khiển hạt mịn như vậy đối với việc sử dụng bộ nhớ, bạn sẽ cần phải chọn một thứ khác ngoài JVM.
Nguồn
2012-06-20 15:51:28
Bạn phân biệt các tác vụ nào sử dụng dung lượng bộ nhớ như thế nào? – Poindexter
Tại sao có bao nhiêu nhiệm vụ 1-4 sử dụng? Bạn đã phân bổ một gigabyte cho toàn bộ chương trình. –
@Poindexter Tôi chuyển một tham số dòng lệnh để chỉ ra tác vụ nào cần chạy. Sau đó, tôi sử dụng 'prstat' để xem việc sử dụng bộ nhớ của chương trình. – Raihan