Всі, здається, відповідають на суміжну пам’ять, але знехтували визнати більш нагальну проблему.
Навіть при 100% суміжному розподілі пам’яті ви не можете мати розмір куки в 2 Гб на 32-бітній ОС Windows (* за замовчуванням). Це пояснюється тим, що 32-бітні процеси Windows не можуть займати більше 2 Гб простору.
Процес Java буде містити perm gen (до Java 8), розмір стека на потік, накладні витрати JVM / бібліотеки (що значно збільшується з кожною збіркою), все крім купи .
Крім того, прапорці JVM та їхні значення за замовчуванням змінюються між версіями. Просто запустіть наступне, і ви отримаєте деяке уявлення:
java -XX:+PrintFlagsFinal
Багато варіантів впливають на поділ пам’яті в купі та поза нею. Залишаючи вам більше або менше цих 2 Гб грати з ...
Щоб повторно використовувати частини цієї моєї відповіді (про Tomcat, але стосується будь-якого процесу Java):
Операційна система Windows обмежує розподіл пам'яті 32-бітного процесу загалом на 2 Гб (за замовчуванням).
[Ви зможете лише] виділити близько 1,5 ГБ простору купи, тому що для цього процесу також виділяється інша пам'ять (накладні витрати JVM / бібліотеки, простір генеалогічної генерації тощо).
Чому 32-розрядна Windows накладає обмеження на 2 ГБ адресного простору, а 64-бітна Windows обмежує 4 ГБ?
Інші сучасні операційні системи [кашлюють Linux] дозволяють 32-бітним процесам використовувати весь (або більшість) адресного простору 4 Гб.
Однак, 64-розрядні ОС Windows можуть бути налаштовані так, щоб збільшити ліміт 32-бітних процесів до 4 ГіБ (3 ГБ на 32-бітному):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx