Выключение апплета правильно - PullRequest
0 голосов
/ 02 ноября 2011

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

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

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

Вопросы

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

1 Ответ

0 голосов
/ 02 ноября 2011

Для контекста это все необходимо, потому что пока страница активна, браузеры (или плагин 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 с первого дня).
...