2015-03-16 2 views
-4
private Student student = new Student(); 

public Student getStudent(){ 
    return student; 
} 


public void function(){ 
    getStudent().setName("john"); 
} 

public void function(){ 
    Student student_local = getStudent(); 
    student_local.setName("john"); 
} 

ли GC ведут себя по-разному для обоих надреза?Java Anonymous объектов и мусора коллекция часть -2

Я имею в виду, какой случай (CASE-1/CASE-2) более эффективен GC в терминах Время?

Я просто слово GC вызывается для CASE-1 или нет?

+0

Извините, что экземпляр и локальная переменная с таким же именем могут создавать confusion –

+2

Даже с student_local ничего не меняется, он не собирается, потому что этот частный студент-студент все еще указывает на него. –

ответ

1

Amit Я видел ваш другой вопрос, важно то, что всегда есть только достижимость, неважно, как вы используете ученика, он всегда будет доступен, пока класс, который его содержит, недоступен.

Update, в отношении вопроса вы добавили:

Я имею в виду случай, который (CASE-1/CASE-2) является более GC эффективным с точки зрения времени?

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

Прочтите это описание того, как работает GC: http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/

Отредактировано: Должен научиться читать вопросы, прочитайте эту версию моего ответа, извините Amit.

+0

. @ Uraimo благодарит за эту замечательную ссылку и вопрос, который я бы сказал, пожалуйста, рассмотрите этот метод, который мы вызываем в цикле. Я разработчик Android, где каждое приложение назначает ограниченную память и когда приложение растет рядом с порогом GC, нужно называть –

+0

. Для второй функции не имеет значения, находится ли она в цикле, как только вы находитесь за пределами этой функции ссылка будет иметь право на сбор мусора. В первом случае, ну, объект будет находиться вокруг, пока кто-то не укажет на класс, содержащий этот частный ученик, если вы укажете, что переменная, ссылающаяся на это на нуль, или указав на другой StudentOuterClass, чем частный ученик, будет иметь право на GC , –

+1

извините, но во втором случае новый объект не создается, метод работает с переменной экземпляра, поэтому GC не будет собирать объект после возврата метода – akhilless

1

Во всех трех случаях метод function() работает с переменной экземпляра, которая была создана при инициализации класса. Это означает, что переменная экземпляра student продолжит удерживать ссылку на объект Student после того, как метод function завершается во всех случаях, и, таким образом, объект не станет кандидатом на сбор мусора. Это также означает, что эффективность этих фрагментов кода с точки зрения сбора мусора будет одинаковой (поскольку GC не будет собирать объект-ученик после того, как все методы будут выполнены во всех случаях)

+0

. @ Ahilless, вы хотите сказать, что здесь GC не будет требовать ни одного из этих случаев? –

+0

Студент будет собран, когда будет собрано класс, содержащий этот частный экземпляр. –

+1

@AmitYadav не совсем. Я имею в виду, что после того, как метод 'function()' заканчивается во всех случаях, объект будет по-прежнему доступен (переменная-экземпляр будет продолжать ссылаться на нее) и, следовательно, не будет собираться мусором. GC может произойти, но он не будет собирать объект-ученик. Время сбора мусора зависит от конкретного используемого GC. – akhilless

Смежные вопросы