# HG changeset patch # User stefank # Date 1363347545 25200 # Node ID a10dc1469c3fe9550643a9d035ff55c24020c590 # Parent fba788946616e11106cda3f0af852c89d9650a38# Parent 15401203db6b15a0d7ed6e2296a6c48e049091c7 Merge diff -r fba788946616 -r a10dc1469c3f src/os/solaris/vm/os_solaris.cpp --- a/src/os/solaris/vm/os_solaris.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/os/solaris/vm/os_solaris.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -2945,7 +2945,7 @@ while (p < (uint64_t)end) { addrs[0] = p; size_t addrs_count = 1; - while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] < (uint64_t)end) { + while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] + page_size < (uint64_t)end) { addrs[addrs_count] = addrs[addrs_count - 1] + page_size; addrs_count++; } diff -r fba788946616 -r a10dc1469c3f src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp --- a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -2063,11 +2063,6 @@ // required. _collectorState = FinalMarking; } - if (PrintGCDetails && - (_collectorState > Idling || - !GCCause::is_user_requested_gc(GenCollectedHeap::heap()->gc_cause()))) { - gclog_or_tty->print(" (concurrent mode failure)"); - } collect_in_foreground(clear_all_soft_refs); // For a mark-sweep, compute_new_size() will be called @@ -3400,10 +3395,10 @@ if (PrintCMSStatistics != 0) { _collector->resetYields(); } - if (PrintGCDetails && PrintGCTimeStamps) { + if (PrintGCDetails) { gclog_or_tty->date_stamp(PrintGCDateStamps); - gclog_or_tty->stamp(); - gclog_or_tty->print_cr(": [%s-concurrent-%s-start]", + gclog_or_tty->stamp(PrintGCTimeStamps); + gclog_or_tty->print_cr("[%s-concurrent-%s-start]", _collector->cmsGen()->short_name(), _phase); } _collector->resetTimer(); diff -r fba788946616 -r a10dc1469c3f src/share/vm/gc_implementation/g1/concurrentMark.cpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -4095,7 +4095,7 @@ // bitmap knows by how much we need to move it as it knows its // granularity). assert(_finger < _region_limit, "invariant"); - HeapWord* new_finger = _nextMarkBitMap->nextWord(_finger); + HeapWord* new_finger = _nextMarkBitMap->nextObject(_finger); // Check if bitmap iteration was aborted while scanning the last object if (new_finger >= _region_limit) { giveup_current_region(); diff -r fba788946616 -r a10dc1469c3f src/share/vm/gc_implementation/g1/concurrentMark.hpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.hpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.hpp Fri Mar 15 04:39:05 2013 -0700 @@ -97,7 +97,6 @@ HeapWord* limit = NULL) const; // conversion utilities - // XXX Fix these so that offsets are size_t's... HeapWord* offsetToHeapWord(size_t offset) const { return _bmStartWord + (offset << _shifter); } @@ -105,8 +104,13 @@ return pointer_delta(addr, _bmStartWord) >> _shifter; } int heapWordDiffToOffsetDiff(size_t diff) const; - HeapWord* nextWord(HeapWord* addr) { - return offsetToHeapWord(heapWordToOffset(addr) + 1); + + // The argument addr should be the start address of a valid object + HeapWord* nextObject(HeapWord* addr) { + oop obj = (oop) addr; + HeapWord* res = addr + obj->size(); + assert(offsetToHeapWord(heapWordToOffset(res)) == res, "sanity"); + return res; } // debugging diff -r fba788946616 -r a10dc1469c3f src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Fri Mar 15 04:39:05 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2013, 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 @@ -252,12 +252,10 @@ start_offset = _bm.get_next_one_offset(start_offset, end_offset); while (start_offset < end_offset) { - HeapWord* obj_addr = offsetToHeapWord(start_offset); - oop obj = (oop) obj_addr; if (!cl->do_bit(start_offset)) { return false; } - HeapWord* next_addr = MIN2(obj_addr + obj->size(), end_addr); + HeapWord* next_addr = MIN2(nextObject(offsetToHeapWord(start_offset)), end_addr); BitMap::idx_t next_offset = heapWordToOffset(next_addr); start_offset = _bm.get_next_one_offset(next_offset, end_offset); } diff -r fba788946616 -r a10dc1469c3f src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -409,7 +409,7 @@ // heap remains parsable. const bool limit_exceeded = size_policy()->gc_overhead_limit_exceeded(); const bool softrefs_clear = collector_policy()->all_soft_refs_clear(); - assert(!limit_exceeded || softrefs_clear, "Should have been cleared"); + if (limit_exceeded && softrefs_clear) { *gc_overhead_limit_was_exceeded = true; size_policy()->set_gc_overhead_limit_exceeded(false); diff -r fba788946616 -r a10dc1469c3f src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp --- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -948,6 +948,8 @@ break; } if (e != scan_end) { + assert(e < scan_end, err_msg("e: " PTR_FORMAT " scan_end: " PTR_FORMAT, e, scan_end)); + if ((page_expected.size != page_size || page_expected.lgrp_id != lgrp_id()) && page_expected.size != 0) { os::free_memory(s, pointer_delta(e, s, sizeof(char)), page_size); diff -r fba788946616 -r a10dc1469c3f src/share/vm/memory/collectorPolicy.cpp --- a/src/share/vm/memory/collectorPolicy.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/memory/collectorPolicy.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -620,7 +620,7 @@ const bool limit_exceeded = size_policy()->gc_overhead_limit_exceeded(); const bool softrefs_clear = all_soft_refs_clear(); - assert(!limit_exceeded || softrefs_clear, "Should have been cleared"); + if (limit_exceeded && softrefs_clear) { *gc_overhead_limit_was_exceeded = true; size_policy()->set_gc_overhead_limit_exceeded(false); diff -r fba788946616 -r a10dc1469c3f src/share/vm/memory/metaspace.cpp --- a/src/share/vm/memory/metaspace.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/memory/metaspace.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -2439,7 +2439,8 @@ free_chunks_capacity_bytes / K, used_and_free / K, capacity_bytes / K); - assert(used_and_free == capacity_bytes, "Accounting is wrong"); + // Accounting can only be correct if we got the values during a safepoint + assert(!SafepointSynchronize::is_at_safepoint() || used_and_free == capacity_bytes, "Accounting is wrong"); } // Print total fragmentation for class and data metaspaces separately diff -r fba788946616 -r a10dc1469c3f src/share/vm/memory/universe.cpp --- a/src/share/vm/memory/universe.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/memory/universe.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -885,6 +885,8 @@ // the actual alignment depends on its size. Universe::set_class_metaspace_size(align_size_up(ClassMetaspaceSize, alignment)); size_t total_reserved = align_size_up(heap_size + Universe::class_metaspace_size(), alignment); + assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())), + "heap size is too big for compressed oops"); char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop); ReservedHeapSpace total_rs(total_reserved, alignment, UseLargePages, addr); diff -r fba788946616 -r a10dc1469c3f src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/runtime/arguments.cpp Fri Mar 15 04:39:05 2013 -0700 @@ -1381,6 +1381,40 @@ return false; } +void Arguments::set_use_compressed_oops() { +#ifndef ZERO +#ifdef _LP64 + // MaxHeapSize is not set up properly at this point, but + // the only value that can override MaxHeapSize if we are + // to use UseCompressedOops is InitialHeapSize. + size_t max_heap_size = MAX2(MaxHeapSize, InitialHeapSize); + + if (max_heap_size <= max_heap_for_compressed_oops()) { +#if !defined(COMPILER1) || defined(TIERED) + if (FLAG_IS_DEFAULT(UseCompressedOops)) { + FLAG_SET_ERGO(bool, UseCompressedOops, true); + } +#endif +#ifdef _WIN64 + if (UseLargePages && UseCompressedOops) { + // Cannot allocate guard pages for implicit checks in indexed addressing + // mode, when large pages are specified on windows. + // This flag could be switched ON if narrow oop base address is set to 0, + // see code in Universe::initialize_heap(). + Universe::set_narrow_oop_use_implicit_null_checks(false); + } +#endif // _WIN64 + } else { + if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) { + warning("Max heap size too large for Compressed Oops"); + FLAG_SET_DEFAULT(UseCompressedOops, false); + FLAG_SET_DEFAULT(UseCompressedKlassPointers, false); + } + } +#endif // _LP64 +#endif // ZERO +} + void Arguments::set_ergonomics_flags() { if (os::is_server_class_machine()) { @@ -1410,30 +1444,7 @@ #ifndef ZERO #ifdef _LP64 - // Check that UseCompressedOops can be set with the max heap size allocated - // by ergonomics. - if (MaxHeapSize <= max_heap_for_compressed_oops()) { -#if !defined(COMPILER1) || defined(TIERED) - if (FLAG_IS_DEFAULT(UseCompressedOops)) { - FLAG_SET_ERGO(bool, UseCompressedOops, true); - } -#endif -#ifdef _WIN64 - if (UseLargePages && UseCompressedOops) { - // Cannot allocate guard pages for implicit checks in indexed addressing - // mode, when large pages are specified on windows. - // This flag could be switched ON if narrow oop base address is set to 0, - // see code in Universe::initialize_heap(). - Universe::set_narrow_oop_use_implicit_null_checks(false); - } -#endif // _WIN64 - } else { - if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) { - warning("Max heap size too large for Compressed Oops"); - FLAG_SET_DEFAULT(UseCompressedOops, false); - FLAG_SET_DEFAULT(UseCompressedKlassPointers, false); - } - } + set_use_compressed_oops(); // UseCompressedOops must be on for UseCompressedKlassPointers to be on. if (!UseCompressedOops) { if (UseCompressedKlassPointers) { @@ -1813,6 +1824,13 @@ } } +void Arguments::check_deprecated_gc_flags() { + if (FLAG_IS_CMDLINE(MaxGCMinorPauseMillis)) { + warning("Using MaxGCMinorPauseMillis as minor pause goal is deprecated" + "and will likely be removed in future release"); + } +} + // Check stack pages settings bool Arguments::check_stack_pages() { @@ -3305,6 +3323,7 @@ set_g1_gc_flags(); } check_deprecated_gcs(); + check_deprecated_gc_flags(); #else // INCLUDE_ALL_GCS assert(verify_serial_gc_flags(), "SerialGC unset"); #endif // INCLUDE_ALL_GCS diff -r fba788946616 -r a10dc1469c3f src/share/vm/runtime/arguments.hpp --- a/src/share/vm/runtime/arguments.hpp Thu Mar 14 16:16:05 2013 -0700 +++ b/src/share/vm/runtime/arguments.hpp Fri Mar 15 04:39:05 2013 -0700 @@ -309,6 +309,7 @@ // Garbage-First (UseG1GC) static void set_g1_gc_flags(); // GC ergonomics + static void set_use_compressed_oops(); static void set_ergonomics_flags(); static void set_shared_spaces_flags(); // Setup heap size @@ -414,6 +415,7 @@ // Check for consistency in the selection of the garbage collector. static bool check_gc_consistency(); static void check_deprecated_gcs(); + static void check_deprecated_gc_flags(); // Check consistecy or otherwise of VM argument settings static bool check_vm_args_consistency(); // Check stack pages settings