Mọi người dường như đang trả lời về bộ nhớ liền kề, nhưng đã bỏ qua việc thừa nhận một vấn đề cấp bách hơn.
Ngay cả khi phân bổ bộ nhớ liền kề 100%, bạn không thể có kích thước heap 2 GiB trên HĐH Windows 32 bit (* theo mặc định). Điều này là do các quy trình Windows 32-bit không thể giải quyết nhiều hơn 2 GiB dung lượng.
Quy trình Java sẽ bao gồm gen perm (trước Java 8), kích thước ngăn xếp trên mỗi luồng, chi phí JVM / thư viện (tăng khá nhiều với mỗi bản dựng), tất cả cùng với heap .
Hơn nữa, cờ JVM và giá trị mặc định của chúng thay đổi giữa các phiên bản. Chỉ cần chạy phần sau và bạn sẽ có một số ý tưởng:
java -XX:+PrintFlagsFinal
Rất nhiều tùy chọn ảnh hưởng đến việc phân chia bộ nhớ trong và ngoài heap. Để lại cho bạn nhiều hơn hoặc ít hơn 2 GiB đó để chơi với ...
Để sử dụng lại các phần của câu trả lời này của tôi (về Tomcat, nhưng áp dụng cho bất kỳ quy trình Java nào):
Hệ điều hành Windows giới hạn phân bổ bộ nhớ của quy trình 32-bit tổng cộng là 2 GiB (theo mặc định).
[Bạn sẽ chỉ có thể] cấp phát khoảng 1,5 GiB không gian heap vì cũng có bộ nhớ khác được phân bổ cho quá trình (chi phí JVM / thư viện, không gian gen perm, v.v.).
Tại sao Windows 32 bit áp đặt giới hạn không gian địa chỉ quy trình 2 GB, nhưng Windows 64 bit lại áp đặt giới hạn 4GB?
Các hệ điều hành hiện đại khác [ho Linux] cho phép các quy trình 32-bit sử dụng tất cả (hoặc hầu hết) không gian địa chỉ 4 GiB.
Điều đó nói rằng, hệ điều hành Windows 64-bit có thể được cấu hình để tăng giới hạn của các quy trình 32-bit lên 4 GiB (3 GiB trên 32-bit):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx