Использовать меньше памяти.
Трудно точно сказать, в чем проблема, не зная, какое приложение вы запускаете. Так что этот ответ будет содержать общие рекомендации по решению этой проблемы.
Используйте приложение jvisualvm
, которое поставляется с JDK. Это позволит вам подключиться к работающему процессу и увидеть, как используется память.
Ищите в результатах большое количество объектов, которых там быть не должно. Если вы видите, что существует 20 000 экземпляров одного класса, сделайте математику и посмотрите, действительно ли их должно быть столько. Ищите типы объектов, которые имеют гораздо больше экземпляров, чем на самом деле должно быть. Тогда вы должны выяснить, почему у вас так много.
Эти дополнительные объекты, вероятно, создаются и не разыменовываются должным образом. Вы можете поместить их в структуру данных где-то и не удалять их. У вас могут быть потоки, которые все еще работают и ссылаются на эти данные, которые не заканчиваются так, как должны. Существует множество причин, по которым вы можете продолжать ссылаться на данные, которые следует собирать.
Ключевой информацией является знание того, какой класс объектов взрывается в таком количестве. Как только вы это узнаете, вы можете переопределить конструктор и деструктор этого класса, чтобы записать, сколько из них было создано и уничтожено и где. Просматривая эти данные, вы можете определить, где создаются дополнительные объекты или где они не уничтожаются. Как только вы исправите эту проблему, вы перестанете получать сообщение об ошибке.
Конечно, также вполне возможно, что обрабатываемые данные действительно нуждаются в таком объеме памяти. Вы ничего не рассказали нам о своем проекте, поэтому судить об этом невозможно. Если это так, то вам нужно выяснить, как разделить данные, чтобы загрузить только их часть за один раз, обработать их, освободить из памяти, а затем перейти к следующему фрагменту данных.
У меня были такие проблемы раньше, и я использовал все вышеперечисленные методы для их решения.