-
Bug
-
Resolution: Won't Fix
-
P3
-
None
-
1.4.2_09
-
sparc
-
solaris_9
Furthermore, the customer tries the same application in 5.0.
This issue does not occur in 5.0.
When the customer runs the application crashed in 1.4.2_09
with -server -Xcomp -XX:+PrintCompilation,
the above-mentioned method terminates during compiling in OSR.
---------------------------------------------------------
1%s!b A.class1::method65 @ 2802 (8687 bytes)
1 COMPILE SKIPPED: OSR in finally clause (not retryable)
---------------------------------------------------------
Then the customer begins to look into the portion related to compiling bail-out.
The bai-out lines were added when 4614060 was fixed.
However, considering to the above scenario,
the bail-out does not seem to work in 1.4.2_09.
src/share/vm/ci/ciTypeFlow.cpp in 5.0:
===================
if (size() == 0) {
// Ret-state underflow: Hit a ret w/o any previous jsrs. Bail out.
// This can happen when a loop is inside a finally clause (4614060).
analyzer->record_failure("OSR in finally clause");
return;
}
---------------------------------------------------------
The similar lices were added to 1.4.2_09 also.
---------------------------------------------------------
src/share/vm/ci/ciTypeFlow.cpp in 1.4.2_09:
===================
if (size() == 0) {
// Ret-state underflow: Hit a ret w/o any previous jsrs. Bail out.
// This can happen when a loop is inside a finally clause (4614060).
.....
int start_bci = analyzer->start_bci();
Block* block = analyzer->existing_block_at(start_bci, this);
assert(block != NULL && block->is_start(), "start block must exist");
block->set_trap(start_bci, Deoptimization::Deopt_unhandled_bytecode);
------------(a)
return;
}
--------------
The following is trace information when the code in 1.4.2_09 runs the (a).
When this issue occurs in 1.4.2_09, the customer confirms the above (a)
has been passed. However, bail-out has not occurred different from 5.0.
----------- Trace information -----------------------------
#0 0xfe95de34 in void ciTypeFlow::JsrSet::apply_control(ciTypeFlow*,ciByteCodeS
tream*,ciTypeFlow::StateVector*)
(0xa812a0, 0x188f94, 0xa657ec30, 0xa81288, 0x8d, 0x8d)
#1 0xfe955e14 in void ciTypeFlow::flow_block(ciTypeFlow::Block*,ciTypeFlow::Sta
teVector*,ciTypeFlow::JsrSet*)
(0x188f94, 0xa023c8, 0x1, 0xad3, 0xa01474, 0x0)
#2 0xfe9a10a4 in void ciTypeFlow::flow_types()
(0x188f94, 0x7fdc, 0x1ff7, 0xfee18000, 0xb9ee4, 0x42b598)
#3 0xfe9a16ac in void ciTypeFlow::do_flow()
(0x188f94, 0xa657fd0c, 0xc0da0, 0xa3f, 0x10, 0x8)
#4 0xfea9bcf4 in ciTypeFlow*ciMethod::get_osr_flow_analysis(int)
(0xc0da0, 0xa3f, 0x2, 0x2, 0xfee18000, 0x986c38)
#5 0xfe983708 in Parse::Parse(JVMState*,ciMethod*,float)
(0xa657ee60, 0x0, 0xc0da0, 0x42d80000, 0x0, 0x345ef9)
#7 0xfe985e8c in JVMState*ParseGenerator::generate(JVMState*)
(0xa81254, 0x345eb0, 0x986e8c, 0xa657f2f4, 0x0, 0x0)
#8 0xfea14728 in Compile::Compile(ciEnv*,ciScope*,ciMethod*,int,int,int)
(0xfee6a19c, 0xa81254, 0x98f80c, 0xc0da0, 0xa3f, 0x1)
#9 0xfea10f20 in void C2Compiler::compile_method(ciEnv*,ciScope*,ciMethod*,int,
int)
(0x2b860, 0xa657fd0c, 0x0, 0xc0da0, 0xa3f, 0x0)
---------------------------------------------------------
There is (a) at ciTypeFlow::JsrSet::apply_control() in frame#0.
When the context returns back to Parse::Parse() in frame#5,
bail-out does not work correctly, compiling is still running and
compiled code are generated.
src/share/vm/opto/parse1.cpp in 1.4.2_09 :
===================
void Parse::load_interpreter_state(Node* locks_addrs, Node *local_addrs) {
.........
// Do not OSR inside finally clauses:
if (osr_block->has_trap_at(osr_block->start())) { -------(d)
if (PrintOptoBailouts) tty->print_cr("OSR starts with an immediate trap");
set_parser_bailout(Bailout_osr_unsupported);
return;
}
.........
Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
: _exits(caller)
{
.........
if( non_osr_block == NULL ) {
// osr flow analysis requires info at its starting block
set_parser_bailout(Bailout_osr_needs_type_flow);
} else {
_flow = method()->get_osr_flow_analysis(osr_bci()); -----(b)
}
.........
if (is_osr_parse()) {
.........
load_interpreter_state(locks_addrs,local_addrs); -----(c)
} else {
set_map(entry_map);
do_method_entry();
}
.........
---------------------------------------------------------
"block->set_trap(start_bci, Deoptimization::Deopt_unhandled_bytecode)"
is executed in get_osr_flow_analysis() of line (b) and trap of
Deoptimization::Deopt_unhandled_bytecode is set to BLock.
Bailout_osr_unsupported is set at the line (c) ( the programer seems to expect
bail-out is set here.)
However, osr_block->has_trap_at() at the line (c) is not satisfiled to the
condition at the line (d) and bailout is not set.
CUSTOMER SUGGESTION:
The following modification seems more reasonable than
the current bail-out code in 1.4.2_09 ?
(#ifdef BUGFIX - #endif is the fix)
Actually, the customer says the SIGBUS crash comes not to occur
with the modification.
src/share/vm/opto/parse1.cpp in 1.4.2_09:
===================
// Main parser constructor.
Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
: _exits(caller)
{
............
if (C->is_osr_compilation()) {
_entry_bci = C->entry_bci();
ciTypeFlow::Block* non_osr_block = flow()->existing_block_at(_entry_bci,
new ciTypeFlow::JsrSet(NULL, 16));
if( non_osr_block == NULL ) {
// osr flow analysis requires info at its starting block
set_parser_bailout(Bailout_osr_needs_type_flow);
} else {
_flow = method()->get_osr_flow_analysis(osr_bci());
#ifdef BUGFIX
int start_bci = flow()->start_bci();
ciTypeFlow::Block* block = flow()->existing_block_at(start_bci,
new ciTypeFlow::JsrSet(NULL, 16));
if (block->has_trap()) {
set_parser_bailout(Bailout_osr_unsupported);
}
#endif
}
--------------------------------------------------------------------------------------
When a customer tries their test application on Solaris9,
they have found SIGBUS and JVM crash in 1.4.2_09.
CONFIGURATION :
OS : Solaris9
JRE: 1.4.2_09
BEHAVIOR and INVESTIGATION:
--------------- Dump Information ----------------------------
#8 <signal handler called>
#9 0xfeccb838 in void FastScanClosure::do_oop(oopDesc**)
(0xfe27fac4, 0xc5aff2d4, 0xfe27f638, 0x42b0ed8, 0x18, 0x459154)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#10 0xfed93444 in void OopMapSet::all_do(const frame*,CodeBlob*,const RegisterMa
p*,OopClosure*,void(*)(oopDesc**,oopDesc**),OopClosure*,OopClosure*)
(0x10, 0xb6460, 0xfe27f638, 0xfe27fac4, 0xfee9a170, 0xff1c7c38)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#11 0xfed93614 in void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterM
ap*,OopClosure*)
(0xfe27f628, 0xf9e496c8, 0xfe27f638, 0xfe27fac4, 0x3ee42c, 0xfed5ac90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#12 0xfed5acd4 in void frame::oops_do(OopClosure*,RegisterMap*)
(0xfe27f628, 0xfe27fac4, 0xfe27f638, 0x1, 0x1, 0xff180000)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#13 0xfeda25cc in void JavaThread::oops_do(OopClosure*)
(0x1ca808, 0xfe27fac4, 0x0, 0xf5800000, 0x34cc94, 0xffffff90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#14 0xfee2744c in void Threads::oops_do(OopClosure*)
(0xfe27fac4, 0xfe27fac4, 0xfe27fb28, 0xff180000, 0xfee177b4, 0xfe27fd28)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#15 0xfee265b0 in void GenCollectedHeap::process_strong_roots(int,int,int,GenCol
lectedHeap::ClassScanningOption,OopsInGenClosure*,OopsInGenClosure*)
(0xff180000, 0xfe27fac4, 0x1, 0x0, 0x1, 0xfe27faa0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#16 0xfee3aac0 in void DefNewGeneration::collect(int,int,unsigned,int,int)
(0xb63d0, 0x4c00, 0x4dd4, 0xfe27faa0, 0x9fe58, 0xff1bd8e0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#17 0xfee325c8 in void GenCollectedHeap::do_collection(int,int,unsigned,int,int,
int,int&) (0x22, 0xff1bf7ec, 0x0, 0x0, 0x0, 0xff180000)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#18 0xfee3b1a4 in HeapWord*TwoGenerationCollectorPolicy::satisfy_failed_allocati
on(unsigned,int,int,int&)
(0x9fe58, 0x5, 0xff1bf7ec, 0x0, 0xc59ff10c, 0xffffff90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#19 0xfee3aef8 in void VM_GenCollectForAllocation::doit()
(0xc59ff0f0, 0x92224cb2, 0x0, 0xff180000, 0x4337d7a1, 0xfe27fd28)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#20 0xfee2edb4 in void VM_Operation::evaluate()
(0xc59ff0f0, 0x4800, 0xff180000, 0x36820, 0x4b4418, 0xfede287c)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#21 0xfee2e7d4 in void VMThread::evaluate_operation(VM_Operation*)
(0xec390, 0xc59ff0f0, 0x5400, 0x55a4, 0x5400, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#22 0xfeef32cc in void VMThread::loop()
(0x4c00, 0x4400, 0x47d4, 0x4400, 0x475c, 0x3c00)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#23 0xfeef2dc8 in void VMThread::run() (0xec390, 0x2, 0x40, 0x0, 0x40, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#24 0xfee66564 in _start (0xec390, 0x0, 0x0, 0x0, 0x0, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
---------------------------------------------------------
The crash point seems the following part of hotspot source code.
src/share/vm/memory/genOopClosures.inline.hpp:
===================
void FastScanClosure::do_oop(oop* p) {
oop obj = *p;
........
===================
According to the gdb tools,
---------------------------------------------------------
(gdb) f 9
#9 0xfeccb838 in void FastScanClosure::do_oop(oopDesc**)
(0xfe27fac4, 0xc5aff2d4, 0xfe27f638, 0x42b0ed8, 0x18, 0x459154)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
(gdb) x/10i 0xfeccb838-36
0xfeccb814 <void FastScanClosure::do_oop(oopDesc**)>: save %sp, -96, %sp
0xfeccb818 <void FastScanClosure::do_oop(oopDesc**)+4>: ld [ %i1 ], %g5
0xfeccb81c <void FastScanClosure::do_oop(oopDesc**)+8>: cmp %g5, 0
0xfeccb820 <void FastScanClosure::do_oop(oopDesc**)+12>:be %icc, 0xfeccb8a8
<void FastScanClosure::do_oop(oopDesc**)+148>
0xfeccb824 <void FastScanClosure::do_oop(oopDesc**)+16>:nop
0xfeccb828 <void FastScanClosure::do_oop(oopDesc**)+20>:ld [ %i0 + 0x1c ], %g2
0xfeccb82c <void FastScanClosure::do_oop(oopDesc**)+24>:cmp %g5, %g2
0xfeccb830 <void FastScanClosure::do_oop(oopDesc**)+28>:bcc %icc, 0xfeccb8a8
<void FastScanClosure::do_oop(oopDesc**)+148>
0xfeccb834 <void FastScanClosure::do_oop(oopDesc**)+32>:nop
0xfeccb838 <void FastScanClosure::do_oop(oopDesc**)+36>:ld [ %g5 ], %g2
(gdb) p/x $i1
$4 = 0xc5aff2d4
(gdb) x 0xc5aff2d4
0xc5aff2d4: 0x0000092e
----------------------------------------------------------
It shows that incorrect 1st argument for FastScanClosure::do_oop(), *p is not oop.
The 1st argument of FastScanClosure::do_oop() is set at the following part
in caller oopMap.cpp.
src/share/vm/compiler/oopMap.cpp:
===================
for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) {
omv = oms.current();
oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
if ( loc != NULL ) {
if ( omv.type() == OopMapValue::oop_value ) {
...........
oop_fn->do_oop(loc);
} else if ( omv.type() == OopMapValue::value_value ) {
value_fn->do_oop(loc);
} else if ( omv.type() == OopMapValue::dead_value ) {
dead_fn->do_oop(loc);
}
}
---------------------------------------------------------
Here, CodeBLob is a method, A.class1::method65 and compiled in OSR.
---------------------------------------------------------
(gdb) f 11
#11 0xfed93614 in void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,OopClosure*)
(0xfe27f628, 0xf9e496c8, 0xfe27f638, 0xfe27fac4, 0x3ee42c, 0xfed5ac90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
(gdb) x/6i 0xfed93614-24
0xfed935fc <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+48>: mov %i1, %o1 <-------- CodeBlob
0xfed93600 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+52>: mov %i2, %o2
0xfed93604 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+56>: st %g2, [ %sp + 0x5c ]
0xfed93608 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+60>: mov %i3, %o3
0xfed9360c <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+64>: call 0xfed92d7c <void OopMapSet::all_do(const frame*,CodeBlob*,
const RegisterMap*,OopClosure*,void(*)(oopDesc**,oopDesc**),OopClosure*,OopClosure*)>
0xfed93610 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+68>: mov %g2, %o5
(gdb) p/x $i1
$10 = 0xf9e496c8
(gdb) x/28x 0xf9e496c8 (CodeBlob)
0xf9e496c8: 0xff1c75c0 0x00002604 0x000000a8 0x00000154
0xf9e496d8: 0x00000218 0x00000fb0 0x00002518 0x0000003b
0xf9e496e8: 0x00000084 0xfffffffe 0x042b0a78 0xf59ed848
0xf9e496f8: 0xe4052108 0x00000a3f 0x00000000 0x00000ee4
0xf9e49708: 0x00000ef8 0x00000fb0 0x0000242c 0x00002484
0xf9e49718: 0x00002504 0x00002518 0x00000001 0x00000012
0xf9e49728: 0x7ff7ad06 0x01000000 0x00000002 0xf9e498e0
~~_compile_id
(gdb) x 0xff1c75c0
0xff1c75c0 <nmethod::__vtbl>: 0xff1610a0
--------------------------------------------------------------
CodeBlob is nmethod, and the method of which _compile_id is 2 is A.class1::method65.
Actually, SIGBUS occurs just after this method has been compiled.
Output by PrintCompilation :
........
2%s!b A.class1::method65 @ 2623 (8183 bytes)
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGBUS (0xa) at pc=0xfeccb838, pid=18584, tid=2
---------------------------------------------------------
When SIGBUS occurs, JavaThread is placed at 0xff1764d4.
---------------------------------------------------------
(gdb) f 14
#14 0xfee2744c in void Threads::oops_do(OopClosure*)
(0xfe27fac4, 0xfe27fac4, 0xfe27fb28, 0xff180000, 0xfee177b4, 0xfe27fd28)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
(gdb) x/6i 0xfee2744c-20
0xfee27438 <void Threads::oops_do(OopClosure*)+36>: cmp %l1, 0
0xfee2743c <void Threads::oops_do(OopClosure*)+40>: be,pn %icc, 0xfee2745c
<void Threads::oops_do(OopClosure*)+72>
0xfee27440 <void Threads::oops_do(OopClosure*)+44>: mov %l1, %o0 <-- JavaThread
0xfee27444 <void Threads::oops_do(OopClosure*)+48>: call 0xfeda2488
<void JavaThread::oops_do(OopClosure*)>
0xfee27448 <void Threads::oops_do(OopClosure*)+52>: mov %i0, %o1
0xfee2744c <void Threads::oops_do(OopClosure*)+56>: ld [ %l1 + 0x80 ], %l1
(gdb) p/x $l1
$11 = 0x1ca808
(gdb) x/8 0x1ca808
0x1ca808: 0xff1cc414 0x00000000 0x00000000 0x00000000
0x1ca818: 0x00000000 0x001c8b30 0x00000000 0x00000000
(gdb) x 0xff1cc414
0xff1cc414 <JavaThread::__vtbl>: 0xff1764d4
---------------------------------------------------------
This JavaThread is corresponding to number 10 thread in the following message list.
---------------------------------------------------------
(gdb) t 10
[Switching to thread 10 (thread 11 (ff351400) lwp 11)]
#0 0xff31f954 in ___lwp_mutex_lock
(0x36858, 0x1, 0x1ca808, 0xc5afebe0, 0xf58005a8, 0x0)
from /usr/lib/libc.so.1
(gdb) bt
#0 0xff31f954 in ___lwp_mutex_lock
(0x36858, 0x1, 0x1ca808, 0xc5afebe0, 0xf58005a8, 0x0)
from /usr/lib/libc.so.1
#1 0xfeccc5f8 in void Mutex::lock_without_safepoint_check()
(0x36858, 0x1, 0x1ca808, 0xc5afebe0, 0xf58005a8, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#2 0xfedb6580 in void SafepointSynchronize::block(JavaThread*)
(0x1ca808, 0x1, 0x1ca808, 0x368f0, 0x4b4418, 0xc5afecd0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#3 0xfed95dd8 in int Monitor::wait(int,long)
(0x36928, 0x0, 0x0, 0x4400, 0x4624, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#4 0xfee2eb34 in void VMThread::execute(VM_Operation*)
(0x49b4, 0x1ca808, 0xc5aff158, 0xff1d3688, 0xff180000, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#5 0xfee7da58 in Deoptimization::UnrollBlock*Deoptimization::uncommon_trap(Java
Thread*,int)
(0x1ca808, 0xfffffff5, 0xfffffff5, 0xff180000, 0x3c3a1, 0x1abbd030)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#6 0xf9c32e24 in UncommonTrapBlob
(0xfffffff5, 0x2e176ca0, 0x3fce1d08, 0xd5de8180, 0xf58005a8, 0xf5ac9188)
#7 0xf9e4a4e4 in A.class1::method65(S)S
(0x0, 0xc655dac8, 0xc655dab8, 0xc655daa8, 0xc656d870, 0xc655d9d0)
#8 0xf9d07f40 in OSRAdapter
(0xc5aff6dc, 0xb6, 0xf5d814ac, 0xf9c14120, 0x4, 0xc5aff370)
#9 0xf9c05734 in return entry points
(0xc5aff848, 0x0, 0x0, 0xf9c15e98, 0x8, 0xc5aff650)
#10 0xf9c8d9d8 in C2I Adapter
(0xc64e4588, 0xffffef2a, 0x0, 0xffffef29, 0x1c, 0xc5aff7f0)
#11 0xfa77bba4 in A.class6::method239
(0xef280000, 0xd6095370, 0x1, 0xd60ca350, 0xc64e49a0, 0x1ca808)
#12 0xf9d4955c in A.Driver::run
(0xd60ca600, 0x1c, 0x10, 0xd60c9b00, 0xd60c9bb8, 0xd60c9c08)
#13 0xf9d152f8 in java.lang.Thread::run
(0xc6434ac0, 0x0, 0x0, 0x0, 0x0, 0x0)
#14 0xf9c492c8 in I2C Adapter
(0xc5affba0, 0x0, 0x0, 0x0, 0x477138, 0xfed0d564)
#15 0xf9c00114 in StubRoutines::call_stub
(0xc5affc28, 0xc5affe90, 0xa, 0xf5821ca0, 0x4, 0xc5affb40)
#16 0xfed5db74 in void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallA
rguments*,Thread*)
(0xc5affe88, 0xc5affcf0, 0xc5affda8, 0x1ca808, 0x1ca808, 0xc5affd00)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#17 0xfee4c4cc in void JavaCalls::call_virtual(JavaValue*,KlassHandle,symbolHand
le,symbolHandle,JavaCallArguments*,Thread*)
(0xff180000, 0xf9078, 0xc5affd9c, 0xc5affd98, 0xc5affda8, 0x1ca808)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#18 0xfee5f728 in void JavaCalls::call_virtual(JavaValue*,Handle,KlassHandle,sym
bolHandle,symbolHandle,Thread*)
(0xc5affe88, 0xc5affe84, 0xc5affe7c, 0xc5affe74, 0xc5affe6c, 0x1ca808)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#19 0xfee709ac in void thread_entry(JavaThread*,Thread*)
(0x1ca808, 0x1ca808, 0x2e6360, 0xf9078, 0x315f10, 0xfee6a054)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#20 0xfee6a084 in void JavaThread::run() (0x1ca808, 0xb, 0x40, 0x0, 0x40, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#21 0xfee66564 in _start (0x1ca808, 0x0, 0x0, 0x0, 0x0, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
---------------------------------------------------------
OSR seems related to the above trace.
This issue does not occur in 5.0.
When the customer runs the application crashed in 1.4.2_09
with -server -Xcomp -XX:+PrintCompilation,
the above-mentioned method terminates during compiling in OSR.
---------------------------------------------------------
1%s!b A.class1::method65 @ 2802 (8687 bytes)
1 COMPILE SKIPPED: OSR in finally clause (not retryable)
---------------------------------------------------------
Then the customer begins to look into the portion related to compiling bail-out.
The bai-out lines were added when 4614060 was fixed.
However, considering to the above scenario,
the bail-out does not seem to work in 1.4.2_09.
src/share/vm/ci/ciTypeFlow.cpp in 5.0:
===================
if (size() == 0) {
// Ret-state underflow: Hit a ret w/o any previous jsrs. Bail out.
// This can happen when a loop is inside a finally clause (4614060).
analyzer->record_failure("OSR in finally clause");
return;
}
---------------------------------------------------------
The similar lices were added to 1.4.2_09 also.
---------------------------------------------------------
src/share/vm/ci/ciTypeFlow.cpp in 1.4.2_09:
===================
if (size() == 0) {
// Ret-state underflow: Hit a ret w/o any previous jsrs. Bail out.
// This can happen when a loop is inside a finally clause (4614060).
.....
int start_bci = analyzer->start_bci();
Block* block = analyzer->existing_block_at(start_bci, this);
assert(block != NULL && block->is_start(), "start block must exist");
block->set_trap(start_bci, Deoptimization::Deopt_unhandled_bytecode);
------------(a)
return;
}
--------------
The following is trace information when the code in 1.4.2_09 runs the (a).
When this issue occurs in 1.4.2_09, the customer confirms the above (a)
has been passed. However, bail-out has not occurred different from 5.0.
----------- Trace information -----------------------------
#0 0xfe95de34 in void ciTypeFlow::JsrSet::apply_control(ciTypeFlow*,ciByteCodeS
tream*,ciTypeFlow::StateVector*)
(0xa812a0, 0x188f94, 0xa657ec30, 0xa81288, 0x8d, 0x8d)
#1 0xfe955e14 in void ciTypeFlow::flow_block(ciTypeFlow::Block*,ciTypeFlow::Sta
teVector*,ciTypeFlow::JsrSet*)
(0x188f94, 0xa023c8, 0x1, 0xad3, 0xa01474, 0x0)
#2 0xfe9a10a4 in void ciTypeFlow::flow_types()
(0x188f94, 0x7fdc, 0x1ff7, 0xfee18000, 0xb9ee4, 0x42b598)
#3 0xfe9a16ac in void ciTypeFlow::do_flow()
(0x188f94, 0xa657fd0c, 0xc0da0, 0xa3f, 0x10, 0x8)
#4 0xfea9bcf4 in ciTypeFlow*ciMethod::get_osr_flow_analysis(int)
(0xc0da0, 0xa3f, 0x2, 0x2, 0xfee18000, 0x986c38)
#5 0xfe983708 in Parse::Parse(JVMState*,ciMethod*,float)
(0xa657ee60, 0x0, 0xc0da0, 0x42d80000, 0x0, 0x345ef9)
#7 0xfe985e8c in JVMState*ParseGenerator::generate(JVMState*)
(0xa81254, 0x345eb0, 0x986e8c, 0xa657f2f4, 0x0, 0x0)
#8 0xfea14728 in Compile::Compile(ciEnv*,ciScope*,ciMethod*,int,int,int)
(0xfee6a19c, 0xa81254, 0x98f80c, 0xc0da0, 0xa3f, 0x1)
#9 0xfea10f20 in void C2Compiler::compile_method(ciEnv*,ciScope*,ciMethod*,int,
int)
(0x2b860, 0xa657fd0c, 0x0, 0xc0da0, 0xa3f, 0x0)
---------------------------------------------------------
There is (a) at ciTypeFlow::JsrSet::apply_control() in frame#0.
When the context returns back to Parse::Parse() in frame#5,
bail-out does not work correctly, compiling is still running and
compiled code are generated.
src/share/vm/opto/parse1.cpp in 1.4.2_09 :
===================
void Parse::load_interpreter_state(Node* locks_addrs, Node *local_addrs) {
.........
// Do not OSR inside finally clauses:
if (osr_block->has_trap_at(osr_block->start())) { -------(d)
if (PrintOptoBailouts) tty->print_cr("OSR starts with an immediate trap");
set_parser_bailout(Bailout_osr_unsupported);
return;
}
.........
Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
: _exits(caller)
{
.........
if( non_osr_block == NULL ) {
// osr flow analysis requires info at its starting block
set_parser_bailout(Bailout_osr_needs_type_flow);
} else {
_flow = method()->get_osr_flow_analysis(osr_bci()); -----(b)
}
.........
if (is_osr_parse()) {
.........
load_interpreter_state(locks_addrs,local_addrs); -----(c)
} else {
set_map(entry_map);
do_method_entry();
}
.........
---------------------------------------------------------
"block->set_trap(start_bci, Deoptimization::Deopt_unhandled_bytecode)"
is executed in get_osr_flow_analysis() of line (b) and trap of
Deoptimization::Deopt_unhandled_bytecode is set to BLock.
Bailout_osr_unsupported is set at the line (c) ( the programer seems to expect
bail-out is set here.)
However, osr_block->has_trap_at() at the line (c) is not satisfiled to the
condition at the line (d) and bailout is not set.
CUSTOMER SUGGESTION:
The following modification seems more reasonable than
the current bail-out code in 1.4.2_09 ?
(#ifdef BUGFIX - #endif is the fix)
Actually, the customer says the SIGBUS crash comes not to occur
with the modification.
src/share/vm/opto/parse1.cpp in 1.4.2_09:
===================
// Main parser constructor.
Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
: _exits(caller)
{
............
if (C->is_osr_compilation()) {
_entry_bci = C->entry_bci();
ciTypeFlow::Block* non_osr_block = flow()->existing_block_at(_entry_bci,
new ciTypeFlow::JsrSet(NULL, 16));
if( non_osr_block == NULL ) {
// osr flow analysis requires info at its starting block
set_parser_bailout(Bailout_osr_needs_type_flow);
} else {
_flow = method()->get_osr_flow_analysis(osr_bci());
#ifdef BUGFIX
int start_bci = flow()->start_bci();
ciTypeFlow::Block* block = flow()->existing_block_at(start_bci,
new ciTypeFlow::JsrSet(NULL, 16));
if (block->has_trap()) {
set_parser_bailout(Bailout_osr_unsupported);
}
#endif
}
--------------------------------------------------------------------------------------
When a customer tries their test application on Solaris9,
they have found SIGBUS and JVM crash in 1.4.2_09.
CONFIGURATION :
OS : Solaris9
JRE: 1.4.2_09
BEHAVIOR and INVESTIGATION:
--------------- Dump Information ----------------------------
#8 <signal handler called>
#9 0xfeccb838 in void FastScanClosure::do_oop(oopDesc**)
(0xfe27fac4, 0xc5aff2d4, 0xfe27f638, 0x42b0ed8, 0x18, 0x459154)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#10 0xfed93444 in void OopMapSet::all_do(const frame*,CodeBlob*,const RegisterMa
p*,OopClosure*,void(*)(oopDesc**,oopDesc**),OopClosure*,OopClosure*)
(0x10, 0xb6460, 0xfe27f638, 0xfe27fac4, 0xfee9a170, 0xff1c7c38)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#11 0xfed93614 in void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterM
ap*,OopClosure*)
(0xfe27f628, 0xf9e496c8, 0xfe27f638, 0xfe27fac4, 0x3ee42c, 0xfed5ac90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#12 0xfed5acd4 in void frame::oops_do(OopClosure*,RegisterMap*)
(0xfe27f628, 0xfe27fac4, 0xfe27f638, 0x1, 0x1, 0xff180000)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#13 0xfeda25cc in void JavaThread::oops_do(OopClosure*)
(0x1ca808, 0xfe27fac4, 0x0, 0xf5800000, 0x34cc94, 0xffffff90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#14 0xfee2744c in void Threads::oops_do(OopClosure*)
(0xfe27fac4, 0xfe27fac4, 0xfe27fb28, 0xff180000, 0xfee177b4, 0xfe27fd28)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#15 0xfee265b0 in void GenCollectedHeap::process_strong_roots(int,int,int,GenCol
lectedHeap::ClassScanningOption,OopsInGenClosure*,OopsInGenClosure*)
(0xff180000, 0xfe27fac4, 0x1, 0x0, 0x1, 0xfe27faa0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#16 0xfee3aac0 in void DefNewGeneration::collect(int,int,unsigned,int,int)
(0xb63d0, 0x4c00, 0x4dd4, 0xfe27faa0, 0x9fe58, 0xff1bd8e0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#17 0xfee325c8 in void GenCollectedHeap::do_collection(int,int,unsigned,int,int,
int,int&) (0x22, 0xff1bf7ec, 0x0, 0x0, 0x0, 0xff180000)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#18 0xfee3b1a4 in HeapWord*TwoGenerationCollectorPolicy::satisfy_failed_allocati
on(unsigned,int,int,int&)
(0x9fe58, 0x5, 0xff1bf7ec, 0x0, 0xc59ff10c, 0xffffff90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#19 0xfee3aef8 in void VM_GenCollectForAllocation::doit()
(0xc59ff0f0, 0x92224cb2, 0x0, 0xff180000, 0x4337d7a1, 0xfe27fd28)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#20 0xfee2edb4 in void VM_Operation::evaluate()
(0xc59ff0f0, 0x4800, 0xff180000, 0x36820, 0x4b4418, 0xfede287c)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#21 0xfee2e7d4 in void VMThread::evaluate_operation(VM_Operation*)
(0xec390, 0xc59ff0f0, 0x5400, 0x55a4, 0x5400, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#22 0xfeef32cc in void VMThread::loop()
(0x4c00, 0x4400, 0x47d4, 0x4400, 0x475c, 0x3c00)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#23 0xfeef2dc8 in void VMThread::run() (0xec390, 0x2, 0x40, 0x0, 0x40, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#24 0xfee66564 in _start (0xec390, 0x0, 0x0, 0x0, 0x0, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
---------------------------------------------------------
The crash point seems the following part of hotspot source code.
src/share/vm/memory/genOopClosures.inline.hpp:
===================
void FastScanClosure::do_oop(oop* p) {
oop obj = *p;
........
===================
According to the gdb tools,
---------------------------------------------------------
(gdb) f 9
#9 0xfeccb838 in void FastScanClosure::do_oop(oopDesc**)
(0xfe27fac4, 0xc5aff2d4, 0xfe27f638, 0x42b0ed8, 0x18, 0x459154)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
(gdb) x/10i 0xfeccb838-36
0xfeccb814 <void FastScanClosure::do_oop(oopDesc**)>: save %sp, -96, %sp
0xfeccb818 <void FastScanClosure::do_oop(oopDesc**)+4>: ld [ %i1 ], %g5
0xfeccb81c <void FastScanClosure::do_oop(oopDesc**)+8>: cmp %g5, 0
0xfeccb820 <void FastScanClosure::do_oop(oopDesc**)+12>:be %icc, 0xfeccb8a8
<void FastScanClosure::do_oop(oopDesc**)+148>
0xfeccb824 <void FastScanClosure::do_oop(oopDesc**)+16>:nop
0xfeccb828 <void FastScanClosure::do_oop(oopDesc**)+20>:ld [ %i0 + 0x1c ], %g2
0xfeccb82c <void FastScanClosure::do_oop(oopDesc**)+24>:cmp %g5, %g2
0xfeccb830 <void FastScanClosure::do_oop(oopDesc**)+28>:bcc %icc, 0xfeccb8a8
<void FastScanClosure::do_oop(oopDesc**)+148>
0xfeccb834 <void FastScanClosure::do_oop(oopDesc**)+32>:nop
0xfeccb838 <void FastScanClosure::do_oop(oopDesc**)+36>:ld [ %g5 ], %g2
(gdb) p/x $i1
$4 = 0xc5aff2d4
(gdb) x 0xc5aff2d4
0xc5aff2d4: 0x0000092e
----------------------------------------------------------
It shows that incorrect 1st argument for FastScanClosure::do_oop(), *p is not oop.
The 1st argument of FastScanClosure::do_oop() is set at the following part
in caller oopMap.cpp.
src/share/vm/compiler/oopMap.cpp:
===================
for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) {
omv = oms.current();
oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
if ( loc != NULL ) {
if ( omv.type() == OopMapValue::oop_value ) {
...........
oop_fn->do_oop(loc);
} else if ( omv.type() == OopMapValue::value_value ) {
value_fn->do_oop(loc);
} else if ( omv.type() == OopMapValue::dead_value ) {
dead_fn->do_oop(loc);
}
}
---------------------------------------------------------
Here, CodeBLob is a method, A.class1::method65 and compiled in OSR.
---------------------------------------------------------
(gdb) f 11
#11 0xfed93614 in void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,OopClosure*)
(0xfe27f628, 0xf9e496c8, 0xfe27f638, 0xfe27fac4, 0x3ee42c, 0xfed5ac90)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
(gdb) x/6i 0xfed93614-24
0xfed935fc <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+48>: mov %i1, %o1 <-------- CodeBlob
0xfed93600 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+52>: mov %i2, %o2
0xfed93604 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+56>: st %g2, [ %sp + 0x5c ]
0xfed93608 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+60>: mov %i3, %o3
0xfed9360c <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+64>: call 0xfed92d7c <void OopMapSet::all_do(const frame*,CodeBlob*,
const RegisterMap*,OopClosure*,void(*)(oopDesc**,oopDesc**),OopClosure*,OopClosure*)>
0xfed93610 <void OopMapSet::oops_do(const frame*,CodeBlob*,const RegisterMap*,Oo
pClosure*)+68>: mov %g2, %o5
(gdb) p/x $i1
$10 = 0xf9e496c8
(gdb) x/28x 0xf9e496c8 (CodeBlob)
0xf9e496c8: 0xff1c75c0 0x00002604 0x000000a8 0x00000154
0xf9e496d8: 0x00000218 0x00000fb0 0x00002518 0x0000003b
0xf9e496e8: 0x00000084 0xfffffffe 0x042b0a78 0xf59ed848
0xf9e496f8: 0xe4052108 0x00000a3f 0x00000000 0x00000ee4
0xf9e49708: 0x00000ef8 0x00000fb0 0x0000242c 0x00002484
0xf9e49718: 0x00002504 0x00002518 0x00000001 0x00000012
0xf9e49728: 0x7ff7ad06 0x01000000 0x00000002 0xf9e498e0
~~_compile_id
(gdb) x 0xff1c75c0
0xff1c75c0 <nmethod::__vtbl>: 0xff1610a0
--------------------------------------------------------------
CodeBlob is nmethod, and the method of which _compile_id is 2 is A.class1::method65.
Actually, SIGBUS occurs just after this method has been compiled.
Output by PrintCompilation :
........
2%s!b A.class1::method65 @ 2623 (8183 bytes)
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGBUS (0xa) at pc=0xfeccb838, pid=18584, tid=2
---------------------------------------------------------
When SIGBUS occurs, JavaThread is placed at 0xff1764d4.
---------------------------------------------------------
(gdb) f 14
#14 0xfee2744c in void Threads::oops_do(OopClosure*)
(0xfe27fac4, 0xfe27fac4, 0xfe27fb28, 0xff180000, 0xfee177b4, 0xfe27fd28)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
(gdb) x/6i 0xfee2744c-20
0xfee27438 <void Threads::oops_do(OopClosure*)+36>: cmp %l1, 0
0xfee2743c <void Threads::oops_do(OopClosure*)+40>: be,pn %icc, 0xfee2745c
<void Threads::oops_do(OopClosure*)+72>
0xfee27440 <void Threads::oops_do(OopClosure*)+44>: mov %l1, %o0 <-- JavaThread
0xfee27444 <void Threads::oops_do(OopClosure*)+48>: call 0xfeda2488
<void JavaThread::oops_do(OopClosure*)>
0xfee27448 <void Threads::oops_do(OopClosure*)+52>: mov %i0, %o1
0xfee2744c <void Threads::oops_do(OopClosure*)+56>: ld [ %l1 + 0x80 ], %l1
(gdb) p/x $l1
$11 = 0x1ca808
(gdb) x/8 0x1ca808
0x1ca808: 0xff1cc414 0x00000000 0x00000000 0x00000000
0x1ca818: 0x00000000 0x001c8b30 0x00000000 0x00000000
(gdb) x 0xff1cc414
0xff1cc414 <JavaThread::__vtbl>: 0xff1764d4
---------------------------------------------------------
This JavaThread is corresponding to number 10 thread in the following message list.
---------------------------------------------------------
(gdb) t 10
[Switching to thread 10 (thread 11 (ff351400) lwp 11)]
#0 0xff31f954 in ___lwp_mutex_lock
(0x36858, 0x1, 0x1ca808, 0xc5afebe0, 0xf58005a8, 0x0)
from /usr/lib/libc.so.1
(gdb) bt
#0 0xff31f954 in ___lwp_mutex_lock
(0x36858, 0x1, 0x1ca808, 0xc5afebe0, 0xf58005a8, 0x0)
from /usr/lib/libc.so.1
#1 0xfeccc5f8 in void Mutex::lock_without_safepoint_check()
(0x36858, 0x1, 0x1ca808, 0xc5afebe0, 0xf58005a8, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#2 0xfedb6580 in void SafepointSynchronize::block(JavaThread*)
(0x1ca808, 0x1, 0x1ca808, 0x368f0, 0x4b4418, 0xc5afecd0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#3 0xfed95dd8 in int Monitor::wait(int,long)
(0x36928, 0x0, 0x0, 0x4400, 0x4624, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#4 0xfee2eb34 in void VMThread::execute(VM_Operation*)
(0x49b4, 0x1ca808, 0xc5aff158, 0xff1d3688, 0xff180000, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#5 0xfee7da58 in Deoptimization::UnrollBlock*Deoptimization::uncommon_trap(Java
Thread*,int)
(0x1ca808, 0xfffffff5, 0xfffffff5, 0xff180000, 0x3c3a1, 0x1abbd030)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#6 0xf9c32e24 in UncommonTrapBlob
(0xfffffff5, 0x2e176ca0, 0x3fce1d08, 0xd5de8180, 0xf58005a8, 0xf5ac9188)
#7 0xf9e4a4e4 in A.class1::method65(S)S
(0x0, 0xc655dac8, 0xc655dab8, 0xc655daa8, 0xc656d870, 0xc655d9d0)
#8 0xf9d07f40 in OSRAdapter
(0xc5aff6dc, 0xb6, 0xf5d814ac, 0xf9c14120, 0x4, 0xc5aff370)
#9 0xf9c05734 in return entry points
(0xc5aff848, 0x0, 0x0, 0xf9c15e98, 0x8, 0xc5aff650)
#10 0xf9c8d9d8 in C2I Adapter
(0xc64e4588, 0xffffef2a, 0x0, 0xffffef29, 0x1c, 0xc5aff7f0)
#11 0xfa77bba4 in A.class6::method239
(0xef280000, 0xd6095370, 0x1, 0xd60ca350, 0xc64e49a0, 0x1ca808)
#12 0xf9d4955c in A.Driver::run
(0xd60ca600, 0x1c, 0x10, 0xd60c9b00, 0xd60c9bb8, 0xd60c9c08)
#13 0xf9d152f8 in java.lang.Thread::run
(0xc6434ac0, 0x0, 0x0, 0x0, 0x0, 0x0)
#14 0xf9c492c8 in I2C Adapter
(0xc5affba0, 0x0, 0x0, 0x0, 0x477138, 0xfed0d564)
#15 0xf9c00114 in StubRoutines::call_stub
(0xc5affc28, 0xc5affe90, 0xa, 0xf5821ca0, 0x4, 0xc5affb40)
#16 0xfed5db74 in void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallA
rguments*,Thread*)
(0xc5affe88, 0xc5affcf0, 0xc5affda8, 0x1ca808, 0x1ca808, 0xc5affd00)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#17 0xfee4c4cc in void JavaCalls::call_virtual(JavaValue*,KlassHandle,symbolHand
le,symbolHandle,JavaCallArguments*,Thread*)
(0xff180000, 0xf9078, 0xc5affd9c, 0xc5affd98, 0xc5affda8, 0x1ca808)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#18 0xfee5f728 in void JavaCalls::call_virtual(JavaValue*,Handle,KlassHandle,sym
bolHandle,symbolHandle,Thread*)
(0xc5affe88, 0xc5affe84, 0xc5affe7c, 0xc5affe74, 0xc5affe6c, 0x1ca808)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#19 0xfee709ac in void thread_entry(JavaThread*,Thread*)
(0x1ca808, 0x1ca808, 0x2e6360, 0xf9078, 0x315f10, 0xfee6a054)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#20 0xfee6a084 in void JavaThread::run() (0x1ca808, 0xb, 0x40, 0x0, 0x40, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
#21 0xfee66564 in _start (0x1ca808, 0x0, 0x0, 0x0, 0x0, 0x0)
from /opt0/j2se/1.4.2_09/jre/lib/sparc/server/libjvm.so
---------------------------------------------------------
OSR seems related to the above trace.