Đó là công việc của người thu gom rác để quyết định khi thay đổi kích thước là cần thiết, do đó, nó được xác định bởi tham số GC 'MinFreeHeapRatio'. Nếu GC cần nhiều không gian hơn, nó sẽ phát triển thành một kích thước trong đó% của heap được chỉ định bởi giá trị đó có sẵn.
Giá trị điển hình trên nền tảng hiện đại là 40, vì vậy nếu bạn khởi động ở 512MB và có ít hơn 40% miễn phí, nghĩa là bạn vượt quá ~ 308MB, nó sẽ tăng lên đến 40% miễn phí. Vì vậy, nói sau khi bộ sưu tập vẫn còn 400 MB giá trị của các đối tượng sống, heap của bạn sẽ đi lên đến ~ 667MB. (Có nó được đặt tên theo tỷ lệ nhưng hy vọng giá trị% là đối số ... tìm kiếm tôi!)
Lưu ý đây là một chút không chính xác, bộ thu gom rác là "thế hệ" và thực sự có thể thay đổi kích thước thế hệ riêng lẻ, nhưng nó cũng đã buộc tỷ lệ giữa các thế hệ kích thước và nếu các đối tượng của bạn được phân phối giữa dài sống và ngắn sống trong khoảng cách nó ước tính, nó hoạt động ra khá tốt cho mặt sau của phong bì.
Điều này áp dụng cho các mặc định trong Java 6. Nếu bạn sử dụng cấu hình bộ thu gom rác tùy chỉnh, nó có thể khác. Bạn có thể đọc về điều đó tại đây: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generation_sizing.total_heap
("chi phí" của loại hoạt động phụ thuộc vào hệ điều hành và điều gì khác đang diễn ra. Nếu hệ thống được tải xuống và hệ điều hành phải thực hiện một số thay đổi để thực hiện một khối bộ nhớ liền kề với bạn, sau đó nó có thể rất tốn kém!)
Nó chắc chắn không đi thẳng đến mức tối đa. –
Bạn đang xác định tối thiểu + tối đa. Nó sẽ có ít nhất 512MB nhưng với giới hạn 2048mb. – adrian
Từ sự hiểu biết của tôi, giá trị bộ nhớ tối thiểu được cấp phát khi JVM khởi động - Vì vậy, khi khởi động, nó tiêu thụ 512m từ hệ điều hành máy chủ để sử dụng cho việc sử dụng riêng của nó. Những gì tôi không hiểu là khi nó cần nhiều hơn 512m, phải mất bao nhiêu, và làm thế nào để có nó? Ví dụ - JVM cần 750mb - Nó sẽ tiêu thụ 750mb chính xác, hoặc tăng lên đến 1024mb? Hoặc theo một số hành vi khác? – Ren