Есть ли способ очистить интернированные строки?

Я использую внешнюю библиотеку, которая использует String.intern() из соображений производительности. Это нормально, но я много вызываю эту библиотеку в заданном прогоне и поэтому сталкиваюсь с ужасной

java.lang.OutOfMemoryError: пространство PermGen

Очевидно, я могу использовать модификатор -XX:MaxPermSize командной строки JVM, но это решение не очень масштабируемо. Вместо этого есть ли способ периодически (между двумя «пакетами» вызовов библиотеки) «сбрасывать» интернированный пул строк, т.е. очищать статическую таблицу строк, хранимую классом String?


person Oak    schedule 15.01.2011    source источник
comment
Думаю, определение штрафа нужно пересмотреть :p   -  person    schedule 15.01.2011
comment
@pst да :) я имею в виду, что эти строки интернированы по уважительной причине, достаточно хорошей, чтобы я не хотел сбрасывать эту таблицу после каждого вызова или полностью предотвращать интернирование - я просто хочу сбрасывать ее после каждой партии вызовов, так что внутри каждого пакета библиотека по-прежнему получает интернирование от предыдущих вызовов.   -  person Oak    schedule 15.01.2011
comment
Странно - только что прочитал статью, в которой говорится, что современная JVM gc интернированные строки. Может быть, вы храните много ссылок на неиспользуемые объекты String?   -  person Andreas Dolk    schedule 15.04.2011


Ответы (2)


Нет. Просто размер permgen соответствующим образом. Это ничем не отличается от необходимости соответствующего размера кучи. Не бойся!

person dty    schedule 15.01.2011

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

person Oak    schedule 15.01.2011
comment
Разве вы не можете просто... как бы убить все свои ссылки на библиотеку и "начать заново" каждую партию. Если я правильно прочитал, сборщик мусора должен сработать для «старых» интернированных строк, и вы можете быть счастливы? - person Nanne; 15.01.2011
comment
@Nanne, эта библиотека широко использует статические переменные (вздрагивает). Для них у него есть приятная маленькая функция reset(), на которую я полагался, но я думаю, что она неполная. - person Oak; 15.01.2011
comment
облом ;) интересная статья тем не менее ;) - person Nanne; 15.01.2011