mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-26 21:38:10 +00:00
Merge
This commit is contained in:
commit
6567b83f0d
@ -2945,7 +2945,7 @@ char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info
|
||||
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++;
|
||||
}
|
||||
|
||||
@ -2063,11 +2063,6 @@ void CMSCollector::do_mark_sweep_work(bool clear_all_soft_refs,
|
||||
// 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 @@ CMSPhaseAccounting::CMSPhaseAccounting(CMSCollector *collector,
|
||||
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();
|
||||
|
||||
@ -4095,7 +4095,7 @@ void CMTask::do_marking_step(double time_target_ms,
|
||||
// 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();
|
||||
|
||||
@ -97,7 +97,6 @@ class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
|
||||
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 @@ class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
|
||||
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
|
||||
|
||||
@ -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 @@ inline bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -409,7 +409,7 @@ HeapWord* ParallelScavengeHeap::mem_allocate(
|
||||
// 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);
|
||||
|
||||
@ -948,6 +948,8 @@ void MutableNUMASpace::LGRPSpace::scan_pages(size_t page_size, size_t page_count
|
||||
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);
|
||||
|
||||
@ -620,7 +620,7 @@ HeapWord* GenCollectorPolicy::mem_allocate_work(size_t size,
|
||||
|
||||
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);
|
||||
|
||||
@ -2439,7 +2439,8 @@ void MetaspaceAux::print_on(outputStream* out, Metaspace::MetadataType mdtype) {
|
||||
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
|
||||
|
||||
@ -885,6 +885,8 @@ ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
|
||||
// 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);
|
||||
|
||||
@ -1381,6 +1381,40 @@ bool Arguments::should_auto_select_low_pause_collector() {
|
||||
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 @@ void Arguments::set_ergonomics_flags() {
|
||||
|
||||
#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_gcs() {
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
|
||||
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
|
||||
|
||||
@ -309,6 +309,7 @@ class Arguments : AllStatic {
|
||||
// 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 @@ class Arguments : AllStatic {
|
||||
// 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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user