Mercurial > hg > graal-jvmci-8
comparison src/share/vm/runtime/thread.cpp @ 14297:febc6428bc79
8028275: Metaspace ShrinkGrowTest causes fatal error if run with JFR
Summary: Clean up initialization from Threads::create_vm() so that exceptions cause vm_exit_during_initialzation without an exception mark.
Reviewed-by: dholmes, hseigel
author | coleenp |
---|---|
date | Mon, 27 Jan 2014 23:12:13 -0500 |
parents | 5944dba4badc |
children | 2c95095271e9 |
comparison
equal
deleted
inserted
replaced
14296:50bb249de889 | 14297:febc6428bc79 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
3299 tc->do_thread(wt); | 3299 tc->do_thread(wt); |
3300 | 3300 |
3301 // If CompilerThreads ever become non-JavaThreads, add them here | 3301 // If CompilerThreads ever become non-JavaThreads, add them here |
3302 } | 3302 } |
3303 | 3303 |
3304 | |
3305 void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) { | |
3306 TraceTime timer("Initialize java.lang classes", TraceStartupTime); | |
3307 | |
3308 if (EagerXrunInit && Arguments::init_libraries_at_startup()) { | |
3309 create_vm_init_libraries(); | |
3310 } | |
3311 | |
3312 initialize_class(vmSymbols::java_lang_String(), CHECK); | |
3313 | |
3314 // Initialize java_lang.System (needed before creating the thread) | |
3315 initialize_class(vmSymbols::java_lang_System(), CHECK); | |
3316 initialize_class(vmSymbols::java_lang_ThreadGroup(), CHECK); | |
3317 Handle thread_group = create_initial_thread_group(CHECK); | |
3318 Universe::set_main_thread_group(thread_group()); | |
3319 initialize_class(vmSymbols::java_lang_Thread(), CHECK); | |
3320 oop thread_object = create_initial_thread(thread_group, main_thread, CHECK); | |
3321 main_thread->set_threadObj(thread_object); | |
3322 // Set thread status to running since main thread has | |
3323 // been started and running. | |
3324 java_lang_Thread::set_thread_status(thread_object, | |
3325 java_lang_Thread::RUNNABLE); | |
3326 | |
3327 // The VM creates & returns objects of this class. Make sure it's initialized. | |
3328 initialize_class(vmSymbols::java_lang_Class(), CHECK); | |
3329 | |
3330 // The VM preresolves methods to these classes. Make sure that they get initialized | |
3331 initialize_class(vmSymbols::java_lang_reflect_Method(), CHECK); | |
3332 initialize_class(vmSymbols::java_lang_ref_Finalizer(), CHECK); | |
3333 call_initializeSystemClass(CHECK); | |
3334 | |
3335 // get the Java runtime name after java.lang.System is initialized | |
3336 JDK_Version::set_runtime_name(get_java_runtime_name(THREAD)); | |
3337 JDK_Version::set_runtime_version(get_java_runtime_version(THREAD)); | |
3338 | |
3339 // an instance of OutOfMemory exception has been allocated earlier | |
3340 initialize_class(vmSymbols::java_lang_OutOfMemoryError(), CHECK); | |
3341 initialize_class(vmSymbols::java_lang_NullPointerException(), CHECK); | |
3342 initialize_class(vmSymbols::java_lang_ClassCastException(), CHECK); | |
3343 initialize_class(vmSymbols::java_lang_ArrayStoreException(), CHECK); | |
3344 initialize_class(vmSymbols::java_lang_ArithmeticException(), CHECK); | |
3345 initialize_class(vmSymbols::java_lang_StackOverflowError(), CHECK); | |
3346 initialize_class(vmSymbols::java_lang_IllegalMonitorStateException(), CHECK); | |
3347 initialize_class(vmSymbols::java_lang_IllegalArgumentException(), CHECK); | |
3348 } | |
3349 | |
3350 void Threads::initialize_jsr292_core_classes(TRAPS) { | |
3351 initialize_class(vmSymbols::java_lang_invoke_MethodHandle(), CHECK); | |
3352 initialize_class(vmSymbols::java_lang_invoke_MemberName(), CHECK); | |
3353 initialize_class(vmSymbols::java_lang_invoke_MethodHandleNatives(), CHECK); | |
3354 } | |
3355 | |
3304 jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { | 3356 jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { |
3305 | 3357 |
3306 extern void JDK_Version_init(); | 3358 extern void JDK_Version_init(); |
3307 | 3359 |
3308 // Check version | 3360 // Check version |
3468 // Make sure we're starting with a clean slate. | 3520 // Make sure we're starting with a clean slate. |
3469 VM_Verify verify_op; | 3521 VM_Verify verify_op; |
3470 VMThread::execute(&verify_op); | 3522 VMThread::execute(&verify_op); |
3471 } | 3523 } |
3472 | 3524 |
3473 EXCEPTION_MARK; | 3525 Thread* THREAD = Thread::current(); |
3474 | 3526 |
3475 // At this point, the Universe is initialized, but we have not executed | 3527 // At this point, the Universe is initialized, but we have not executed |
3476 // any byte code. Now is a good time (the only time) to dump out the | 3528 // any byte code. Now is a good time (the only time) to dump out the |
3477 // internal state of the JVM for sharing. | 3529 // internal state of the JVM for sharing. |
3478 if (DumpSharedSpaces) { | 3530 if (DumpSharedSpaces) { |
3479 MetaspaceShared::preload_and_dump(CHECK_0); | 3531 MetaspaceShared::preload_and_dump(CHECK_JNI_ERR); |
3480 ShouldNotReachHere(); | 3532 ShouldNotReachHere(); |
3481 } | 3533 } |
3482 | 3534 |
3483 // Always call even when there are not JVMTI environments yet, since environments | 3535 // Always call even when there are not JVMTI environments yet, since environments |
3484 // may be attached late and JVMTI must track phases of VM execution | 3536 // may be attached late and JVMTI must track phases of VM execution |
3485 JvmtiExport::enter_start_phase(); | 3537 JvmtiExport::enter_start_phase(); |
3486 | 3538 |
3487 // Notify JVMTI agents that VM has started (JNI is up) - nop if no agents. | 3539 // Notify JVMTI agents that VM has started (JNI is up) - nop if no agents. |
3488 JvmtiExport::post_vm_start(); | 3540 JvmtiExport::post_vm_start(); |
3489 | 3541 |
3490 { | 3542 initialize_java_lang_classes(main_thread, CHECK_JNI_ERR); |
3491 TraceTime timer("Initialize java.lang classes", TraceStartupTime); | 3543 |
3492 | 3544 // We need this for ClassDataSharing - the initial vm.info property is set |
3493 if (EagerXrunInit && Arguments::init_libraries_at_startup()) { | 3545 // with the default value of CDS "sharing" which may be reset through |
3494 create_vm_init_libraries(); | 3546 // command line options. |
3495 } | 3547 reset_vm_info_property(CHECK_JNI_ERR); |
3496 | |
3497 initialize_class(vmSymbols::java_lang_String(), CHECK_0); | |
3498 | |
3499 // Initialize java_lang.System (needed before creating the thread) | |
3500 initialize_class(vmSymbols::java_lang_System(), CHECK_0); | |
3501 initialize_class(vmSymbols::java_lang_ThreadGroup(), CHECK_0); | |
3502 Handle thread_group = create_initial_thread_group(CHECK_0); | |
3503 Universe::set_main_thread_group(thread_group()); | |
3504 initialize_class(vmSymbols::java_lang_Thread(), CHECK_0); | |
3505 oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0); | |
3506 main_thread->set_threadObj(thread_object); | |
3507 // Set thread status to running since main thread has | |
3508 // been started and running. | |
3509 java_lang_Thread::set_thread_status(thread_object, | |
3510 java_lang_Thread::RUNNABLE); | |
3511 | |
3512 // The VM creates & returns objects of this class. Make sure it's initialized. | |
3513 initialize_class(vmSymbols::java_lang_Class(), CHECK_0); | |
3514 | |
3515 // The VM preresolves methods to these classes. Make sure that they get initialized | |
3516 initialize_class(vmSymbols::java_lang_reflect_Method(), CHECK_0); | |
3517 initialize_class(vmSymbols::java_lang_ref_Finalizer(), CHECK_0); | |
3518 call_initializeSystemClass(CHECK_0); | |
3519 | |
3520 // get the Java runtime name after java.lang.System is initialized | |
3521 JDK_Version::set_runtime_name(get_java_runtime_name(THREAD)); | |
3522 JDK_Version::set_runtime_version(get_java_runtime_version(THREAD)); | |
3523 | |
3524 // an instance of OutOfMemory exception has been allocated earlier | |
3525 initialize_class(vmSymbols::java_lang_OutOfMemoryError(), CHECK_0); | |
3526 initialize_class(vmSymbols::java_lang_NullPointerException(), CHECK_0); | |
3527 initialize_class(vmSymbols::java_lang_ClassCastException(), CHECK_0); | |
3528 initialize_class(vmSymbols::java_lang_ArrayStoreException(), CHECK_0); | |
3529 initialize_class(vmSymbols::java_lang_ArithmeticException(), CHECK_0); | |
3530 initialize_class(vmSymbols::java_lang_StackOverflowError(), CHECK_0); | |
3531 initialize_class(vmSymbols::java_lang_IllegalMonitorStateException(), CHECK_0); | |
3532 initialize_class(vmSymbols::java_lang_IllegalArgumentException(), CHECK_0); | |
3533 } | |
3534 | |
3535 // See : bugid 4211085. | |
3536 // Background : the static initializer of java.lang.Compiler tries to read | |
3537 // property"java.compiler" and read & write property "java.vm.info". | |
3538 // When a security manager is installed through the command line | |
3539 // option "-Djava.security.manager", the above properties are not | |
3540 // readable and the static initializer for java.lang.Compiler fails | |
3541 // resulting in a NoClassDefFoundError. This can happen in any | |
3542 // user code which calls methods in java.lang.Compiler. | |
3543 // Hack : the hack is to pre-load and initialize this class, so that only | |
3544 // system domains are on the stack when the properties are read. | |
3545 // Currently even the AWT code has calls to methods in java.lang.Compiler. | |
3546 // On the classic VM, java.lang.Compiler is loaded very early to load the JIT. | |
3547 // Future Fix : the best fix is to grant everyone permissions to read "java.compiler" and | |
3548 // read and write"java.vm.info" in the default policy file. See bugid 4211383 | |
3549 // Once that is done, we should remove this hack. | |
3550 initialize_class(vmSymbols::java_lang_Compiler(), CHECK_0); | |
3551 | |
3552 // More hackery - the static initializer of java.lang.Compiler adds the string "nojit" to | |
3553 // the java.vm.info property if no jit gets loaded through java.lang.Compiler (the hotspot | |
3554 // compiler does not get loaded through java.lang.Compiler). "java -version" with the | |
3555 // hotspot vm says "nojit" all the time which is confusing. So, we reset it here. | |
3556 // This should also be taken out as soon as 4211383 gets fixed. | |
3557 reset_vm_info_property(CHECK_0); | |
3558 | 3548 |
3559 quicken_jni_functions(); | 3549 quicken_jni_functions(); |
3560 | 3550 |
3561 // Must be run after init_ft which initializes ft_enabled | 3551 // Must be run after init_ft which initializes ft_enabled |
3562 if (TRACE_INITIALIZE() != JNI_OK) { | 3552 if (TRACE_INITIALIZE() != JNI_OK) { |
3581 // Compute system loader. Note that this has to occur after set_init_completed, since | 3571 // Compute system loader. Note that this has to occur after set_init_completed, since |
3582 // valid exceptions may be thrown in the process. | 3572 // valid exceptions may be thrown in the process. |
3583 // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and | 3573 // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and |
3584 // set_init_completed has just been called, causing exceptions not to be shortcut | 3574 // set_init_completed has just been called, causing exceptions not to be shortcut |
3585 // anymore. We call vm_exit_during_initialization directly instead. | 3575 // anymore. We call vm_exit_during_initialization directly instead. |
3586 SystemDictionary::compute_java_system_loader(THREAD); | 3576 SystemDictionary::compute_java_system_loader(CHECK_JNI_ERR); |
3587 if (HAS_PENDING_EXCEPTION) { | |
3588 vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION)); | |
3589 } | |
3590 | 3577 |
3591 #if INCLUDE_ALL_GCS | 3578 #if INCLUDE_ALL_GCS |
3592 // Support for ConcurrentMarkSweep. This should be cleaned up | 3579 // Support for ConcurrentMarkSweep. This should be cleaned up |
3593 // and better encapsulated. The ugly nested if test would go away | 3580 // and better encapsulated. The ugly nested if test would go away |
3594 // once things are properly refactored. XXX YSR | 3581 // once things are properly refactored. XXX YSR |
3595 if (UseConcMarkSweepGC || UseG1GC) { | 3582 if (UseConcMarkSweepGC || UseG1GC) { |
3596 if (UseConcMarkSweepGC) { | 3583 if (UseConcMarkSweepGC) { |
3597 ConcurrentMarkSweepThread::makeSurrogateLockerThread(THREAD); | 3584 ConcurrentMarkSweepThread::makeSurrogateLockerThread(CHECK_JNI_ERR); |
3598 } else { | 3585 } else { |
3599 ConcurrentMarkThread::makeSurrogateLockerThread(THREAD); | 3586 ConcurrentMarkThread::makeSurrogateLockerThread(CHECK_JNI_ERR); |
3600 } | |
3601 if (HAS_PENDING_EXCEPTION) { | |
3602 vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION)); | |
3603 } | 3587 } |
3604 } | 3588 } |
3605 #endif // INCLUDE_ALL_GCS | 3589 #endif // INCLUDE_ALL_GCS |
3606 | 3590 |
3607 // Always call even when there are not JVMTI environments yet, since environments | 3591 // Always call even when there are not JVMTI environments yet, since environments |
3640 // initialize compiler(s) | 3624 // initialize compiler(s) |
3641 #if defined(COMPILER1) || defined(COMPILER2) || defined(SHARK) | 3625 #if defined(COMPILER1) || defined(COMPILER2) || defined(SHARK) |
3642 CompileBroker::compilation_init(); | 3626 CompileBroker::compilation_init(); |
3643 #endif | 3627 #endif |
3644 | 3628 |
3629 // Pre-initialize some JSR292 core classes to avoid deadlock during class loading. | |
3630 // It is done after compilers are initialized, because otherwise compilations of | |
3631 // signature polymorphic MH intrinsics can be missed | |
3632 // (see SystemDictionary::find_method_handle_intrinsic). | |
3645 if (EnableInvokeDynamic) { | 3633 if (EnableInvokeDynamic) { |
3646 // Pre-initialize some JSR292 core classes to avoid deadlock during class loading. | 3634 initialize_jsr292_core_classes(CHECK_JNI_ERR); |
3647 // It is done after compilers are initialized, because otherwise compilations of | |
3648 // signature polymorphic MH intrinsics can be missed | |
3649 // (see SystemDictionary::find_method_handle_intrinsic). | |
3650 initialize_class(vmSymbols::java_lang_invoke_MethodHandle(), CHECK_0); | |
3651 initialize_class(vmSymbols::java_lang_invoke_MemberName(), CHECK_0); | |
3652 initialize_class(vmSymbols::java_lang_invoke_MethodHandleNatives(), CHECK_0); | |
3653 } | 3635 } |
3654 | 3636 |
3655 #if INCLUDE_MANAGEMENT | 3637 #if INCLUDE_MANAGEMENT |
3656 Management::initialize(THREAD); | 3638 Management::initialize(THREAD); |
3657 #endif // INCLUDE_MANAGEMENT | |
3658 | 3639 |
3659 if (HAS_PENDING_EXCEPTION) { | 3640 if (HAS_PENDING_EXCEPTION) { |
3660 // management agent fails to start possibly due to | 3641 // management agent fails to start possibly due to |
3661 // configuration problem and is responsible for printing | 3642 // configuration problem and is responsible for printing |
3662 // stack trace if appropriate. Simply exit VM. | 3643 // stack trace if appropriate. Simply exit VM. |
3663 vm_exit(1); | 3644 vm_exit(1); |
3664 } | 3645 } |
3646 #endif // INCLUDE_MANAGEMENT | |
3665 | 3647 |
3666 if (Arguments::has_profile()) FlatProfiler::engage(main_thread, true); | 3648 if (Arguments::has_profile()) FlatProfiler::engage(main_thread, true); |
3667 if (MemProfiling) MemProfiler::engage(); | 3649 if (MemProfiling) MemProfiler::engage(); |
3668 StatSampler::engage(); | 3650 StatSampler::engage(); |
3669 if (CheckJNICalls) JniPeriodicChecker::engage(); | 3651 if (CheckJNICalls) JniPeriodicChecker::engage(); |