2016-10-09 2 views
-2

У меня есть код, что некоторые, какПроблема с Garbage Collection

class HappyGarbage01 
{ 
    public static void main(String args[]) 
    { 
     HappyGarbage01 h = new HappyGarbage01(); 
     h.methodA(); /* Line 6 */ 
    } 
    Object methodA() 
    { 
     Object obj1 = new Object(); 
     Object [] obj2 = new Object[1]; 
     obj2[0] = obj1; 
     obj1 = null; 
     return obj2[0]; 
    } 
} 

будет самый шанс на сборщика мусора существо Вызывается быть после линии 9 или 10?

+1

Когда запуск GC не повлияет на возвращаемый объект, но GC вряд ли будет срабатывать. –

+0

В чем проблема с сборкой мусора? Вы не знаете, когда GC вызывается. –

+2

Можете ли вы наметить линии 9 и 10, а также уточнить свой вопрос? Я не понимаю, с чем вы хотите помочь нам. –

ответ

4

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

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

В-третьих, они запускаются только тогда, когда общее потребление памяти оправдывает их запуск. Они никогда не запускаются из-за нескольких байтов здесь и там. Размер кучи по умолчанию составляет примерно 256 МБ, поэтому несколько байтов, как в вашем примере кода, буквально ничего не следят и не имеют никакого эффекта.

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

По всем этим причинам ваш вопрос не имеет смысла.

0

Сборщик мусора не будет вызываться после строки 9, поскольку ссылка на obj1 хранится в obj2[0]. Объект obj1 все еще существует в куче и к нему можно получить доступ через активный поток через ссылку, хранящуюся в obj2[0].

Скорее сборка мусора происходит после строки 6. Сбор мусора происходит после того, как метод вернул ссылку на объект. Метод возвращается к строке 6, ссылка на сохранение возвращаемого значения отсутствует. Таким образом, ответ должен быть после строки 6.

+0

Он может работать после строки 6. Но вы не можете сказать, что это _will_. –

+0

Правильно. Более предпочтительным словом было бы это «возможно». – jiltedpotato

+0

Вопрос и ответ не актуальны, он спрашивает, будет ли вызываться gc или нет. –

1

Basic решение для вашего вопроса поставить:

System.gc(); 

или

Runtime.gc(); 

в месте, где вы хотели бы вызвать сборщик мусора, но вы не можете быть уверены, что сборщик мусора будет вынужден работать.

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

3

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

0

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


Сборщик мусора освобождает память, используемую объектами, на которые нельзя ссылаться. В этом случае вы создаете объект и массив.

У вас есть ссылка на объект по всему методу A, либо в obj1, либо obj2 [0]. Затем вы возвращаете ссылку на него, но ссылка забыта. Следовательно, объект может быть собран только после возврата метода. Обратите внимание, что если вы сохранили ссылку на нее в основной функции, это никогда не будет собирать мусор, так как вы всегда можете ссылаться на нее позже в основной функции. Когда программа выйдет, операционная система очистит ее, когда освободит память, используемую JVM.

Вы сохраняете ссылку на массив внутри функции. Поэтому, когда функция заканчивается, массив будет GC-способным.