Возможно ли создать JVM внутри JVM с использованием JNI_CreateJavaVM или аналогичного? [Дубликат]

Поместите его в цикл for, чтобы сделать каждую вещь 1 000 000 раз, чтобы получить более реалистичное число. И только запустите таймер непосредственно перед кодом, который вы на самом деле хотите проверить, а затем запишите конечное время сразу (т. Е. Не запускайте таймер перед session_start().

Также убедитесь, что код идентичен

Как выполняется сценарий (cronjob, php из командной строки, Apache и т. д.) не должны иметь значения, поскольку вы являетесь только время относительное различие между скоростью различных функций.Таким образом, это соотношение должно оставаться неизменным.

Если на компьютере, на котором вы используете эталон, есть много других вещей, это может повлиять на бенчмарк результаты, если произойдет скачок в использовании процессора или памяти из другого приложения во время работы вашего теста. Но пока у вас много ресурсов, чтобы сэкономить на компьютере, я не думаю, что это будет проблемой.

1
задан Martin Rindarøy 9 March 2016 в 11:15
поделиться

1 ответ

Текущая спецификация JNI явно заявляет, что создание нескольких виртуальных машин в одном процессе не поддерживается , и это фактически утверждается в исходном коде HotSpot .

Даже если ваша dll вызывает JNI_CreateJavaVM только один раз, это не означает, что это самый первый вызов в течение всего процесса. Фактически, JNI_CreateJavaVM сначала вызывается java.exe или другой пусковой установкой вашей IDE (idea.exe, eclipse.exe, netbeans.exe и т. Д.).

Поэтому вместо того, чтобы создавать Java VM вслепую , A.dll должен проверить сначала, если JVM уже существует в текущем процессе, вызвав JNI_GetCreatedJavaVMs . Если функция возвращает непустой массив, используйте GetEnv или AttachCurrentThread , чтобы получить JNIEnv* для существующей виртуальной машины, иначе создайте новую виртуальную машину.

4
ответ дан apangin 15 August 2018 в 21:51
поделиться
  • 1
    Спасибо за ваш ответ, в настоящее время проверяем ситуацию – Martin Rindarøy 8 March 2016 в 17:47
  • 2
    Это сработало, спасибо! Я использовал опцию GetEnv. – Martin Rindarøy 9 March 2016 в 08:45
  • 3
    Кажется, что JNI_GetCreatedJavaVMs завершает весь процесс, если нет виртуальных машин ... Любые мысли об этом? – Martin Rindarøy 9 March 2016 в 11:01
  • 4
    О, я понял это - глупая ошибка. Поэтому я получаю функцию JNI_GetCreatedJavaVMs следующим образом: jni_GetCreatedJavaVMs = (GetCreatedJavaVMs) GetProcAddress(GetModuleHandle( TEXT("jvm.dll")), "JNI_GetCreatedJavaVMs");, и я забыл проверить, был ли jni_GetCreatedJavaVMs NULL перед вызовом jni_GetCreatedJavaVMs(NULL, 0, &nVMs); – Martin Rindarøy 9 March 2016 в 11:07
  • 5
    Поскольку, как утверждается, C ++-код вызывается из Java, невозможно, чтобы JNI_GetCreatedJavaVMs() не возвращал JVM. Трудно понять, о чем идет речь, или о предполагаемом решении, – user207421 7 October 2016 в 09:50
Другие вопросы по тегам:

Похожие вопросы: