Сколько деталей аппаратного обеспечения может обнаружить Java-апплет? - PullRequest
7 голосов
/ 18 июня 2009

Я пишу апплет Java, чтобы работать по-разному на разных аппаратных средствах. Например, если я знаю, что у компьютера большой объем оперативной памяти, но слабый процессор, я могу изменить баланс некоторых компромиссов времени и памяти. Может быть полезно узнать точную марку и модель процессора, на котором работает апплет. Наличие такой информации позволило бы мне сравнивать программное обеспечение с различными системами и находить узкие места.

Обычно я ищу:

  • Количество ядер и / или процессоров
  • 32-битный или 64-битный процессор
  • Размер строки кэша ЦП
  • Размер кеша L1, L2, L3
  • Установить ассоциативность кеша
  • Размер TLB
  • Точная информация о производителе / ​​модели на процессоре
  • Информация ФСБ
  • объем оперативной памяти
  • Объем подкачки / виртуальной памяти
  • JVM, в которой запускается апплет
  • Операционная система под управлением JVM
  • Загрузка системы
  • Количество использованных / неиспользованных потоков Kernal
  • Пропускная способность интернет-соединения
  • Память доступна
  • Используемые графические карты
  • Если операционная система визуализируется
  • Используемый сетевой ресурс

Запрещена ли какая-либо из этой информации в Java-апплетах? Существуют ли библиотеки для поиска какой-либо этой информации? Инструменты тестирования апплета, чтобы обнаружить / угадать некоторые из них? Какие хитрые уловки вы можете придумать?

Есть ли какие-либо аспекты компьютерного оборудования, которые блокируют. То есть может ли Java-апплет обнаружить, что что-то используется или недоступно, пытаясь получить к нему доступ и получить отказ (возможно, от конкретного TCP-порта или графического ускорителя).

Отказ от ответственности: я знаю, что забота об аппаратном обеспечении идет вразрез с идеологией Java отсутствия заботы об аппаратном обеспечении. Хотя комментарии указывают на то, что это может быть полезно для других читателей, которые видят этот вопрос, учтите, что такие ответы - не то, что я ищу.

EDIT

Добавлена ​​дополнительная информация:

java.lang. management предоставляет все виды информации о системе, в которой работает JVM.

java.lang.management. OperatingSystemMXBean обеспечивает:

  1. getAvailableProcessors () Количество эквивалентных доступных процессоров Runtime.availableProcessors ()
  2. getSystemLoadAverage () Средняя загрузка системы и средняя загрузка системы за последнюю минуту.

java.lang.management. ManagementFactory

  1. getGarbageCollectorMXBeans () возвращает списокGarbageCollectorMXBeans. Каждый GarbageCollectorMXBean можно запросить для получения следующей информации:

    1. getCollectionCount () количество gc, которые произошли с использованием этого боб.
    2. getCollectionTime () приблизительное накопленное время между GC в миллисекундах. (Заметка: Виртуальная машина Java реализация может использовать высокий таймер разрешения для измерения прошедшее время.)
    3. getName () имя диспетчера памяти.
    4. getMemoryPoolNames () пулы памяти, которыми управляет этот gc.
  2. getThreadMXBean () возвращает ThreadMXBean , который обеспечивает:

    1. getCurrentThreadCpuTime () Возвращает общее время ЦП для текущего потока в наносекундах. Если реализация различает время пользовательского режима и время системного режима, возвращаемое время ЦП - это количество времени, которое текущий поток выполнил в пользовательском режиме или системном режиме.
  3. getRuntimeMXBean возвращает RuntimeMXBean
    1. getUptime () время работы виртуальной машины Java в миллисекундах.
    2. getStartTime () время запуска виртуальной машины Java в миллисекундах.
    3. getInputArguments () Возвращает входные аргументы, передаваемые виртуальной машине Java, которая не включает аргументы в метод main.
  4. getCompilationMXBean возвращает CompilationMXBean
    1. getName () имя JIT
    2. getTotalCompilationTime () время в миллисекундах, необходимое для компиляции вашего кода.

Ответы [ 3 ]

6 голосов
/ 18 июня 2009

Достаточно просто получить информацию, доступную с помощью метода System.getProperties (или System.getProperty).

Например, os.name вернет имя операционной системы. В моей системе я получил Windows XP как результат.

Некоторая информация, доступная System.getProperties, которая, по-видимому, доступна апплету, включает:

  • java.vm.version - версия JVM.
  • java.vm.vendor - название поставщика JVM.
  • java.vm.name - название JVM.
  • os.name - название операционной системы. (например, Windows XP)
  • os.arch - архитектура системы. (например, x86)
  • os.version - версия операционной системы. (например, 5.1)
  • java.specification.version - версия спецификации JRE.

Вышеприведенный список не является исчерпывающим, но он может дать некоторые представления о том, на что похожа система.

Следует отметить, что не все свойства, доступные через System.getProperties, могут быть прочитаны, поскольку для некоторых свойств диспетчер безопасности вызовет AccessControlException. Когда я попытался прочитать свойство java.home, возникло исключение.

Чтобы получить те свойства, которые по умолчанию вызывают AccessControlException, вероятно, нужно будет предпринять шаги, чтобы дать разрешения апплету на выполнение некоторых из этих данных. (Вот ссылка на раздел Ограничения безопасности Урока: Апплеты из Учебники Java .)

Класс Runtime может предоставить такую ​​информацию, как:

  • Количество процессоров (или ядер, или, предположительно, логических потоков), доступных для JVM методом Runtime.availableProcessors.
  • Информация о памяти виртуальной машины Java, такая как freeMemory, maxMemory и totalMemory.

Помимо информации, предоставляемой классами System и Runtime по умолчанию, вероятно, потребуются вызовы операционной системы, которые будут зависеть от платформы.

Редактировать

Страница Получение свойств системы из Урок: Апплеты из Учебные руководства по Java предоставляют список свойств, которые можно прочитать, и список свойств, которые можно прочитать. не может быть прочитано апплетами.

1 голос
/ 26 марта 2012

С getNetworkInterfaces вы можете перечислить сетевые интерфейсы в вашей системе:

http://www.browserleaks.com/java

Может отображаться важная информация, например имя сетевого адаптера и имя подключения.

1 голос
/ 02 марта 2011

Вот еще немного:

java.awt.Toolkit может рассказать о разрешении экрана и, возможно, даже больше о графической карте (из используемой цветовой модели).

Вы также можете выделить больший массив байтов и измерить время доступа, чтобы получить приблизительную информацию о кеше (в прошлом мы играли с этим, чтобы проверить, работают ли приемы кеширования памяти с Java вообще; Однако эти тесты могут повесить ваш апплет на некоторое время, поэтому вам нужно сообщить пользователю, что вы делаете.

Апплеты, которые выполняют моделирование, могут измерять соотношение прошедшего виртуального времени и прошедшего реального времени. После обнаружения медленной системы апплет может увеличить шаг интеграции и аналогичные константы, что требует меньшего времени ЦП, даже за счет менее идеального вывода. Здесь приведен пример такого кода самонастройки, который регулирует скорость шага при моделировании поведения птичьего стада.

...