На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Повторное создание JVM после ее уничтожения ???
    Повторное создание JVM после ее уничтожения вызывает внутри функции бесконечный цикл исключений ???
    Даже при динамической загрузке JVM.dll и успешном вызове
    ExpandedWrap disabled
      <br>typedef jint (__stdcall *P_JNI_CreateJavaVM) (JavaVM **pvm, void **penv, void *args);<br><br>bool CMyApp::GetDriverParamList()<br>   {<br>   BOOL _res;<br>   jint res;<br>   HINSTANCE hinstLib=NULL;<br>   JNIEnv *env=NULL;<br>   JavaVM *jvm=NULL;<br><br>   hinstLib = LoadLibrary(L"jvm.dll");<br><br>    P_JNI_CreateJavaVM p_JNI_CreateJavaVM = (P_JNI_CreateJavaVM)<br>      GetProcAddress(hinstLib,"JNI_CreateJavaVM");<br>      <br>    if(!hinstLib)<br>         Error(L"Can't load jvm.dll. Check jrehome parameter");<br>    if(!p_JNI_CreateJavaVM)<br>         Error(L"Can't get JNI_CreateJavaVM function address.");<br>    res = p_JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args);<br>    if (res < 0) <br>         Error(L"Can't create Java VM\n";);<br>    ... .....  ......<br>    if(jvm)<br>        jvm->DestroyJavaVM();<br>    if(hinstLib)<br>        res = FreeLibrary(hinstLib);<br>    }<br>

    Следующий вызов данной функции вызвает бесконечный цикл исключений
    при создании виртуальной машины и не возвращает управление. Происходит это здесь:
    ExpandedWrap disabled
      p_JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args))

    Может кто-то сталкавался с подобной ситуацией. Как этого избежать?
    ???
      Ну как разобрался? Или может кто-то еще знает? У меня такая же беда была, пришлось создавать ВМ только раз и завершать вместе с процессом всего приложения. Может проблема в том, что ВМ толком не завершается, хотя DestroyJavaVM() возвращает 0. Остается висеть еще два или три (почему-то в зависимости от динамической загрузки jvm.dll программой или загрузчиком с помощью библиотеки импорта) остановленных потока в состоянии внутри ВМ. В первом варианте при повторном вызове JNI_CreateJavaVM() действительно вылет, во втором бесконечный цикл внутри ВМ. Вылет возможно из за того, что после предыдущего DestroyJavaVM() следовала пара LoadLibrary()/FreeLibrary().
      Кстати, есть такой текст...
      "JDK-1.1 virtual machines do not support the unloading, or destruction, of a JVM. This has the side-effect that the return status of DestroyJavaVM() on a JDK-1.1 JVM is always -1 indicating failure. Furthermore, the JDK-1.1 placed the restriction upon you that the thread in which the JVM was created must always destroy the JVM. This restriction has been lifted in Java-2 in which any thread can destroy the JVM. However, that thread must be the only one currently attached to the JVM at that point otherwise, the DestroyJavaVM() call will block as usual."
      Так что, хоть прямо и не говорится, но в Java-2 вроде должна быть возможность корректного разрушения JVM.
        Я экспериментировал с jdk 1.2 Наверное, так делать нельзя. Каждому процессу по одной ВМ в принципе вполне достаточно, если не приходиться менять параметры запуска. Конечно, это ограничивает разработчика. Приходиться обходиться одной и, похоже, другого выхода пока нет.

        в jdk 1.3.0_02 в документации сказано следующее

        jint DestroyJavaVM(JavaVM *vm);

        The support for DestroyJavaVM was not complete in 1.1. Only the main thread may call DestroyJavaVM. In the Java 2 SDK, any thread, whether attached or not, can call this function. If the current thread is attached, the VM waits until the current thread is the only user-level Java thread. If the current thread is not attached, the VM attaches the current thread and then waits until the current thread is the only user-level thread. The Java 2 SDK still does not support VM unloading, however. DestroyJavaVM always returns an error code.
          Все ясно... Thanks.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0229 ]   [ 15 queries used ]   [ Generated: 27.04.24, 07:55 GMT ]