Как решить OutOfMemoryError? - PullRequest
       9

Как решить OutOfMemoryError?

2 голосов
/ 18 января 2012

Для школьного проекта мне нужно запрограммировать разные алгоритмы. Проблема в том, что я получил рабочий алгоритм. Но я должен запустить его несколько раз, и через некоторое время он выдает мне следующие ошибки:

Исключение в потоке "main" java.lang.OutOfMemoryError: пространство кучи Java

Я знаю, что означает ошибка, но можно ли разрешить Java выполнять поиск пустого пространства во время выполнения? Я знаю, что он использует много места, которое не используется в какой-то момент. Он устанавливает множество объектов равными нулю во время запуска приложения и создает много новых, из-за этого ему не хватает памяти.

Так конкретно: возможно ли позволить JVM освободить некоторое пространство, для которого установлено значение null? Или освободить место во время работы программы? Я знаю, что могу установить для JVM больше места, но рано или поздно я столкнусь с той же проблемой.

Если вам нужна моя IDE (в случае, если она специфична для IDE), это Eclipse.

Ответы [ 5 ]

2 голосов
/ 18 января 2012

Пожалуйста, Google "Сборка мусора".Java всегда стремится использовать пространство из объектов, которые вы не используете.Если вам не хватает памяти, вам нужно либо использовать -Xmx, чтобы сконфигурировать больше памяти, либо вы должны исправить свой код, чтобы сохранить меньше объектов.Вы можете обнаружить, что такой профилировщик, как jvisualvm, поможет вам найти бесполезное использование памяти.

1 голос
/ 18 января 2012

Если вы используете JVM Oracle / Sun, я бы порекомендовал вам загрузить Visual VM 1.3.3 , установить все плагины и запустить его. Он покажет вам, что происходит с каждым поколением кучи, потоками, процессором, объектами и т. Д. Он может сказать вам, какой класс занимает больше всего места в куче.

Вы поймете это быстро, если у вас есть данные.

0 голосов
/ 18 января 2012

GC автоматически восстановит «неиспользованную» память, так что да, можно освободить некоторое пространство во время выполнения, но важно понять, что классифицируется как возможное для восстановления. По существу, пространство объекта можно восстановить (собрать мусор), если сам объект недоступен - на него нет ссылок. Когда вы говорите «установка пространства на ноль», вы, скорее всего, удаляете только одну ссылку (ссылку) на объект , устанавливая его на ноль. Это позволит восстановить объект , только если была единственной ссылкой (ссылка)

Object First= new Object();   //first object
Object Second= new Object();  //second object 
Object SecondPrim=Second;     //second reference to second object

First=null;   
// First memory will be reclaimed (sooner or later)
Second=null;
// there is still a reference to second object via SecondPrim
// second object will not be reclaimed

Надеюсь, это поможет. Что касается проверки того, что происходит, я бы посоветовал вам профилировать вашу программу.

0 голосов
/ 18 января 2012

В: «Можно ли позволить JVM освободить некоторое пространство, для которого установлено значение null?

A: Да, используйте вызов System.gc(), но это вряд ли решит вашу проблему, поскольку система делает это автоматически время от времени. Вам нужно найти объект, который использует всю память, и исправить это в своем коде. Вероятно, список, который никогда не очищается и только добавляется.

Я действительно столкнулся с этой проблемой при реализации особенно сложного алгоритма, который требовал массивной структуры данных. Я должен был прийти и разместить вопрос на этом сайте. Оказалось, что мне пришлось использовать совершенно другой тип объекта, чтобы избежать ошибки памяти.

Вот этот вопрос .

0 голосов
/ 18 января 2012

Я бы использовал профилировщик памяти, чтобы определить, где используется память.Установка на null редко помогает.GC всегда будет работать и освободить как можно больше места, прежде чем вы получите OOME.

...