JDK-4411392 : JNI app dies with "Internal Error" in JNI_CreateVM
  • Type: Bug
  • Component: hotspot
  • Sub-Component: runtime
  • Affected Version: 1.3.0
  • Priority: P2
  • Status: Closed
  • Resolution: Not an Issue
  • OS: solaris_2.6
  • CPU: sparc
  • Submitted: 2001-02-02
  • Updated: 2001-02-16
  • Resolved: 2001-02-16
Related Reports
Relates :  
Relates :  
Description

Name: yyT116575			Date: 02/02/2001


java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-RC)
Java HotSpot(TM) Client VM (build 1.3.0-RC, mixed mode)


I get the following error when I try to create a JVM using JNI
from inside a large multi-threaded application.

  Calling createJVM...
  #
  # HotSpot Virtual Machine Error, Internal Error
  # Please report this error at
  # http://java.sun.com/cgi-bin/bugreport.cgi
  #
  ###### ERROR: Abnormal shutdown of process 11574 thread 9.

I am running JDK1.3 on a Sun Ultra 10 running Solaris 2.6.  I tried
both the client and server JVM libraries with the same result.

Note : This same application worked fine using JDK1.2

Here is the stack trace for the offending thread :

  lwp#10 ----------
   ee1b92cc waitid   (0, 2d4a, ed8ff258, 3)
   ee1d4644 _libc_waitpid (2d4a, ed8ff3cc, 0, 0, ef1b7e20, ef1bb368) + 54
   ef1a601c _ti_waitpid (b, ed8ffd20, ed8ffa68, ef1b6c40, ed901e48, ed901e28) + 34
   ef1a4758 __libthread_segvhdlr (b, ed8ffd20, ed8ffa68, ef1b6c40, 0, 0) + e0
   ef1a668c __sighndlr (b, ed8ffd20, ed8ffa68, ef1a4678, ed901e48, ed901e28) + c
   ef1a3b14 sigacthandler (b, ed8ffd20, ed8ffa68, ef1b6c40, 2c, ed901e58) + 71c
   ece39ff8 __1cSThreadLocalStorageUget_thread_via_cache6F_pnGThread__
(ed019e6c, ed0306cc, 138, ed8ff, ed019e6c, ed8ffe04) + 24
   eccc43b4 __1cMreport_error6Flpkci11E_v_ (e4, ed900684, 751, ecfbfc38,
ed077414, ed019e6c) + 2c4
   eccc3e40 __1cMreport_fatal6Fpkci1E_v_ (751, ed019e6c, ecfd1270, 16c050, b,
3e4398) + 60
   ecdd37e0 __1cJos_init_26F_l_ (1, ed077414, ed0303a0, ed019e6c, ed019e6c, 0) + 1d8
   ece37478 __1cHThreadsJcreate_vm6FpnOJavaVMInitArgs__l_ (ed901990, ed027514,
0, ed019e6c, ecfdb7c4, 0) + 78
   ecd4baa0 JNI_CreateJavaVM (ed027514, ffffffff, ed901990, ed019e6c, ed9019e0,
ed9019dc) + 48
   0008c258 __0fFMyJVMKThreadMainiT (0, 47ad48, 0, 0, 0, 0) + 3c0
   001a3814 __0fJUCSThreadKThreadMainPvT (47ad48, 0, 1, ef1b8390, 1, ef1b6c40) + c44
   ef1a6590 _thread_start (47ad48, 0, 0, 0, 0, 0) + 40

Here is the code for the thread that creates the JVM.

void MyJVM::ThreadMain( int )
{
  JNIEnv* env;
  JavaVM* jvm;

  //------------------------------------------------------------
  // Load the JVM shared library specified on the command-line
  //------------------------------------------------------------
  void *libVM = dlopen( JVMArg.Get(), RTLD_LAZY );
  if ( libVM == NULL )
  {
    cerr << "Error loading JVM " << JVMArg.Get() << endl;
    cerr << dlerror() << endl;
    return;
  }

  //------------------------------------------------------------
  // Locate the function used to create a new JVM
  //------------------------------------------------------------
  CreateJavaVMFunc* createJVM = 
      (CreateJavaVMFunc*)dlsym( libVM, "JNI_CreateJavaVM" );
  if ( createJVM == NULL )
  {
    cerr << "Can't find symbol JNI_CreateJavaVM in " << JVMArg.Get() << endl;
    return;
  }

  //--------------------------------------------------
  // Create the Java Virtual machine
  //--------------------------------------------------
  JavaVMOption options[1];
  options[0].optionString = "-Djava.class.path=" USER_CLASSPATH;

  JavaVMInitArgs vm_args;
  vm_args.version = JNI_VERSION_1_2;
  vm_args.options = options;
  vm_args.nOptions = 1;
  vm_args.ignoreUnrecognized = JNI_TRUE;

  cerr << "Calling createJVM..." << endl;
  jint res = createJVM( &jvm, (void**)&env, &vm_args );
  cerr << "done." << endl;
(Review ID: 116303) 
======================================================================






02/15

i2 is experiencing a similar problem using JDK1.3 on Solaris 2.6

#
>> # HotSpot Virtual Machine Error, Internal Error
>> # Please report this error at
>> # http://java.sun.com/cgi-bin/bugreport.cgi
>> #
>> [error occured during error reporting]
>> Segmentation fault

	
(dbx) where
>> current thread: t@1
>>   [1] ThreadLocalStorage::get_thread_via_cache(0xef173b44, 0xef1897c4, 0x4,
>> 0xefffd, 0xef173b44, 0xefffd41c), at 0xef05706c
>>   [2] report_error(0xe4, 0xefffdc9c, 0x751, 0xef13062c, 0xef1aadbc,
>> 0xef173b44), at 0xeeee4c1c
>>   [3] report_fatal(0x751, 0xef173b44, 0xef141b2c, 0xef225b88, 0x8,
>> 0x522f450), at 0xeeee46a8
>>   [4] os_init_2(0x1, 0xef1aadbc, 0xef1894c8, 0xef173b44, 0xef173b44, 0x0),
>> at 0xeeff0f48
>>   [5] Threads::create_vm(0xefffefec, 0xef180644, 0x0, 0xef173b44,
>> 0xef14bd9c, 0x0), at 0xef0545e8
>>   [6] JNI_CreateJavaVM(0xef180644, 0xffffffff, 0xefffefec, 0xef173b44,
>> 0x51f50b8, 0x522f160), at 0xeef69640
>> =>[7] Java_Interface::initialize(), line 473 in
>> "/view/yuriy_new/dvobs/share/model_pkg/ws/java_interface.c"
>>   [8] sinit257_init_func(), line 265 in
>> "/view/yuriy_new/dvobs/share/model_pkg/ws/java_interface.c"
>>   [9] After_Static_Initializers::call(max = 3.0), line 104 in
>> "/view/yuriy_new/dvobs/share/bbc_pkg/base/initialize.c"
>>   [10] set_options(argc = 4, argv = 0xeffff2dc, option_file_path = (nil)),
>> line 622 in "/view/yuriy_new/dvobs/share/bbc_pkg/base/option_base.c"
>>   [11] main(argc = 4, argv = 0xeffff2dc), line 702 in "rl_engine.c"


Here's a snippet of their code:

 JavaVMInitArgs vm_args;
    int numOptions = 0;
    JavaVMOption jvmOptions[20];
    char *buff;

    vm_args.version = JNI_VERSION_1_2;
    vm_args.ignoreUnrecognized = TRUE;

    char const* clspath = getenv("CLASSPATH");
    if (clspath) {
      buff = new char[20 + strlen(clspath)];
      strcpy(buff, "-Djava.class.path=");
      strcat(buff, clspath);
      jvmOptions[numOptions].optionString = buff;
      numOptions++;
    }

#if 0
    char** properties = java_properties.props();
    if (properties)
    {
      for (int i = 0; properties[i] != NULL; i++)
      {
	Str buffer(S("-D"));
	buffer += properties[i];
	jvmOptions[numOptions].optionString = 
REINTERPRET_CAST(char*)(str_copy_new(buffer()));
	numOptions++;
      }
    }
#endif

    vm_args.nOptions = numOptions;
    vm_args.options = (JavaVMOption *) jvmOptions;

    jint res = JNI_CreateJavaVM(&jvm_, (void **) &env_, &vm_args);
    if (res != 0 &&	// Failure
        res != -1234)	// and JNI_CreateJavaVM isn't stubbed (see 
model_pkg/java_stubs.c)
      error("Can't create a Java Virtual Machine\n"
            "\tDoes the CLASSPATH environment variable include\n"
            "\tthe Java language .zip or .jar file?\n"
            "The current CLASSPATH is:\n"
            "\t{0}", Java_Interface::class_path());

    if (res < 0)
      return false;

    if (jvm_ == 0) {
      error("Can't create Java VM");
      return false;
    }



Comments
EVALUATION Not enough information to provide a diagnosis. If user's application is setting up signal handlers, see 4323062, 4345157 and related bugs. User would need to provide a test case to proceed further. kenneth.russell@eng 2001-02-13 Reproduced the failure described by the customer with the small test program. Linking against jvm_g indicated problems with threading; Thomas.Rodriguez@eng suggested linking the main application against libthread, which solved the problem. libthread.so should be linked before libjvm.so. A note to this effect is in the JDK 1.3.0 Solaris Release Notes and will be expanded in the documentation for 1.3.1. kenneth.russell@eng 2001-02-16
16-02-2001