# HG changeset patch # User acorn # Date 1284473727 14400 # Node ID 9c661dcab7d9262b80a1f35d59e50e15b8fb3172 # Parent 34dd26dce221c4926a7431e30cc6a55232d027fe# Parent 23c019f5aef43755b0823f10135aa0dafaf6d318 Merge diff -r 34dd26dce221 -r 9c661dcab7d9 .hgtags --- a/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ 10bc903a228d3a8efdf46fb8c3fcf82a59b88bc5 jdk7-b104 1ce7938efb03224ccc8b3cdd7803eb39e889539c jdk7-b105 6bdae472f77205046703b685eff2ac4f7a0ecf4e jdk7-b106 +439de530aac531a360beedba6e2fe51e17292cc0 jdk7-b107 diff -r 34dd26dce221 -r 9c661dcab7d9 .hgtags-top-repo --- a/.hgtags-top-repo Fri Sep 10 12:36:47 2010 -0400 +++ b/.hgtags-top-repo Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ f8be576feefce0c6695f188ef97ec16b73ad9cfd jdk7-b104 9f96a4269d7727dad68864eaab795eafce270311 jdk7-b105 43096cccf1cee749c2f4e7714ee71f4e9e0f4d7f jdk7-b106 +7d396ad455c3b2f68b0d7094891c5aba7c757a6e jdk7-b107 diff -r 34dd26dce221 -r 9c661dcab7d9 corba/.hgtags --- a/corba/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/corba/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ 9607213481d400ac477183191cc080e1bef6f475 jdk7-b104 6f21b030092fb61244cc8a0aedf8058f7c022b81 jdk7-b105 519daea48888196af76a975a3b31258efa860bad jdk7-b106 +232adb83eae8375439ccff65b6e205ca0da0510d jdk7-b107 diff -r 34dd26dce221 -r 9c661dcab7d9 hotspot/.hgtags --- a/hotspot/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/hotspot/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -114,4 +114,6 @@ 1b81ca701fa5fc30adc4cfdaa4bdd153df5e6c86 jdk7-b106 cc3fdfeb54b049f18edcf3463e6ab051d0b7b609 hs19-b05 688a538aa65412178286ae2a6b0c00b6711e121b hs19-b06 +bf496cbe9b74dda5975a1559da7ecfdd313e509e jdk7-b107 0000000000000000000000000000000000000000 hs19-b06 +6c43216df13513a0f96532aa06f213066c49e27b hs19-b06 diff -r 34dd26dce221 -r 9c661dcab7d9 hotspot/make/hotspot_version --- a/hotspot/make/hotspot_version Fri Sep 10 12:36:47 2010 -0400 +++ b/hotspot/make/hotspot_version Tue Sep 14 10:15:27 2010 -0400 @@ -33,9 +33,9 @@ # Don't put quotes (fail windows build). HOTSPOT_VM_COPYRIGHT=Copyright 2010 -HS_MAJOR_VER=19 +HS_MAJOR_VER=20 HS_MINOR_VER=0 -HS_BUILD_NUMBER=06 +HS_BUILD_NUMBER=01 JDK_MAJOR_VER=1 JDK_MINOR_VER=7 diff -r 34dd26dce221 -r 9c661dcab7d9 hotspot/src/share/vm/services/heapDumper.cpp --- a/hotspot/src/share/vm/services/heapDumper.cpp Fri Sep 10 12:36:47 2010 -0400 +++ b/hotspot/src/share/vm/services/heapDumper.cpp Tue Sep 14 10:15:27 2010 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1305,6 +1305,8 @@ static VM_HeapDumper* _global_dumper; static DumpWriter* _global_writer; DumpWriter* _local_writer; + JavaThread* _oome_thread; + methodOop _oome_constructor; bool _gc_before_heap_dump; bool _is_segmented_dump; jlong _dump_start; @@ -1366,7 +1368,7 @@ void end_of_dump(); public: - VM_HeapDumper(DumpWriter* writer, bool gc_before_heap_dump) : + VM_HeapDumper(DumpWriter* writer, bool gc_before_heap_dump, bool oome) : VM_GC_Operation(0 /* total collections, dummy, ignored */, 0 /* total full collections, dummy, ignored */, gc_before_heap_dump) { @@ -1377,6 +1379,18 @@ _klass_map = new (ResourceObj::C_HEAP) GrowableArray(INITIAL_CLASS_COUNT, true); _stack_traces = NULL; _num_threads = 0; + if (oome) { + assert(!Thread::current()->is_VM_thread(), "Dump from OutOfMemoryError cannot be called by the VMThread"); + // get OutOfMemoryError zero-parameter constructor + instanceKlass* oome_ik = instanceKlass::cast(SystemDictionary::OutOfMemoryError_klass()); + _oome_constructor = oome_ik->find_method(vmSymbols::object_initializer_name(), + vmSymbols::void_method_signature()); + // get thread throwing OOME when generating the heap dump at OOME + _oome_thread = JavaThread::current(); + } else { + _oome_thread = NULL; + _oome_constructor = NULL; + } } ~VM_HeapDumper() { if (_stack_traces != NULL) { @@ -1557,7 +1571,11 @@ frame f = java_thread->last_frame(); vframe* vf = vframe::new_vframe(&f, ®_map, java_thread); frame* last_entry_frame = NULL; + int extra_frames = 0; + if (java_thread == _oome_thread && _oome_constructor != NULL) { + extra_frames++; + } while (vf != NULL) { blk.set_frame_number(stack_depth); if (vf->is_java_frame()) { @@ -1574,7 +1592,7 @@ writer()->write_u1(HPROF_GC_ROOT_JAVA_FRAME); writer()->write_objectID(o); writer()->write_u4(thread_serial_num); - writer()->write_u4((u4) stack_depth); + writer()->write_u4((u4) (stack_depth + extra_frames)); } } } @@ -1764,6 +1782,17 @@ // write HPROF_FRAME records for this thread's stack trace int depth = stack_trace->get_stack_depth(); int thread_frame_start = frame_serial_num; + int extra_frames = 0; + // write fake frame that makes it look like the thread, which caused OOME, + // is in the OutOfMemoryError zero-parameter constructor + if (thread == _oome_thread && _oome_constructor != NULL) { + int oome_serial_num = _klass_map->find(Klass::cast(_oome_constructor->method_holder())); + // the class serial number starts from 1 + assert(oome_serial_num > 0, "OutOfMemoryError class not found"); + DumperSupport::dump_stack_frame(writer(), ++frame_serial_num, oome_serial_num, + _oome_constructor, 0); + extra_frames++; + } for (int j=0; j < depth; j++) { StackFrameInfo* frame = stack_trace->stack_frame_at(j); methodOop m = frame->method(); @@ -1772,6 +1801,7 @@ assert(class_serial_num > 0, "class not found"); DumperSupport::dump_stack_frame(writer(), ++frame_serial_num, class_serial_num, m, frame->bci()); } + depth += extra_frames; // write HPROF_TRACE record for one thread DumperSupport::write_header(writer(), HPROF_TRACE, 3*sizeof(u4) + depth*oopSize); @@ -1808,7 +1838,7 @@ } // generate the dump - VM_HeapDumper dumper(&writer, _gc_before_heap_dump); + VM_HeapDumper dumper(&writer, _gc_before_heap_dump, _oome); if (Thread::current()->is_VM_thread()) { assert(SafepointSynchronize::is_at_safepoint(), "Expected to be called at a safepoint"); dumper.doit(); @@ -1869,12 +1899,22 @@ } } +// Called by out-of-memory error reporting by a single Java thread +// outside of a JVM safepoint +void HeapDumper::dump_heap_from_oome() { + HeapDumper::dump_heap(true); +} + // Called by error reporting by a single Java thread outside of a JVM safepoint, // or by heap dumping by the VM thread during a (GC) safepoint. Thus, these various // callers are strictly serialized and guaranteed not to interfere below. For more // general use, however, this method will need modification to prevent // inteference when updating the static variables base_path and dump_file_seq below. void HeapDumper::dump_heap() { + HeapDumper::dump_heap(false); +} + +void HeapDumper::dump_heap(bool oome) { static char base_path[JVM_MAXPATHLEN] = {'\0'}; static uint dump_file_seq = 0; char my_path[JVM_MAXPATHLEN] = {'\0'}; @@ -1930,6 +1970,7 @@ dump_file_seq++; // increment seq number for next time we dump HeapDumper dumper(false /* no GC before heap dump */, - true /* send to tty */); + true /* send to tty */, + oome /* pass along out-of-memory-error flag */); dumper.dump(my_path); } diff -r 34dd26dce221 -r 9c661dcab7d9 hotspot/src/share/vm/services/heapDumper.hpp --- a/hotspot/src/share/vm/services/heapDumper.hpp Fri Sep 10 12:36:47 2010 -0400 +++ b/hotspot/src/share/vm/services/heapDumper.hpp Tue Sep 14 10:15:27 2010 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,8 +39,12 @@ char* _error; bool _print_to_tty; bool _gc_before_heap_dump; + bool _oome; elapsedTimer _t; + HeapDumper(bool gc_before_heap_dump, bool print_to_tty, bool oome) : + _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(print_to_tty), _oome(oome) { } + // string representation of error char* error() const { return _error; } void set_error(char* error); @@ -51,11 +55,11 @@ // internal timer. elapsedTimer* timer() { return &_t; } + static void dump_heap(bool oome); + public: HeapDumper(bool gc_before_heap_dump) : - _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(false) { } - HeapDumper(bool gc_before_heap_dump, bool print_to_tty) : - _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(print_to_tty) { } + _gc_before_heap_dump(gc_before_heap_dump), _error(NULL), _print_to_tty(false), _oome(false) { } ~HeapDumper(); @@ -66,4 +70,6 @@ char* error_as_C_string() const; static void dump_heap() KERNEL_RETURN; + + static void dump_heap_from_oome() KERNEL_RETURN; }; diff -r 34dd26dce221 -r 9c661dcab7d9 hotspot/src/share/vm/utilities/debug.cpp --- a/hotspot/src/share/vm/utilities/debug.cpp Fri Sep 10 12:36:47 2010 -0400 +++ b/hotspot/src/share/vm/utilities/debug.cpp Tue Sep 14 10:15:27 2010 -0400 @@ -234,7 +234,7 @@ // create heap dump before OnOutOfMemoryError commands are executed if (HeapDumpOnOutOfMemoryError) { tty->print_cr("java.lang.OutOfMemoryError: %s", message); - HeapDumper::dump_heap(); + HeapDumper::dump_heap_from_oome(); } if (OnOutOfMemoryError && OnOutOfMemoryError[0]) { diff -r 34dd26dce221 -r 9c661dcab7d9 jaxp/.hgtags --- a/jaxp/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/jaxp/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ d42c4acb6424a094bdafe2ad9c8c1c7ca7fb7b7e jdk7-b104 3233b9a4c12ef2663a356d08bb141c02736c7f49 jdk7-b105 5ba8469212a6cab95ca652eea414b753be7d245a jdk7-b106 +20ee37c1372a3eaefa49b426c6eb68a2e8f5d6e2 jdk7-b107 diff -r 34dd26dce221 -r 9c661dcab7d9 jaxws/.hgtags --- a/jaxws/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/jaxws/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ bbc4cce6c20aeca4862804a6e8315a2350d43633 jdk7-b104 39eb4f3031f4a985664cace00fca3bd1eab1e0aa jdk7-b105 bc45ccc5bcca6cbe4ea433e279d4a93b06ab38c6 jdk7-b106 +017612ea6af417a5e378619704da01bb3a583bdb jdk7-b107 diff -r 34dd26dce221 -r 9c661dcab7d9 jdk/.hgtags --- a/jdk/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/jdk/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ 1a92820132a0221c5bdedd42d0888c57ce4cbb34 jdk7-b104 3b0abcb512807bb6f6d27755bc50103211bde6ee jdk7-b105 b91ef6b60f4e19bf4592c6dd594c9bac62487519 jdk7-b106 +882103f334bb23745d3fd70fb7928c347478b0f4 jdk7-b107 diff -r 34dd26dce221 -r 9c661dcab7d9 langtools/.hgtags --- a/langtools/.hgtags Fri Sep 10 12:36:47 2010 -0400 +++ b/langtools/.hgtags Tue Sep 14 10:15:27 2010 -0400 @@ -81,3 +81,4 @@ fc7219517ec16b28d729d259020a25b05ffdf0b6 jdk7-b104 aaecac256d39c7cb536e70d20ddd833fc118e43a jdk7-b105 112fcc00659dda1a356ec75d964584e4dae0228f jdk7-b106 +2c1c657f69a4ff608a43e1ac61baf3294cd55797 jdk7-b107