Зрештою, у вас завжди є обмежений максимум купівлі, яку ви можете використовувати незалежно від того, на якій платформі ви працюєте. У Windows 32 біт це близько 2GB(не конкретно купи, а загальний об'єм пам'яті за процес). Просто так трапляється, що Java вирішує зменшити за замовчуванням менше (мабуть, таким чином, щоб програміст не міг створювати програми, що мають втечене розподілення пам'яті, не стикаючись з цією проблемою і не потребуючи точно вивчити, що вони роблять).
Отже, з огляду на наявність декількох підходів, які ви можете використати, щоб визначити, який об'єм пам'яті вам потрібен, або зменшити об'єм пам'яті, який ви використовуєте. Однією поширеною помилкою мов, зібраних зі сміттям, таких як Java або C #, є те, щоб зберігати посилання на об'єкти, якими ви більше не користуєтесь, або виділяти багато об'єктів, коли ви можете замість цього використовувати їх повторно . Поки об’єкти мають посилання на них, вони продовжуватимуть використовувати кучу простору, оскільки збирач сміття не буде їх видаляти.
У цьому випадку ви можете скористатися профілером пам'яті Java, щоб визначити, які методи у вашій програмі виділяють велику кількість об'єктів, а потім визначити, чи є спосіб переконатися, що вони більше не посилаються, або не виділити їх в першу чергу. Один з варіантів, який я використовував у минулому, - це "JMP" http://www.khelekore.org/jmp/ .
Якщо ви визначите, що ви виділяєте ці об'єкти з якоїсь причини, і вам потрібно тримати навколо посилань (залежно від того, що ви робите, це може бути так), вам просто потрібно буде збільшити максимальний розмір купи під час запуску програми. Однак, як тільки ви зробите профілювання пам'яті і зрозумієте, як виділяються ваші об'єкти, ви повинні мати краще уявлення про те, скільки пам'яті вам потрібно.
Як правило, якщо ви не можете гарантувати, що ваша програма буде працювати в певному обсязі пам'яті (можливо, залежно від розміру вводу), ви завжди будете стикатися з цією проблемою. Тільки після вичерпання всього цього вам потрібно буде вивчити кешування об'єктів на диск і т. Д. У цей момент у вас повинен бути дуже вагомий привід сказати "мені потрібна Xgb пам'яті" для чогось, і ви не можете обійти це шляхом вдосконалення ваші алгоритми чи схеми розподілу пам'яті. Як правило, це стосується лише алгоритмів, що працюють на великих наборах даних (наприклад, база даних або якась програма наукового аналізу), а потім такі корисні методи, як кешування і пам'ять, нанесені на IO, стають корисними.