Песочница на память
В Java не должно быть утечек памяти, но это все еще возможно. Когда у моей программы есть утечка памяти, я могу это исправить (я надеюсь). Но когда у некоторых сторонних пакетов есть что делать? Практически ничего, кроме как не использовать этот пакет.
Есть ли другое решение? Мне нравится идея песочницы. Вам разрешено делать все, что вы хотите в какой-то области, и у вас "физическое" нет возможности беспокоить других за пределами вашей коробки. Есть ли способ создать такую песочницу для использования памяти в Java? Представьте себе = создайте песочницу для использования памяти, позвольте некоторому пакету делать все, что он делает, получайте результаты и удаляйте эту песочницу с тем мусором, который здесь был оставлен! Нет осложнений с GC, нет очистки или распоряжения памятью. Просто удалите и забудьте об этом.
Есть ли способ сделать это?
1 ответ
Лучший способ - запустить другую JVM, связаться с ним через сокет (например) и убить JVM после того, как это будет сделано.
Будет интересно обсудить, сможем ли мы поставить его в изолированную программную среду в рамках одной JVM.
После того, как вы закончили использовать стороннюю библиотеку, и вы больше не ссылаетесь на какие-либо объекты из этой библиотеки, что может быть мусором, который все еще остается?
Их классы - даже если вы не ссылаетесь ни на один из них, если они загружены тем же загрузчиком классов, что и ваш код, эти классы сохранятся. И их статические поля могут ссылаться на более длительные данные и т. Д.
ThreadLocal - он мог бы установить некоторые локальные переменные потока, а не очистить их
Поток - это могло породить некоторые темы, которые сохраняются
В каком-то глобальном месте - например, System.setProperty() - оно останется там.
Так что в целом это, наверное, сложно.
Тем не менее, мы можем использовать отдельный загрузчик классов и отдельный поток для выполнения сторонней библиотеки, и эта стратегия, вероятно, может выгружать все мусорные пакеты, созданные сторонней организацией, в большинстве случаев.
Существуют ли инструменты для этого? Я не слишком осведомлен об этом. У меня есть некоторый опыт реализации сервера с горячей перезагрузкой, и у меня есть несколько служебных классов, которые можно использовать для этой цели. Например
// wrap 3rd party code, expose it as some java.*.* interface
public class MyWrapper implements Callable<String>
{
@Override
public String call()
{
return ThirdParty.query(..);
}
}
HotReloader hot = new HotReloader();
Callable<String> func = (Callable<String>)hot.getAppInstance("pkg.MyWrapper");
String result = func.call();
// then dereference `hot` and `func`
см HotReloader