что эффективнее? очистить объект или создать новый? - PullRequest
10 голосов
/ 16 февраля 2012

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

пример, скажем, метод создает список:

List<Integer> list = new ArrayList<Integer>(); 

в конце метода список больше не используется - означает ли это, что ему больше не выделяется память, или это означает, что на него есть нулевой указатель (так как он был «создан»).

В качестве альтернативы, я могу отправить «список» методу и очистить его в конце метода с помощью: list.removeAll(list); Будет ли это иметь какое-то значение с точки зрения памяти?

Спасибо!

Ответы [ 6 ]

15 голосов
/ 16 февраля 2012

это список массивов, поэтому создание нового объекта означает выделение порции памяти и ее обнуление, плюс любые накладные расходы на ведение бухгалтерского учета.Очистка списка означает обнуление памяти.Эта точка зрения заставит вас поверить, что очистка существующего объекта происходит быстрее.Но вполне вероятно, что JVM оптимизирована для быстрого выделения памяти, поэтому, вероятно, все это не имеет значения.Так что просто пишите понятный, читаемый код и не беспокойтесь об этом.В конце концов, это java, а не c.

3 голосов
/ 16 февраля 2012

в конце метода список больше не используется - означает ли это, что ему больше не выделяется память, или это означает, что на него есть нулевой указатель (так как он был «создан»).

Означает, что на него нет ссылок, и объект имеет право на GC.

В качестве альтернативы, я могу отправить «список»метод и очистите его в конце метода с помощью: list.removeAll (list);будет ли это иметь какое-то значение с точки зрения памяти?

Это компромисс между временем и пространством.Удаление элементов из списка занимает много времени, даже если вам не нужно создавать новые объекты.

С последними возможностями сбора GV JVMs можно создавать новый объект, КОГДА ТРЕБУЕТСЯ (но избегая объектасоздание в цикле лучше).Более длинные ссылки на объект иногда делают этот объект НЕ подходящим для GC и могут вызвать утечку памяти, если не обрабатываются должным образом.

2 голосов
/ 16 февраля 2012

Это зависит от того, насколько дорогой объект, как с точки зрения требуемой инициализации, так и с точки зрения объема занимаемой памяти. Это также сильно зависит от типа приложения (на что еще приложение тратит время).

Для вашего примера с ArrayList уже очень сложно дать определенный ответ - в зависимости от того, сколько записей в списке, clear () может быть очень дорогой или очень дешево, в то время как новый ArrayList имеет почти постоянную стоимость.

Общее правило: не беспокойтесь о повторном использовании объектов, пока у вас не будет измерено , что у вас есть проблемы с производительностью, а затем убедитесь, что , что создание объектов причина этой проблемы. Скорее всего, в вашем приложении есть более полезные возможности оптимизации. Профилировщик поможет определить места, где вы проводите больше всего времени. Сосредоточьтесь на этих и лучших алгоритмах.

2 голосов
/ 16 февраля 2012

Для небольших списков, вероятно, немного дешевле, чем clear() список.

Для асимптотического случая действительно больших списков в действительно большой куче все сводится к тому, может ли GC обнулятьбольшой кусок памяти быстрее, чем цикл for в clear().И я думаю, что это возможно.

Тем не менее, мой совет будет игнорировать это, если у вас нет убедительных доказательств (из профилирования), что у вас высокий оборот ArrayList объектов.(Оптимизация - плохая идея, основанная исключительно на вашей интуиции.)

2 голосов
/ 16 февраля 2012

насколько дорого 'новый'?

Это определенно влечет за собой некоторые накладные расходы.Но это зависит от того, насколько сложен объект.Если вы создаете объект с несколькими примитивами, не так уж и дорого.Но если вы создаете объекты внутри объектов, это могут быть коллекции объектов, если ваш конструктор читает файл свойств для инициализации переменных-членов объекта, ДОРОГО!

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

в конце метода список больше не используется - значит ли это, что нетпамять выделена для него больше или это означает, что на него есть нулевой указатель (поскольку он был «создан»).

Как только объект не имеет к нему ссылки, он выходит из области видимостии он становится пригодным для сбора мусора.Следовательно, даже если ему выделена некоторая память, он будет восстановлен GC на более позднем этапе, когда бы он ни работал, нам не нужно об этом беспокоиться.(И мы не можем гарантировать, когда GC будет работать).

Очистка коллекции в конце, я не думаю, что будет что-то лучше, потому что то же самое случится со всеми отдельными объектами в коллекции, как и с самой коллекцией.Они получат право на GC.

2 голосов
/ 16 февраля 2012

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

В конце метода объект действительно находится вне области видимости.Но это не означает, что он является сборщиком мусора или даже пригоден для сбора мусора, потому что другие могут по-прежнему ссылаться на этот список.Таким образом, в основном: если нет объектов ссылки на этот список, то это может быть элегантно для сборки мусора, но если это будет сборка мусора, он все еще не уверен, если список все еще хранится в пространстве молодого поколения, он может быть в Edenпространство или арендованное пространство.Пространство рая - это место, где объекты сначала выделяются, когда происходит сбор мусора и объект еще жив, он будет перемещен в пространство оставшихся в живых.Если он все еще выживет в прошлом, он перейдет к месту пребывания, где, как мне кажется, не так много мусора.Но все это зависит от того, как долго живет объект, кто относится к этому объекту и где он расположен

...