2013-06-14 4 views
3

Я использую Rhino в проекте, который требует, чтобы я создал несколько ScriptableObjects, которые используются в течение короткого времени, а затем отбрасываются. Будет ли это создавать утечку памяти?Нужно ли мне очищать экземпляры Rhino ScriptableObject?

Код что-то вроде этого:

Context cx = ContextFactory.getGlobal.enter(); 

try { 
    for (String script : Scripts.findAll()) { 
     Scriptable scope = cx.initStandardObjects(); 

     // load script into scope, and do something with it. 

     // do I need to do any cleanup to for the scope? 
    } 
} finally { 
    Context.exit(); 
} 

решение Марко является хорошим. Я протестировал сценарий с помощью jvisualvm и обнаружил, что сбор мусора позаботился об этой проблеме.

Rhino Garbage Collection in action

+0

Колебание в диаграмме загруженных классов вызывает некоторую тревогу: кажется, что многие недолговечные классы динамически генерируются. Производительность может пострадать. –

+0

@MarkoTopolnik Большое количество классов, вероятно, вызвано реализацией Rhino. Я попытался использовать профилировщик, но мне не повезло. Есть ли инструмент, который я могу использовать для проверки того, сколько объектов создано для вызова метода? – jharig23

+0

Я не очень хорошо знаком с набором инструментов для профилирования. 'jvisualvm' самостоятельно может распределять профили, и я думаю, что он также отображает stacktraces для каждого события распределения, поэтому может быть что-то похожее на то, что вы хотите. Однако будьте осторожны, чтобы отличить * распределение объектов * от * class loading *. Первый почти не представляет проблемы, поскольку JVM очень настроена для массивного размещения короткоживущего объекта. Последняя - совершенно другая история: загрузка класса - это тяжелая операция, и за ней должна следовать инициализация * класса *, которая также не может быть пикником. –

ответ

1

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

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