Bất kỳ cách tiếp cận sẽ cung cấp cho bạn số lượng gần như nhau. Luôn luôn là một ý tưởng tốt để phân bổ heap sử dụng -X..m
-X..x
cho tất cả các thế hệ. Sau đó, bạn có thể đảm bảo và cũng làm ps để xem tham số nào đã được thông qua và do đó được sử dụng.
Đối với việc sử dụng bộ nhớ thực tế, bạn có thể so sánh đại khái VIRT (được phân bổ và chia sẻ) và RES (được sử dụng thực tế) so với các giá trị jstat:
Đối với Java 8, hãy xem jstat cho các giá trị này thực sự có nghĩa. Giả sử bạn chạy một lớp đơn giản không có mmap hoặc xử lý tệp.
$ jstat -gccapacity 32277
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2
$ jstat -gcutil 32277
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032
Tối đa :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(gần và bên dưới bộ nhớ VIRT)
Tối đa (Tối thiểu, Được sử dụng):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(gần với bộ nhớ RES)
"Đừng trích dẫn tôi về điều này" nhưng mem VIRT gần bằng hoặc nhiều hơn bộ nhớ Max được phân bổ nhưng miễn là bộ nhớ được sử dụng là miễn phí / có sẵn trong bộ nhớ vật lý, JVM không ném ngoại lệ bộ nhớ. Trong thực tế, bộ nhớ tối đa thậm chí không được kiểm tra đối với bộ nhớ vật lý khi khởi động JVM ngay cả khi hoán đổi trên HĐH. Một lời giải thích tốt hơn về những gì bộ nhớ ảo thực sự được sử dụng bởi một quy trình Java sẽ được thảo luận ở đây .
jstat
một người nên sử dụng để xác minh chỉ sử dụng bộ nhớ chung của JVM không? Giả sử bạn khởi động JVM vớiXms=4g
vàXmx=4g
bạn muốn xem, bao nhiêu bộ nhớ đã được sử dụng?