Tôi có một ứng dụng máy chủ, trong những trường hợp hiếm hoi, có thể phân bổ một lượng lớn bộ nhớ.Buộc thu gom rác đầy đủ khi chiếm đóng bộ nhớ vượt quá ngưỡng nhất định
Nó không phải là một rò rỉ bộ nhớ, như những khối có thể được yêu cầu bồi thường trở lại bởi các bộ thu rác bằng cách thực hiện một bộ sưu tập rác đầy đủ. Bộ sưu tập rác bình thường giải phóng lượng bộ nhớ quá nhỏ: không đủ trong ngữ cảnh này.
Bộ thu gom rác thực hiện các GC đầy đủ này khi thấy phù hợp, cụ thể là khi dấu chân bộ nhớ của ứng dụng gần mức tối đa được chỉ định với -Xmx.
Đó sẽ là ok, nếu nó không được cho thực tế là những vấn đề cấp phát bộ nhớ đến trong bursts, và có thể gây OutOfMemoryErrors do thực tế rằng JVM không có khả năng để thực hiện một GC đủ nhanh để giải phóng bộ nhớ cần thiết. Nếu trước đó tôi gọi System.gc() theo cách thủ công, tôi có thể ngăn chặn tình huống này.
Dù sao, tôi không muốn theo dõi phân bổ bộ nhớ của jvm của mình (hoặc chèn quản lý bộ nhớ vào logic của ứng dụng của tôi); nó sẽ là tốt đẹp nếu có một cách để chạy máy ảo với một ngưỡng bộ nhớ, trên đó GC đầy đủ sẽ được thực hiện tự động, để phát hành rất sớm bộ nhớ tôi sẽ cần.
Câu chuyện dài: Tôi cần một cách (tùy chọn dòng lệnh?) Để định cấu hình jvm để phát hành sớm một lượng bộ nhớ tốt (nghĩa là thực hiện GC đầy đủ) khi bộ nhớ chiếm đến một ngưỡng nhất định, tôi không 't quan tâm nếu điều này làm chậm ứng dụng của tôi xuống mỗi một lần trong một thời gian.
Tất cả những gì tôi đã tìm thấy cho đến bây giờ là những cách để thay đổi kích thước của các thế hệ, nhưng đó không phải là những gì tôi cần (ít nhất là không trực tiếp).
Tôi đánh giá cao đề xuất của bạn,
Silvio
T.B. Tôi đang làm việc trên một cách để tránh phân bổ lớn, nhưng nó có thể đòi hỏi một thời gian dài và khi đó ứng dụng của tôi cần một sự ổn định ít
CẬP NHẬT: phân tích các ứng dụng với jvisualvm, tôi có thể thấy rằng vấn đề là ở thế hệ cũ
Tôi đã sử dụng nó –