2015-06-25 13 views
4

У меня есть определенный код, который использует множество экземпляров подкласса SoftReference. Я бы хотел проверить, что он работает правильно в случаях, когда все/только некоторые/ни одна из этих ссылок не поставлена ​​для очистки в ReferenceQueue. Для случая «нет» это довольно просто: создайте сильные ссылки на объекты, и мягкие ссылки гарантированно останутся. Однако, как я могу гарантировать, что они будут очищены? Как я понимаю, System.gc() - это всего лишь запрос на запуск сборщика мусора, и даже если он действительно работает, он может решить не собирать все недостижимые объекты ...Как проверить код, основанный на SoftReference?

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

+0

Я предлагаю высмеять класс SoftReference – talex

+0

@talex Они хотят на самом деле протестировать «SoftReference». Как бы издеваться над ним? –

+0

Извините, я прошу интерпретировать вопрос. Теперь у меня есть другой вопрос: почему? – talex

ответ

1

Если вы можете получить доступ к своим экземплярам SoftReference из теста, вы можете имитировать поведение GC, вызвав методы непосредственно на экземплярах SoftReference.

Вызов SoftReference.clear() соответствует первому этапу, на котором ссылка очищается. Затем вы можете вызвать SoftReference.enqueue(), чтобы вывести его в очередь ссылок, соответствующую шагу очереди, через который GC выполняет [некоторое время] после очистки ссылки.

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

Я действительно думаю, что вышеупомянутый подход рекомендуется рекомендовать, так как вы получили контроль над тем, какие ссылки очищены, и это хорошо в тесте.

Однако, если вы не можете получить доступ к своему SoftReferences непосредственно, вы в значительной степени ограничены распределением памяти, пытаясь очистить их. Например, как показано в this вопрос и ответы.

+0

Звучит неплохо, я не знал, что вы можете вручную указывать ссылки. Как я уже сказал, не стоит добавлять тестовый код к рассматриваемому классу, пока «нормальный» код не затрагивается, и я предполагаю добавить что-то вроде 'enqueueReferencesTo (Set ...)' будет делать это , – doublep

+0

Да, он работает нормально. Спасибо. – doublep