Правильное завершение работы апплета

Там, где я работаю, они используют метод AppletContext.showDocument(URL), когда пользователь выходит из нашего приложения, которое представляет собой апплет, предоставляющий желаемый JSP выхода из системы. Но у них также есть код, который говорит, что если по какой-то причине они не могут получить AppletContext, просто вызвать метод Applet.destroy().

Мы используем архитектуру тонкого клиента, что означает, что у нас, по сути, есть набор «глупых» терминалов, подключенных к серверу. Я упоминаю об этом, потому что у нас часто будут работать десятки, если не сотни экземпляров JVM - по одному для каждого апплета.

Внутри метода destroy() они удаляют все ресурсы, которые они приобрели, а затем получают ссылку на Runtime и вызывают runFinalization() и gc(), но это не делает System.exit() или эквивалент.

Вопросов

  1. Я понимаю, что это освобождает ресурсы и оставляет вас на той же веб-странице, но что это делает с JVM, на которой был запущен апплет?
  2. Если я добавлю вызов System.exit() в конце destroy(), что он сделает с другими JVM, работающими на сервере тонкого клиента?

person BigMac66    schedule 01.11.2011    source источник


Ответы (1)


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

Чтобы ответить на ваши вопросы:

  1. Это зависит от вашей версии Java. Начиная с обновления Java 6 10 (с подключаемым модулем следующего поколения) по прошествии определенного периода времени без запущенных апплетов Java завершает работу. Этот тайм-аут стал короче, поскольку время запуска JVM уменьшилось за последние год или два.
  2. Я не верю, что апплетам (даже подписанным) разрешено вызывать System.exit(). Однако, если бы это было разрешено, в современных браузерах это убило бы экземпляр JVM для этого браузера, ни один из других. Раньше можно было закрыть весь браузер :)

РЕДАКТИРОВАТЬ:

На самом деле это еще не все ... это верно везде, кроме OS X, где плагин следующего поколения не использовался по умолчанию примерно до 6u27 (в 10.6 это была Java для обновления OS X 5 и 10.7 из дня 1).

person Spyder    schedule 01.11.2011
comment
Относительно 2: это неверно. Я только что проверил с JVM 1.7.0_09, работающим в Internet Explorer, и неподписанным апплетом, кодовая база которого предоставлена ​​AllPermissions, МОЖЕТ вызывать System.exit() там. - person flup; 17.02.2014
comment
Да, это могло измениться в Java 7. Вам не нужно было отрицать меня, потому что информация старше двух лет теперь неверна. - person Spyder; 18.02.2014
comment
То же самое работает и с плагином Java 6 следующего поколения. Это наоборот: я не уверен в более поздних версиях Java 7. - person flup; 18.02.2014