понедельник, 24 октября 2011 г.

VirtualBox vs Java

Я уже писал, что использую в работе виртуальные машины, построенные с помощью VirtualBox. Несколько таких машин предназначены для написания программ на Java. При настройке этих машин в прошлом у меня возникала неприятная проблема: Java-машина начинала грузить процессор виртуалки на 100% при запуске java-приложения с gui интерфейсом, реализованном с использованием классов Swing. Тогда, а было это что-то около полутора-двух лет назад, я нашел в интернете несколько решений-подсказок, из которых, методом проб и ошибок, получил последовательность действий, которая искореняла проблему.



Недавно, однако, я поднимал очередную виртуалку для Java и столкнулся с проблемой опять. Втайне, в глубине души, я надеялся, что за прошедшее время разработчики VirtualBox исправили данную ошибку, ведь со всем, что связано с VirtualBox, произошло много изменений. Тут и смена владельца на Oracle, и крупные изменения в самом софте. Да и вряд ли я был единственным, кто столкнулся с этой ошибкой, ведь встретил же я на просторах интернета подсказки, помогшие ее обойти. Но... установка Java, запуск GUI приложения, написанного на Java, и 100% загрузка виртуального процессора.

Печаль же заключалось не в этом. Я помнил, что проблема была, помнил, как ее решить, но помнил в общих чертах,  помнил, что на некоторых шагах должен сделать определенные действия, но конкретика стерлась из памяти за давностью, так сказать. И опять интенет, и опять пробы, и опять получилось, что не может не радовать. Только теперь я решил запротоколировать, на будущее, как решается данная проблема. Итак.
 
Дано: виртуальная машина, созданная с помощью VirtualBox. В опциях машины включено использование 2d и 3d ускорения графики, а на самой машине (Windows XP) установлены соответствующие компоненты из комплекта VBox Guest Additions с разрешением использовать для гостевой системы Direct3D. На виртуалке установлен Java SDK с последним набором обновлений.

Проблема: при запуске Java-программы, в которой используются Swing классы, процессор виртуальной машины оказывается загруженным на 100%. Виновник - процесс java.exe.

Причина: тут есть разночтения, но, в общих чертах, источник спрятан за использованием 3d графики.

Решение: чтобы избавиться от проблемы надо выполнить следующие шаги (сразу оговорюсь, некоторым товарищам по несчастью не требовался полный набор этих шагов, но мне помог именно такой алгоритм):

  • глушим виртуалку, если она включена
  • в опциях виртуальной машины отключаем использование ускорения 3d графики.
  • загружаем виртуалку в Safe Mode  (под администратором)
  • деинсталлируем VBox Guest Additions (в каталоге установки, обычно, %ProgramFiles%\Oracle\VirtualBox Guest Additions,  должен быть файл uninst.exe)
  • перегружаемся в Safe Mode (под администратором)
  • запускаем команду sfc /scannow
  • перегружаем виртуалку в обычном режиме
  • устанавливаем VBox Guest Additions, но без включения галки использования Direct3D.
  • наслаждаемся.

Уже после того, как я восстановил описанную выше последовательность, я нашел в интернете на форуме VirtualBox еще один метод решения проблемы, но, на текущий момент, у меня не было возможности его проверить. Метод заключается в том, что описывается системная переменная окружения J2D_D3D (якобы, эта переменная отвечает за использование в Java Direct3D), для которой устанавливается значение false. Можно, также, использовать свойство d3d, указывая в командной строке -Dsun.java2d.d3d=false. Если установка свойства не помогает, попробовать указать свойство ddoffscreen (установить значение false), и , если опять не помогло, то noddraw (установить значение true). (Надо не забывать перед именами свойств указывать префикс sun.java2d).

Вот, пожалуй и все по этому вопросу.

P.S. 14.11.2011. Вот и появилась причина вернуться к вопросу. На виртуалку с установленной поддержкой 3D, ставил LibreOffice, для работы которого нужен JRE. Так что пришлось ставить и JRE, причем, поставил версию 7 update 1. Одновременно ставится консоль и всяческие обновлятели Java. Через какое-то время использование процессора виртуалки подпрыгнуло до 100%. Смотрю процессы: вот он, родненький javaw.exe, кушает все вычислительные ресурсы. Видно, Java Updater решил проверить наличие обновлений. Ладно, срубил. Установил системную переменную  J2D_D3D в значение False. Запускаю консоль Java из панели управления - загрузка 100%. Неужели не работает? Меняю значение переменной на false, запускаю Java-машину - работает, не жрет процессорное время.

Мораль: case sensitive рулит.

Комментариев нет:

Отправить комментарий