JDK-8000263 : JSR 292: signature types may appear to be unloaded
Type:Bug
Component:hotspot
Sub-Component:compiler
Priority:P3
Status:Resolved
Resolution:Fixed
Submitted:2012-09-28
Updated:2013-06-26
Resolved:2012-10-09
The Version table provides details related to the release that this issue/RFE will be addressed.
Unresolved : Release in which this issue/RFE will be addressed. Resolved: Release in which this issue/RFE has been resolved. Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.
In certain situations signature types like java/lang/Object may appear to be unloaded which leads to deoptimizations and recompilations.
Comments
Setting component and subcomponent; please adjust as appropriate.
17-10-2012
There are two ways to fix it. The first one is two return java/lang/Object as field type if the computed type is unloaded. The second fix is to turn on LinkWellKnowClasses by default. LinkWellKnownClasses only works if the field type is java/lang/Object, for user types we need to other fix.
04-10-2012
The problem is in the intrinsification code for Unsafe.getObject. Usually field accesses with get/putfield resolve the field when parsing the bytecode. ciBytecodeStream::get_field calls ciField::will_link which puts class loader constraints for the signature types in place. In LibraryCallKit::inline_unsafe_access we create a ciField object for the field we are accessing but with the ciField's type left uninitialized. When calling ciField::type we try to look up the field type lazily which fails because we never resolved the field and put class loader constraints in place.
In this particular case the type of a pointer field was not initialized and we have to call ciField::compute_type to get the type. The class loader of the field holder is a non-boot class loader and this loader doesn't know about java/lang/Object.
(dbx) where
current thread: t@30
=>[1] ciEnv::get_klass_by_name_impl(this = 0x73b7da98, accessing_klass = 0x8c70cc0, cpool = CLASS, name = 0x81331d8, require_local = false), line 447 in "ciEnv.cpp"
[2] ciEnv::get_klass_by_name_impl(this = 0x73b7da98, accessing_klass = 0x8c70cc0, cpool = CLASS, name = 0x8136118, require_local = false), line 358 in "ciEnv.cpp"
[3] ciField::compute_type_impl(this = 0x87b2e08), line 290 in "ciField.cpp"
[4] ciField::compute_type(this = 0x87b2e08), line 286 in "ciField.cpp"
[5] ciField::type(this = 0x87b2e08), line 105 in "ciField.hpp"
[6] LibraryCallKit::sharpen_unsafe_type(this = 0x73b78d0c, alias_type = 0x87869d4, adr_type = 0x8bbf954, is_native_ptr = false), line 2366 in "library_call.cpp"
[7] LibraryCallKit::inline_unsafe_access(this = 0x73b78d0c, is_native_ptr = false, is_store = false, type = T_OBJECT, is_volatile = false), line 2525 in "library_call.cpp"
[8] LibraryCallKit::try_to_inline(this = 0x73b78d0c), line 548 in "library_call.cpp"
[9] LibraryIntrinsic::generate(this = 0x8be1b70, jvms = 0x8b42cf8), line 468 in "library_call.cpp"
[10] Parse::do_call(this = 0x73b79728), line 451 in "doCall.cpp"
[11] Parse::do_one_bytecode(this = 0x73b79728), line 2286 in "parse2.cpp"
[12] Parse::do_one_block(this = 0x73b79728), line 1405 in "parse1.cpp"
[13] Parse::do_all_blocks(this = 0x73b79728), line 680 in "parse1.cpp"
[14] Parse::Parse(this = 0x73b79728, caller = 0x8b41d60, parse_method = 0x87b0820, expected_uses = 47224.0), line 589 in "parse1.cpp"
[15] ParseGenerator::generate(this = 0x8be19d0, jvms = 0x8b41d60), line 83 in "callGenerator.cpp"
[16] Parse::do_call(this = 0x73b7a1dc), line 451 in "doCall.cpp"
[17] Parse::do_one_bytecode(this = 0x73b7a1dc), line 2286 in "parse2.cpp"
[18] Parse::do_one_block(this = 0x73b7a1dc), line 1405 in "parse1.cpp"
[19] Parse::do_all_blocks(this = 0x73b7a1dc), line 680 in "parse1.cpp"
[20] Parse::Parse(this = 0x73b7a1dc, caller = 0x8b3fde8, parse_method = 0x8c6fd88, expected_uses = 7706.0), line 589 in "parse1.cpp"
[21] ParseGenerator::generate(this = 0x8be12b0, jvms = 0x8b3fde8), line 83 in "callGenerator.cpp"
[22] Parse::do_call(this = 0x73b7ac90), line 451 in "doCall.cpp"
[23] Parse::do_one_bytecode(this = 0x73b7ac90), line 2286 in "parse2.cpp"
[24] Parse::do_one_block(this = 0x73b7ac90), line 1405 in "parse1.cpp"
[25] Parse::do_all_blocks(this = 0x73b7ac90), line 680 in "parse1.cpp"
[26] Parse::Parse(this = 0x73b7ac90, caller = 0x8b3d710, parse_method = 0x8c6f220, expected_uses = -1.0), line 589 in "parse1.cpp"
[27] ParseGenerator::generate(this = 0x8be1170, jvms = 0x8b3d710), line 83 in "callGenerator.cpp"
[28] Parse::do_call(this = 0x73b7b744), line 451 in "doCall.cpp"
[29] Parse::do_one_bytecode(this = 0x73b7b744), line 2286 in "parse2.cpp"
[30] Parse::do_one_block(this = 0x73b7b744), line 1405 in "parse1.cpp"
[31] Parse::do_all_blocks(this = 0x73b7b744), line 680 in "parse1.cpp"
[32] Parse::Parse(this = 0x73b7b744, caller = 0x8b3cda8, parse_method = 0x8baa580, expected_uses = 10547.0), line 589 in "parse1.cpp"
[33] ParseGenerator::generate(this = 0x8be0b38, jvms = 0x8b3cda8), line 83 in "callGenerator.cpp"
[34] Parse::do_call(this = 0x73b7c1f8), line 451 in "doCall.cpp"
[35] Parse::do_one_bytecode(this = 0x73b7c1f8), line 2286 in "parse2.cpp"
[36] Parse::do_one_block(this = 0x73b7c1f8), line 1405 in "parse1.cpp"
[37] Parse::do_all_blocks(this = 0x73b7c1f8), line 680 in "parse1.cpp"
[38] Parse::Parse(this = 0x73b7c1f8, caller = 0x8b3cae0, parse_method = 0x8ba5a48, expected_uses = 5142.0), line 589 in "parse1.cpp"
[39] ParseGenerator::generate(this = 0x8be0918, jvms = 0x8b3cae0), line 83 in "callGenerator.cpp"
[40] Parse::do_call(this = 0x73b7ccac), line 451 in "doCall.cpp"
[41] Parse::do_one_bytecode(this = 0x73b7ccac), line 2286 in "parse2.cpp"
[42] Parse::do_one_block(this = 0x73b7ccac), line 1405 in "parse1.cpp"
[43] Parse::do_all_blocks(this = 0x73b7ccac), line 680 in "parse1.cpp"
[44] Parse::Parse(this = 0x73b7ccac, caller = 0x8786b08, parse_method = 0x8ba4540, expected_uses = 5159.0), line 589 in "parse1.cpp"
[45] ParseGenerator::generate(this = 0x8be0798, jvms = 0x8786b08), line 83 in "callGenerator.cpp"
[46] Compile::Compile(this = 0x73b7d474, ci_env = 0x73b7da98, compiler = 0x872fe90, target = 0x8ba4540, osr_bci = -1, subsume_loads = true, do_escape_analysis = true), line 692 in "compile.cpp"
[47] C2Compiler::compile_method(this = 0x872fe90, env = 0x73b7da98, target = 0x8ba4540, entry_bci = -1), line 130 in "c2compiler.cpp"
[48] CompileBroker::invoke_compiler_on_method(task = 0x89baf58), line 1792 in "compileBroker.cpp"
[49] CompileBroker::compiler_thread_loop(), line 1631 in "compileBroker.cpp"
[50] compiler_thread_entry(thread = 0x8734800, __the_thread__ = 0x8734800), line 3117 in "thread.cpp"
[51] JavaThread::thread_main_inner(this = 0x8734800), line 1607 in "thread.cpp"
[52] JavaThread::run(this = 0x8734800), line 1587 in "thread.cpp"
[53] java_start(thread_addr = 0x8734800), line 1072 in "os_solaris.cpp"
[54] _thrp_setup(0xfd14e240), at 0xfee53adc
[55] _lwp_start(0xfeb25208, 0xfdd34075, 0x0, 0xfeb25208, 0xfeb25208, 0xfdd3e33e), at 0xfee53d80
(dbx) fr 6
Current function is LibraryCallKit::sharpen_unsafe_type
2366 if (alias_type->field()->type()->is_klass()) {
(dbx) p this->callee()->print()
<ciMethod name=getObject holder=sun/misc/Unsafe signature=(Ljava/lang/Object;J)Ljava/lang/Object; loaded=true arg_size=4 flags=public,native ident=821 address=0x87b11a8>this->callee()->print() = (void)
(dbx) p alias_type->field()->print()
<ciField com/oracle/nashorn/scripts/JO$\u00adOSf\u00adOSbench\u00adOSb.OSb offset=52 type=(reference) is_constant=false>alias_type->field()->print() = (void)
(dbx) p alias_type->field()->holder()->print()
<ciInstanceKlass name=com/oracle/nashorn/scripts/JO$\u00adOSf\u00adOSbench\u00adOSb loader=0xce78ce60 loaded=true initialized=true finalized=false subklass=false size=56 flags=public,super super=com/oracle/nashorn/runtime/ScriptObject mirror=PRESENT ident=798 address=0x8c70cc0>alias_type->field()->holder()->print() = (void)