Я использую 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 и обнаружил, что сбор мусора позаботился об этой проблеме.
Колебание в диаграмме загруженных классов вызывает некоторую тревогу: кажется, что многие недолговечные классы динамически генерируются. Производительность может пострадать. –
@MarkoTopolnik Большое количество классов, вероятно, вызвано реализацией Rhino. Я попытался использовать профилировщик, но мне не повезло. Есть ли инструмент, который я могу использовать для проверки того, сколько объектов создано для вызова метода? – jharig23
Я не очень хорошо знаком с набором инструментов для профилирования. 'jvisualvm' самостоятельно может распределять профили, и я думаю, что он также отображает stacktraces для каждого события распределения, поэтому может быть что-то похожее на то, что вы хотите. Однако будьте осторожны, чтобы отличить * распределение объектов * от * class loading *. Первый почти не представляет проблемы, поскольку JVM очень настроена для массивного размещения короткоживущего объекта. Последняя - совершенно другая история: загрузка класса - это тяжелая операция, и за ней должна следовать инициализация * класса *, которая также не может быть пикником. –