Песочница на память

В Java не должно быть утечек памяти, но это все еще возможно. Когда у моей программы есть утечка памяти, я могу это исправить (я надеюсь). Но когда у некоторых сторонних пакетов есть что делать? Практически ничего, кроме как не использовать этот пакет.

Есть ли другое решение? Мне нравится идея песочницы. Вам разрешено делать все, что вы хотите в какой-то области, и у вас "физическое" нет возможности беспокоить других за пределами вашей коробки. Есть ли способ создать такую ​​песочницу для использования памяти в Java? Представьте себе = создайте песочницу для использования памяти, позвольте некоторому пакету делать все, что он делает, получайте результаты и удаляйте эту песочницу с тем мусором, который здесь был оставлен! Нет осложнений с GC, нет очистки или распоряжения памятью. Просто удалите и забудьте об этом.

Есть ли способ сделать это?

1 ответ

Решение

Лучший способ - запустить другую JVM, связаться с ним через сокет (например) и убить JVM после того, как это будет сделано.

Будет интересно обсудить, сможем ли мы поставить его в изолированную программную среду в рамках одной JVM.

После того, как вы закончили использовать стороннюю библиотеку, и вы больше не ссылаетесь на какие-либо объекты из этой библиотеки, что может быть мусором, который все еще остается?

  1. Их классы - даже если вы не ссылаетесь ни на один из них, если они загружены тем же загрузчиком классов, что и ваш код, эти классы сохранятся. И их статические поля могут ссылаться на более длительные данные и т. Д.

  2. ThreadLocal - он мог бы установить некоторые локальные переменные потока, а не очистить их

  3. Поток - это могло породить некоторые темы, которые сохраняются

  4. В каком-то глобальном месте - например, 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

Другие вопросы по тегам