--- a/hotspot/make/bsd/makefiles/adjust-mflags.sh Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/make/bsd/makefiles/adjust-mflags.sh Sun Feb 02 15:31:40 2014 -0500
@@ -64,7 +64,7 @@
echo "$MFLAGS" \
| sed '
s/^-/ -/
- s/ -\([^ ][^ ]*\)j/ -\1 -j/
+ s/ -\([^ I][^ I]*\)j/ -\1 -j/
s/ -j[0-9][0-9]*/ -j/
s/ -j\([^ ]\)/ -j -\1/
s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/
--- a/hotspot/make/linux/makefiles/adjust-mflags.sh Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/make/linux/makefiles/adjust-mflags.sh Sun Feb 02 15:31:40 2014 -0500
@@ -64,7 +64,7 @@
echo "$MFLAGS" \
| sed '
s/^-/ -/
- s/ -\([^ ][^ ]*\)j/ -\1 -j/
+ s/ -\([^ I][^ I]*\)j/ -\1 -j/
s/ -j[0-9][0-9]*/ -j/
s/ -j\([^ ]\)/ -j -\1/
s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/
--- a/hotspot/make/solaris/makefiles/adjust-mflags.sh Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/make/solaris/makefiles/adjust-mflags.sh Sun Feb 02 15:31:40 2014 -0500
@@ -64,7 +64,7 @@
echo "$MFLAGS" \
| sed '
s/^-/ -/
- s/ -\([^ ][^ ]*\)j/ -\1 -j/
+ s/ -\([^ I][^ I]*\)j/ -\1 -j/
s/ -j[0-9][0-9]*/ -j/
s/ -j\([^ ]\)/ -j -\1/
s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Sun Feb 02 15:31:40 2014 -0500
@@ -3361,8 +3361,8 @@
interface(CONST_INTER);
%}
-// Unsigned (positive) Integer Immediate: 13-bit
-operand immU13() %{
+// Unsigned Integer Immediate: 12-bit (non-negative that fits in simm13)
+operand immU12() %{
predicate((0 <= n->get_int()) && Assembler::is_simm13(n->get_int()));
match(ConI);
op_cost(0);
@@ -3398,6 +3398,17 @@
interface(CONST_INTER);
%}
+// Int Immediate non-negative
+operand immU31()
+%{
+ predicate(n->get_int() >= 0);
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Integer Immediate: 0-bit
operand immI0() %{
predicate(n->get_int() == 0);
@@ -5726,7 +5737,6 @@
effect(TEMP dst, TEMP tmp);
ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST);
- size((3+1)*4); // set may use two instructions.
format %{ "LDUH $mem,$dst\t! ushort/char & 16-bit mask -> long\n\t"
"SET $mask,$tmp\n\t"
"AND $dst,$tmp,$dst" %}
@@ -5848,13 +5858,13 @@
ins_pipe(iload_mem);
%}
-// Load Integer with a 13-bit mask into a Long Register
-instruct loadI2L_immI13(iRegL dst, memory mem, immI13 mask) %{
+// Load Integer with a 12-bit mask into a Long Register
+instruct loadI2L_immU12(iRegL dst, memory mem, immU12 mask) %{
match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
ins_cost(MEMORY_REF_COST + DEFAULT_COST);
size(2*4);
- format %{ "LDUW $mem,$dst\t! int & 13-bit mask -> long\n\t"
+ format %{ "LDUW $mem,$dst\t! int & 12-bit mask -> long\n\t"
"AND $dst,$mask,$dst" %}
ins_encode %{
Register Rdst = $dst$$Register;
@@ -5864,14 +5874,13 @@
ins_pipe(iload_mem);
%}
-// Load Integer with a 32-bit mask into a Long Register
-instruct loadI2L_immI(iRegL dst, memory mem, immI mask, iRegL tmp) %{
+// Load Integer with a 31-bit mask into a Long Register
+instruct loadI2L_immU31(iRegL dst, memory mem, immU31 mask, iRegL tmp) %{
match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
effect(TEMP dst, TEMP tmp);
ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST);
- size((3+1)*4); // set may use two instructions.
- format %{ "LDUW $mem,$dst\t! int & 32-bit mask -> long\n\t"
+ format %{ "LDUW $mem,$dst\t! int & 31-bit mask -> long\n\t"
"SET $mask,$tmp\n\t"
"AND $dst,$tmp,$dst" %}
ins_encode %{
@@ -8966,7 +8975,7 @@
ins_pipe(ialu_cconly_reg_reg);
%}
-instruct compU_iReg_imm13(flagsRegU icc, iRegI op1, immU13 op2 ) %{
+instruct compU_iReg_imm13(flagsRegU icc, iRegI op1, immU12 op2 ) %{
match(Set icc (CmpU op1 op2));
size(4);
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -49,7 +49,8 @@
M_family = 15,
T_family = 16,
T1_model = 17,
- aes_instructions = 18
+ sparc5_instructions = 18,
+ aes_instructions = 19
};
enum Feature_Flag_Set {
@@ -74,6 +75,7 @@
M_family_m = 1 << M_family,
T_family_m = 1 << T_family,
T1_model_m = 1 << T1_model,
+ sparc5_instructions_m = 1 << sparc5_instructions,
aes_instructions_m = 1 << aes_instructions,
generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m,
@@ -125,6 +127,7 @@
static bool has_vis3() { return (_features & vis3_instructions_m) != 0; }
static bool has_blk_init() { return (_features & blk_init_instructions_m) != 0; }
static bool has_cbcond() { return (_features & cbcond_instructions_m) != 0; }
+ static bool has_sparc5_instr() { return (_features & sparc5_instructions_m) != 0; }
static bool has_aes() { return (_features & aes_instructions_m) != 0; }
static bool supports_compare_and_exchange()
@@ -136,6 +139,7 @@
static bool is_M_series() { return is_M_family(_features); }
static bool is_T4() { return is_T_family(_features) && has_cbcond(); }
+ static bool is_T7() { return is_T_family(_features) && has_sparc5_instr(); }
// Fujitsu SPARC64
static bool is_sparc64() { return (_features & sparc64_family_m) != 0; }
@@ -155,7 +159,7 @@
static const char* cpu_features() { return _features_str; }
static intx prefetch_data_size() {
- return is_T4() ? 32 : 64; // default prefetch block size on sparc
+ return is_T4() && !is_T7() ? 32 : 64; // default prefetch block size on sparc
}
// Prefetch
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Sun Feb 02 15:31:40 2014 -0500
@@ -3889,6 +3889,17 @@
interface(CONST_INTER);
%}
+// Int Immediate non-negative
+operand immU31()
+%{
+ predicate(n->get_int() >= 0);
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Constant for long shifts
operand immI_32() %{
predicate( n->get_int() == 32 );
@@ -6119,12 +6130,12 @@
ins_pipe(ialu_reg_mem);
%}
-// Load Integer with 32-bit mask into Long Register
-instruct loadI2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
+// Load Integer with 31-bit mask into Long Register
+instruct loadI2L_immU31(eRegL dst, memory mem, immU31 mask, eFlagsReg cr) %{
match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
effect(KILL cr);
- format %{ "MOV $dst.lo,$mem\t# int & 32-bit mask -> long\n\t"
+ format %{ "MOV $dst.lo,$mem\t# int & 31-bit mask -> long\n\t"
"XOR $dst.hi,$dst.hi\n\t"
"AND $dst.lo,$mask" %}
ins_encode %{
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Sun Feb 02 15:31:40 2014 -0500
@@ -3086,6 +3086,17 @@
interface(CONST_INTER);
%}
+// Int Immediate non-negative
+operand immU31()
+%{
+ predicate(n->get_int() >= 0);
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Constant for long shifts
operand immI_32()
%{
@@ -5042,12 +5053,12 @@
ins_pipe(ialu_reg_mem);
%}
-// Load Integer with a 32-bit mask into Long Register
-instruct loadI2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{
+// Load Integer with a 31-bit mask into Long Register
+instruct loadI2L_immU31(rRegL dst, memory mem, immU31 mask, rFlagsReg cr) %{
match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
effect(KILL cr);
- format %{ "movl $dst, $mem\t# int & 32-bit mask -> long\n\t"
+ format %{ "movl $dst, $mem\t# int & 31-bit mask -> long\n\t"
"andl $dst, $mask" %}
ins_encode %{
Register Rdst = $dst$$Register;
--- a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -75,13 +75,19 @@
do_sysinfo(SI_ARCHITECTURE_64, "sparcv9", &features, generic_v9_m);
// Extract valid instruction set extensions.
- uint_t av;
- uint_t avn = os::Solaris::getisax(&av, 1);
- assert(avn == 1, "should only return one av");
+ uint_t avs[2];
+ uint_t avn = os::Solaris::getisax(avs, 2);
+ assert(avn <= 2, "should return two or less av's");
+ uint_t av = avs[0];
#ifndef PRODUCT
- if (PrintMiscellaneous && Verbose)
- tty->print_cr("getisax(2) returned: " PTR32_FORMAT, av);
+ if (PrintMiscellaneous && Verbose) {
+ tty->print("getisax(2) returned: " PTR32_FORMAT, av);
+ if (avn > 1) {
+ tty->print(", " PTR32_FORMAT, avs[1]);
+ }
+ tty->cr();
+ }
#endif
if (av & AV_SPARC_MUL32) features |= hardware_mul32_m;
@@ -91,6 +97,13 @@
if (av & AV_SPARC_POPC) features |= hardware_popc_m;
if (av & AV_SPARC_VIS) features |= vis1_instructions_m;
if (av & AV_SPARC_VIS2) features |= vis2_instructions_m;
+ if (avn > 1) {
+ uint_t av2 = avs[1];
+#ifndef AV2_SPARC_SPARC5
+#define AV2_SPARC_SPARC5 0x00000008 /* The 29 new fp and sub instructions */
+#endif
+ if (av2 & AV2_SPARC_SPARC5) features |= sparc5_instructions_m;
+ }
// Next values are not defined before Solaris 10
// but Solaris 8 is used for jdk6 update builds.
--- a/hotspot/src/share/vm/ci/ciField.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/ci/ciField.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -201,16 +201,10 @@
return;
}
- // This field just may be constant. The only cases where it will
- // not be constant are:
- //
- // 1. The field holds a non-perm-space oop. The field is, strictly
- // speaking, constant but we cannot embed non-perm-space oops into
- // generated code. For the time being we need to consider the
- // field to be not constant.
- // 2. The field is a *special* static&final field whose value
- // may change. The three examples are java.lang.System.in,
- // java.lang.System.out, and java.lang.System.err.
+ // This field just may be constant. The only case where it will
+ // not be constant is when the field is a *special* static&final field
+ // whose value may change. The three examples are java.lang.System.in,
+ // java.lang.System.out, and java.lang.System.err.
KlassHandle k = _holder->get_Klass();
assert( SystemDictionary::System_klass() != NULL, "Check once per vm");
--- a/hotspot/src/share/vm/ci/ciField.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/ci/ciField.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -130,9 +130,7 @@
// 1. The field is both static and final
// 2. The canonical holder of the field has undergone
// static initialization.
- // 3. If the field is an object or array, then the oop
- // in question is allocated in perm space.
- // 4. The field is not one of the special static/final
+ // 3. The field is not one of the special static/final
// non-constant fields. These are java.lang.System.in
// and java.lang.System.out. Abomination.
//
--- a/hotspot/src/share/vm/classfile/symbolTable.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -38,6 +38,9 @@
// --------------------------------------------------------------------------
+// the number of buckets a thread claims
+const int ClaimChunkSize = 32;
+
SymbolTable* SymbolTable::_the_table = NULL;
// Static arena for symbols that are not deallocated
Arena* SymbolTable::_arena = NULL;
@@ -83,16 +86,12 @@
}
}
-int SymbolTable::symbols_removed = 0;
-int SymbolTable::symbols_counted = 0;
+int SymbolTable::_symbols_removed = 0;
+int SymbolTable::_symbols_counted = 0;
+volatile int SymbolTable::_parallel_claimed_idx = 0;
-// Remove unreferenced symbols from the symbol table
-// This is done late during GC.
-void SymbolTable::unlink() {
- int removed = 0;
- int total = 0;
- size_t memory_total = 0;
- for (int i = 0; i < the_table()->table_size(); ++i) {
+void SymbolTable::buckets_unlink(int start_idx, int end_idx, int* processed, int* removed, size_t* memory_total) {
+ for (int i = start_idx; i < end_idx; ++i) {
HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
while (entry != NULL) {
@@ -104,14 +103,14 @@
break;
}
Symbol* s = entry->literal();
- memory_total += s->size();
- total++;
+ (*memory_total) += s->size();
+ (*processed)++;
assert(s != NULL, "just checking");
// If reference count is zero, remove.
if (s->refcount() == 0) {
assert(!entry->is_shared(), "shared entries should be kept live");
delete s;
- removed++;
+ (*removed)++;
*p = entry->next();
the_table()->free_entry(entry);
} else {
@@ -121,12 +120,45 @@
entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
}
}
- symbols_removed += removed;
- symbols_counted += total;
+}
+
+// Remove unreferenced symbols from the symbol table
+// This is done late during GC.
+void SymbolTable::unlink(int* processed, int* removed) {
+ size_t memory_total = 0;
+ buckets_unlink(0, the_table()->table_size(), processed, removed, &memory_total);
+ _symbols_removed += *removed;
+ _symbols_counted += *processed;
// Exclude printing for normal PrintGCDetails because people parse
// this output.
if (PrintGCDetails && Verbose && WizardMode) {
- gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", total,
+ gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", *processed,
+ (memory_total*HeapWordSize)/1024);
+ }
+}
+
+void SymbolTable::possibly_parallel_unlink(int* processed, int* removed) {
+ const int limit = the_table()->table_size();
+
+ size_t memory_total = 0;
+
+ for (;;) {
+ // Grab next set of buckets to scan
+ int start_idx = Atomic::add(ClaimChunkSize, &_parallel_claimed_idx) - ClaimChunkSize;
+ if (start_idx >= limit) {
+ // End of table
+ break;
+ }
+
+ int end_idx = MIN2(limit, start_idx + ClaimChunkSize);
+ buckets_unlink(start_idx, end_idx, processed, removed, &memory_total);
+ }
+ Atomic::add(*processed, &_symbols_counted);
+ Atomic::add(*removed, &_symbols_removed);
+ // Exclude printing for normal PrintGCDetails because people parse
+ // this output.
+ if (PrintGCDetails && Verbose && WizardMode) {
+ gclog_or_tty->print(" [Symbols: scanned=%d removed=%d size=" SIZE_FORMAT "K] ", *processed, *removed,
(memory_total*HeapWordSize)/1024);
}
}
@@ -494,11 +526,11 @@
tty->print_cr("Total number of symbols %5d", count);
tty->print_cr("Total size in memory %5dK",
(memory_total*HeapWordSize)/1024);
- tty->print_cr("Total counted %5d", symbols_counted);
- tty->print_cr("Total removed %5d", symbols_removed);
- if (symbols_counted > 0) {
+ tty->print_cr("Total counted %5d", _symbols_counted);
+ tty->print_cr("Total removed %5d", _symbols_removed);
+ if (_symbols_counted > 0) {
tty->print_cr("Percent removed %3.2f",
- ((float)symbols_removed/(float)symbols_counted)* 100);
+ ((float)_symbols_removed/(float)_symbols_counted)* 100);
}
tty->print_cr("Reference counts %5d", Symbol::_total_count);
tty->print_cr("Symbol arena size %5d used %5d",
@@ -739,39 +771,38 @@
return result;
}
-void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f) {
+void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int* processed, int* removed) {
+ buckets_unlink_or_oops_do(is_alive, f, 0, the_table()->table_size(), processed, removed);
+}
+
+void StringTable::possibly_parallel_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int* processed, int* removed) {
// Readers of the table are unlocked, so we should only be removing
// entries at a safepoint.
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
- for (int i = 0; i < the_table()->table_size(); ++i) {
- HashtableEntry<oop, mtSymbol>** p = the_table()->bucket_addr(i);
- HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
- while (entry != NULL) {
- assert(!entry->is_shared(), "CDS not used for the StringTable");
+ const int limit = the_table()->table_size();
- if (is_alive->do_object_b(entry->literal())) {
- if (f != NULL) {
- f->do_oop((oop*)entry->literal_addr());
- }
- p = entry->next_addr();
- } else {
- *p = entry->next();
- the_table()->free_entry(entry);
- }
- entry = *p;
+ for (;;) {
+ // Grab next set of buckets to scan
+ int start_idx = Atomic::add(ClaimChunkSize, &_parallel_claimed_idx) - ClaimChunkSize;
+ if (start_idx >= limit) {
+ // End of table
+ break;
}
+
+ int end_idx = MIN2(limit, start_idx + ClaimChunkSize);
+ buckets_unlink_or_oops_do(is_alive, f, start_idx, end_idx, processed, removed);
}
}
-void StringTable::buckets_do(OopClosure* f, int start_idx, int end_idx) {
+void StringTable::buckets_oops_do(OopClosure* f, int start_idx, int end_idx) {
const int limit = the_table()->table_size();
assert(0 <= start_idx && start_idx <= limit,
- err_msg("start_idx (" INT32_FORMAT ") oob?", start_idx));
+ err_msg("start_idx (" INT32_FORMAT ") is out of bounds", start_idx));
assert(0 <= end_idx && end_idx <= limit,
- err_msg("end_idx (" INT32_FORMAT ") oob?", end_idx));
+ err_msg("end_idx (" INT32_FORMAT ") is out of bounds", end_idx));
assert(start_idx <= end_idx,
- err_msg("Ordering: start_idx=" INT32_FORMAT", end_idx=" INT32_FORMAT,
+ err_msg("Index ordering: start_idx=" INT32_FORMAT", end_idx=" INT32_FORMAT,
start_idx, end_idx));
for (int i = start_idx; i < end_idx; i += 1) {
@@ -786,12 +817,44 @@
}
}
+void StringTable::buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed) {
+ const int limit = the_table()->table_size();
+
+ assert(0 <= start_idx && start_idx <= limit,
+ err_msg("start_idx (" INT32_FORMAT ") is out of bounds", start_idx));
+ assert(0 <= end_idx && end_idx <= limit,
+ err_msg("end_idx (" INT32_FORMAT ") is out of bounds", end_idx));
+ assert(start_idx <= end_idx,
+ err_msg("Index ordering: start_idx=" INT32_FORMAT", end_idx=" INT32_FORMAT,
+ start_idx, end_idx));
+
+ for (int i = start_idx; i < end_idx; ++i) {
+ HashtableEntry<oop, mtSymbol>** p = the_table()->bucket_addr(i);
+ HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
+ while (entry != NULL) {
+ assert(!entry->is_shared(), "CDS not used for the StringTable");
+
+ if (is_alive->do_object_b(entry->literal())) {
+ if (f != NULL) {
+ f->do_oop((oop*)entry->literal_addr());
+ }
+ p = entry->next_addr();
+ } else {
+ *p = entry->next();
+ the_table()->free_entry(entry);
+ (*removed)++;
+ }
+ (*processed)++;
+ entry = *p;
+ }
+ }
+}
+
void StringTable::oops_do(OopClosure* f) {
- buckets_do(f, 0, the_table()->table_size());
+ buckets_oops_do(f, 0, the_table()->table_size());
}
void StringTable::possibly_parallel_oops_do(OopClosure* f) {
- const int ClaimChunkSize = 32;
const int limit = the_table()->table_size();
for (;;) {
@@ -803,7 +866,7 @@
}
int end_idx = MIN2(limit, start_idx + ClaimChunkSize);
- buckets_do(f, start_idx, end_idx);
+ buckets_oops_do(f, start_idx, end_idx);
}
}
--- a/hotspot/src/share/vm/classfile/symbolTable.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/classfile/symbolTable.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -86,8 +86,8 @@
static bool _needs_rehashing;
// For statistics
- static int symbols_removed;
- static int symbols_counted;
+ static int _symbols_removed;
+ static int _symbols_counted;
Symbol* allocate_symbol(const u1* name, int len, bool c_heap, TRAPS); // Assumes no characters larger than 0x7F
@@ -121,6 +121,11 @@
static Arena* arena() { return _arena; } // called for statistics
static void initialize_symbols(int arena_alloc_size = 0);
+
+ static volatile int _parallel_claimed_idx;
+
+ // Release any dead symbols
+ static void buckets_unlink(int start_idx, int end_idx, int* processed, int* removed, size_t* memory_total);
public:
enum {
symbol_alloc_batch_size = 8,
@@ -177,7 +182,14 @@
unsigned int* hashValues, TRAPS);
// Release any dead symbols
- static void unlink();
+ static void unlink() {
+ int processed = 0;
+ int removed = 0;
+ unlink(&processed, &removed);
+ }
+ static void unlink(int* processed, int* removed);
+ // Release any dead symbols, possibly parallel version
+ static void possibly_parallel_unlink(int* processed, int* removed);
// iterate over symbols
static void symbols_do(SymbolClosure *cl);
@@ -235,6 +247,9 @@
// Rehash the symbol table if it gets out of balance
static void rehash_table();
static bool needs_rehashing() { return _needs_rehashing; }
+ // Parallel chunked scanning
+ static void clear_parallel_claimed_index() { _parallel_claimed_idx = 0; }
+ static int parallel_claimed_index() { return _parallel_claimed_idx; }
};
class StringTable : public Hashtable<oop, mtSymbol> {
@@ -258,7 +273,10 @@
// Apply the give oop closure to the entries to the buckets
// in the range [start_idx, end_idx).
- static void buckets_do(OopClosure* f, int start_idx, int end_idx);
+ static void buckets_oops_do(OopClosure* f, int start_idx, int end_idx);
+ // Unlink or apply the give oop closure to the entries to the buckets
+ // in the range [start_idx, end_idx).
+ static void buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed);
StringTable() : Hashtable<oop, mtSymbol>((int)StringTableSize,
sizeof (HashtableEntry<oop, mtSymbol>)) {}
@@ -280,15 +298,28 @@
// GC support
// Delete pointers to otherwise-unreachable objects.
- static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f);
+ static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f) {
+ int processed = 0;
+ int removed = 0;
+ unlink_or_oops_do(cl, f, &processed, &removed);
+ }
static void unlink(BoolObjectClosure* cl) {
- unlink_or_oops_do(cl, NULL);
+ int processed = 0;
+ int removed = 0;
+ unlink_or_oops_do(cl, NULL, &processed, &removed);
}
-
+ static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f, int* processed, int* removed);
+ static void unlink(BoolObjectClosure* cl, int* processed, int* removed) {
+ unlink_or_oops_do(cl, NULL, processed, removed);
+ }
// Serially invoke "f->do_oop" on the locations of all oops in the table.
static void oops_do(OopClosure* f);
- // Possibly parallel version of the above
+ // Possibly parallel versions of the above
+ static void possibly_parallel_unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f, int* processed, int* removed);
+ static void possibly_parallel_unlink(BoolObjectClosure* cl, int* processed, int* removed) {
+ possibly_parallel_unlink_or_oops_do(cl, NULL, processed, removed);
+ }
static void possibly_parallel_oops_do(OopClosure* f);
// Hashing algorithm, used as the hash value used by the
@@ -349,5 +380,6 @@
// Parallel chunked scanning
static void clear_parallel_claimed_index() { _parallel_claimed_idx = 0; }
+ static int parallel_claimed_index() { return _parallel_claimed_idx; }
};
#endif // SHARE_VM_CLASSFILE_SYMBOLTABLE_HPP
--- a/hotspot/src/share/vm/code/dependencies.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/code/dependencies.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -1221,11 +1221,9 @@
// We could also return false if m does not yet appear to be
// executed, if the VM version supports this distinction also.
+ // Default methods are considered "concrete" as well.
return !m->is_abstract() &&
- !InstanceKlass::cast(m->method_holder())->is_interface();
- // TODO: investigate whether default methods should be
- // considered as "concrete" in this situation. For now they
- // are not.
+ !m->is_overpass(); // error functions aren't concrete
}
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -466,7 +466,7 @@
void CMSAdaptiveSizePolicy::checkpoint_roots_final_begin() {
_STW_timer.stop();
_latest_cms_initial_mark_end_to_remark_start_secs = _STW_timer.seconds();
- // Start accumumlating time for the remark in the STW timer.
+ // Start accumulating time for the remark in the STW timer.
_STW_timer.reset();
_STW_timer.start();
}
@@ -537,8 +537,8 @@
avg_msc_pause()->sample(msc_pause_in_seconds);
double mutator_time_in_seconds = 0.0;
if (_latest_cms_collection_end_to_collection_start_secs == 0.0) {
- // This assertion may fail because of time stamp gradularity.
- // Comment it out and investiage it at a later time. The large
+ // This assertion may fail because of time stamp granularity.
+ // Comment it out and investigate it at a later time. The large
// time stamp granularity occurs on some older linux systems.
#ifndef CLOCK_GRANULARITY_TOO_LARGE
assert((_latest_cms_concurrent_marking_time_secs == 0.0) &&
@@ -836,7 +836,7 @@
void CMSAdaptiveSizePolicy::ms_collection_marking_begin() {
_STW_timer.stop();
- // Start accumumlating time for the marking in the STW timer.
+ // Start accumulating time for the marking in the STW timer.
_STW_timer.reset();
_STW_timer.start();
}
@@ -1227,7 +1227,7 @@
// We use the tenuring threshold to equalize the cost of major
// and minor collections.
// ThresholdTolerance is used to indicate how sensitive the
- // tenuring threshold is to differences in cost betweent the
+ // tenuring threshold is to differences in cost between the
// collection types.
// Get the times of interest. This involves a little work, so
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -356,7 +356,7 @@
void concurrent_sweeping_begin();
void concurrent_sweeping_end();
// Similar to the above (e.g., concurrent_marking_end()) and
- // is used for both the precleaning an abortable precleaing
+ // is used for both the precleaning an abortable precleaning
// phases.
void concurrent_precleaning_begin();
void concurrent_precleaning_end();
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -88,8 +88,7 @@
// of the tenured generation.
PerfVariable* _avg_msc_pause_counter;
// Average for the time between the most recent end of a
- // MSC collection and the beginning of the next
- // MSC collection.
+ // MSC collection and the beginning of the next MSC collection.
PerfVariable* _avg_msc_interval_counter;
// Average for the GC cost of a MSC collection based on
// _avg_msc_pause_counter and _avg_msc_interval_counter.
@@ -99,8 +98,7 @@
// of the tenured generation.
PerfVariable* _avg_ms_pause_counter;
// Average for the time between the most recent end of a
- // MS collection and the beginning of the next
- // MS collection.
+ // MS collection and the beginning of the next MS collection.
PerfVariable* _avg_ms_interval_counter;
// Average for the GC cost of a MS collection based on
// _avg_ms_pause_counter and _avg_ms_interval_counter.
@@ -108,9 +106,9 @@
// Average of the bytes promoted per minor collection.
PerfVariable* _promoted_avg_counter;
- // Average of the deviation of the promoted average
+ // Average of the deviation of the promoted average.
PerfVariable* _promoted_avg_dev_counter;
- // Padded average of the bytes promoted per minor colleciton
+ // Padded average of the bytes promoted per minor collection.
PerfVariable* _promoted_padded_avg_counter;
// See description of the _change_young_gen_for_maj_pauses
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -258,10 +258,10 @@
bool take_from_overflow_list();
};
-// Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
+// In this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
// stack and the bitMap are shared, so access needs to be suitably
-// sycnhronized. An OopTaskQueue structure, supporting efficient
-// workstealing, replaces a CMSMarkStack for storing grey objects.
+// synchronized. An OopTaskQueue structure, supporting efficient
+// work stealing, replaces a CMSMarkStack for storing grey objects.
class Par_MarkRefsIntoAndScanClosure: public CMSOopsInGenClosure {
private:
MemRegion _span;
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -407,8 +407,8 @@
res = MAX2(res, MIN2(_smallLinearAllocBlock._word_size,
(size_t) SmallForLinearAlloc - 1));
// XXX the following could potentially be pretty slow;
- // should one, pesimally for the rare cases when res
- // caclulated above is less than IndexSetSize,
+ // should one, pessimistically for the rare cases when res
+ // calculated above is less than IndexSetSize,
// just return res calculated above? My reasoning was that
// those cases will be so rare that the extra time spent doesn't
// really matter....
@@ -759,7 +759,7 @@
// Note on locking for the space iteration functions:
// since the collector's iteration activities are concurrent with
// allocation activities by mutators, absent a suitable mutual exclusion
-// mechanism the iterators may go awry. For instace a block being iterated
+// mechanism the iterators may go awry. For instance a block being iterated
// may suddenly be allocated or divided up and part of it allocated and
// so on.
@@ -2090,7 +2090,7 @@
// Support for concurrent collection policy decisions.
bool CompactibleFreeListSpace::should_concurrent_collect() const {
- // In the future we might want to add in frgamentation stats --
+ // In the future we might want to add in fragmentation stats --
// including erosion of the "mountain" into this decision as well.
return !adaptive_freelists() && linearAllocationWouldFail();
}
@@ -2099,7 +2099,7 @@
void CompactibleFreeListSpace::prepare_for_compaction(CompactPoint* cp) {
SCAN_AND_FORWARD(cp,end,block_is_obj,block_size);
- // prepare_for_compaction() uses the space between live objects
+ // Prepare_for_compaction() uses the space between live objects
// so that later phase can skip dead space quickly. So verification
// of the free lists doesn't work after.
}
@@ -2122,7 +2122,7 @@
SCAN_AND_COMPACT(obj_size);
}
-// fragmentation_metric = 1 - [sum of (fbs**2) / (sum of fbs)**2]
+// Fragmentation metric = 1 - [sum of (fbs**2) / (sum of fbs)**2]
// where fbs is free block sizes
double CompactibleFreeListSpace::flsFrag() const {
size_t itabFree = totalSizeInIndexedFreeLists();
@@ -2651,7 +2651,7 @@
// changes on-the-fly during a scavenge and avoid such a phase-change
// pothole. The following code is a heuristic attempt to do that.
// It is protected by a product flag until we have gained
- // enough experience with this heuristic and fine-tuned its behaviour.
+ // enough experience with this heuristic and fine-tuned its behavior.
// WARNING: This might increase fragmentation if we overreact to
// small spikes, so some kind of historical smoothing based on
// previous experience with the greater reactivity might be useful.
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -58,7 +58,7 @@
HeapWord* _ptr;
size_t _word_size;
size_t _refillSize;
- size_t _allocation_size_limit; // largest size that will be allocated
+ size_t _allocation_size_limit; // Largest size that will be allocated
void print_on(outputStream* st) const;
};
@@ -116,14 +116,14 @@
PromotionInfo _promoInfo;
- // helps to impose a global total order on freelistLock ranks;
+ // Helps to impose a global total order on freelistLock ranks;
// assumes that CFLSpace's are allocated in global total order
static int _lockRank;
- // a lock protecting the free lists and free blocks;
+ // A lock protecting the free lists and free blocks;
// mutable because of ubiquity of locking even for otherwise const methods
mutable Mutex _freelistLock;
- // locking verifier convenience function
+ // Locking verifier convenience function
void assert_locked() const PRODUCT_RETURN;
void assert_locked(const Mutex* lock) const PRODUCT_RETURN;
@@ -131,12 +131,13 @@
LinearAllocBlock _smallLinearAllocBlock;
FreeBlockDictionary<FreeChunk>::DictionaryChoice _dictionaryChoice;
- AFLBinaryTreeDictionary* _dictionary; // ptr to dictionary for large size blocks
+ AFLBinaryTreeDictionary* _dictionary; // Pointer to dictionary for large size blocks
+ // Indexed array for small size blocks
AdaptiveFreeList<FreeChunk> _indexedFreeList[IndexSetSize];
- // indexed array for small size blocks
- // allocation stategy
- bool _fitStrategy; // Use best fit strategy.
+
+ // Allocation strategy
+ bool _fitStrategy; // Use best fit strategy
bool _adaptive_freelists; // Use adaptive freelists
// This is an address close to the largest free chunk in the heap.
@@ -157,7 +158,7 @@
// Extra stuff to manage promotion parallelism.
- // a lock protecting the dictionary during par promotion allocation.
+ // A lock protecting the dictionary during par promotion allocation.
mutable Mutex _parDictionaryAllocLock;
Mutex* parDictionaryAllocLock() const { return &_parDictionaryAllocLock; }
@@ -275,26 +276,26 @@
}
protected:
- // reset the indexed free list to its initial empty condition.
+ // Reset the indexed free list to its initial empty condition.
void resetIndexedFreeListArray();
- // reset to an initial state with a single free block described
+ // Reset to an initial state with a single free block described
// by the MemRegion parameter.
void reset(MemRegion mr);
// Return the total number of words in the indexed free lists.
size_t totalSizeInIndexedFreeLists() const;
public:
- // Constructor...
+ // Constructor
CompactibleFreeListSpace(BlockOffsetSharedArray* bs, MemRegion mr,
bool use_adaptive_freelists,
FreeBlockDictionary<FreeChunk>::DictionaryChoice);
- // accessors
+ // Accessors
bool bestFitFirst() { return _fitStrategy == FreeBlockBestFitFirst; }
FreeBlockDictionary<FreeChunk>* dictionary() const { return _dictionary; }
HeapWord* nearLargestChunk() const { return _nearLargestChunk; }
void set_nearLargestChunk(HeapWord* v) { _nearLargestChunk = v; }
- // Set CMS global values
+ // Set CMS global values.
static void set_cms_values();
// Return the free chunk at the end of the space. If no such
@@ -305,7 +306,7 @@
void set_collector(CMSCollector* collector) { _collector = collector; }
- // Support for parallelization of rescan and marking
+ // Support for parallelization of rescan and marking.
const size_t rescan_task_size() const { return _rescan_task_size; }
const size_t marking_task_size() const { return _marking_task_size; }
SequentialSubTasksDone* conc_par_seq_tasks() {return &_conc_par_seq_tasks; }
@@ -346,7 +347,7 @@
// Resizing support
void set_end(HeapWord* value); // override
- // mutual exclusion support
+ // Mutual exclusion support
Mutex* freelistLock() const { return &_freelistLock; }
// Iteration support
@@ -370,7 +371,7 @@
// If the iteration encounters an unparseable portion of the region,
// terminate the iteration and return the address of the start of the
// subregion that isn't done. Return of "NULL" indicates that the
- // interation completed.
+ // iteration completed.
virtual HeapWord*
object_iterate_careful_m(MemRegion mr,
ObjectClosureCareful* cl);
@@ -393,11 +394,11 @@
size_t block_size_nopar(const HeapWord* p) const;
bool block_is_obj_nopar(const HeapWord* p) const;
- // iteration support for promotion
+ // Iteration support for promotion
void save_marks();
bool no_allocs_since_save_marks();
- // iteration support for sweeping
+ // Iteration support for sweeping
void save_sweep_limit() {
_sweep_limit = BlockOffsetArrayUseUnallocatedBlock ?
unallocated_block() : end();
@@ -457,7 +458,7 @@
FreeChunk* allocateScratch(size_t size);
- // returns true if either the small or large linear allocation buffer is empty.
+ // Returns true if either the small or large linear allocation buffer is empty.
bool linearAllocationWouldFail() const;
// Adjust the chunk for the minimum size. This version is called in
@@ -477,18 +478,18 @@
void addChunkAndRepairOffsetTable(HeapWord* chunk, size_t size,
bool coalesced);
- // Support for decisions regarding concurrent collection policy
+ // Support for decisions regarding concurrent collection policy.
bool should_concurrent_collect() const;
- // Support for compaction
+ // Support for compaction.
void prepare_for_compaction(CompactPoint* cp);
void adjust_pointers();
void compact();
- // reset the space to reflect the fact that a compaction of the
+ // Reset the space to reflect the fact that a compaction of the
// space has been done.
virtual void reset_after_compaction();
- // Debugging support
+ // Debugging support.
void print() const;
void print_on(outputStream* st) const;
void prepare_for_verify();
@@ -500,7 +501,7 @@
// i.e. either the binary tree dictionary, the indexed free lists
// or the linear allocation block.
bool verify_chunk_in_free_list(FreeChunk* fc) const;
- // Verify that the given chunk is the linear allocation block
+ // Verify that the given chunk is the linear allocation block.
bool verify_chunk_is_linear_alloc_block(FreeChunk* fc) const;
// Do some basic checks on the the free lists.
void check_free_list_consistency() const PRODUCT_RETURN;
@@ -516,7 +517,7 @@
size_t sumIndexedFreeListArrayReturnedBytes();
// Return the total number of chunks in the indexed free lists.
size_t totalCountInIndexedFreeLists() const;
- // Return the total numberof chunks in the space.
+ // Return the total number of chunks in the space.
size_t totalCount();
)
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -117,10 +117,10 @@
// hide the naked CGC_lock manipulation in the baton-passing code
// further below. That's something we should try to do. Also, the proof
// of correctness of this 2-level locking scheme is far from obvious,
-// and potentially quite slippery. We have an uneasy supsicion, for instance,
+// and potentially quite slippery. We have an uneasy suspicion, for instance,
// that there may be a theoretical possibility of delay/starvation in the
// low-level lock/wait/notify scheme used for the baton-passing because of
-// potential intereference with the priority scheme embodied in the
+// potential interference with the priority scheme embodied in the
// CMS-token-passing protocol. See related comments at a CGC_lock->wait()
// invocation further below and marked with "XXX 20011219YSR".
// Indeed, as we note elsewhere, this may become yet more slippery
@@ -259,7 +259,7 @@
// Ideally, in the calculation below, we'd compute the dilatation
// factor as: MinChunkSize/(promoting_gen's min object size)
// Since we do not have such a general query interface for the
- // promoting generation, we'll instead just use the mimimum
+ // promoting generation, we'll instead just use the minimum
// object size (which today is a header's worth of space);
// note that all arithmetic is in units of HeapWords.
assert(MinChunkSize >= CollectedHeap::min_fill_size(), "just checking");
@@ -274,7 +274,7 @@
//
// Let "f" be MinHeapFreeRatio in
//
-// _intiating_occupancy = 100-f +
+// _initiating_occupancy = 100-f +
// f * (CMSTriggerRatio/100)
// where CMSTriggerRatio is the argument "tr" below.
//
@@ -2671,7 +2671,7 @@
// that it's responsible for collecting, while itself doing any
// work common to all generations it's responsible for. A similar
// comment applies to the gc_epilogue()'s.
-// The role of the varaible _between_prologue_and_epilogue is to
+// The role of the variable _between_prologue_and_epilogue is to
// enforce the invocation protocol.
void CMSCollector::gc_prologue(bool full) {
// Call gc_prologue_work() for the CMSGen
@@ -2878,10 +2878,10 @@
// Check reachability of the given heap address in CMS generation,
// treating all other generations as roots.
bool CMSCollector::is_cms_reachable(HeapWord* addr) {
- // We could "guarantee" below, rather than assert, but i'll
+ // We could "guarantee" below, rather than assert, but I'll
// leave these as "asserts" so that an adventurous debugger
// could try this in the product build provided some subset of
- // the conditions were met, provided they were intersted in the
+ // the conditions were met, provided they were interested in the
// results and knew that the computation below wouldn't interfere
// with other concurrent computations mutating the structures
// being read or written.
@@ -2982,7 +2982,7 @@
// This is as intended, because by this time
// GC must already have cleared any refs that need to be cleared,
// and traced those that need to be marked; moreover,
- // the marking done here is not going to intefere in any
+ // the marking done here is not going to interfere in any
// way with the marking information used by GC.
NoRefDiscovery no_discovery(ref_processor());
@@ -3000,7 +3000,7 @@
if (CMSRemarkVerifyVariant == 1) {
// In this first variant of verification, we complete
- // all marking, then check if the new marks-verctor is
+ // all marking, then check if the new marks-vector is
// a subset of the CMS marks-vector.
verify_after_remark_work_1();
} else if (CMSRemarkVerifyVariant == 2) {
@@ -3033,7 +3033,6 @@
gch->gen_process_strong_roots(_cmsGen->level(),
true, // younger gens are roots
true, // activate StrongRootsScope
- false, // not scavenging
SharedHeap::ScanningOption(roots_scanning_options()),
¬Older,
true, // walk code active on stacks
@@ -3101,7 +3100,6 @@
gch->gen_process_strong_roots(_cmsGen->level(),
true, // younger gens are roots
true, // activate StrongRootsScope
- false, // not scavenging
SharedHeap::ScanningOption(roots_scanning_options()),
¬Older,
true, // walk code active on stacks
@@ -3303,7 +3301,7 @@
void CMSCollector::setup_cms_unloading_and_verification_state() {
const bool should_verify = VerifyBeforeGC || VerifyAfterGC || VerifyDuringGC
|| VerifyBeforeExit;
- const int rso = SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
+ const int rso = SharedHeap::SO_Strings | SharedHeap::SO_AllCodeCache;
// We set the proper root for this CMS cycle here.
if (should_unload_classes()) { // Should unload classes this cycle
@@ -3401,7 +3399,7 @@
CMSExpansionCause::_allocate_par_lab);
// Now go around the loop and try alloc again;
// A competing par_promote might beat us to the expansion space,
- // so we may go around the loop again if promotion fails agaion.
+ // so we may go around the loop again if promotion fails again.
if (GCExpandToAllocateDelayMillis > 0) {
os::sleep(Thread::current(), GCExpandToAllocateDelayMillis, false);
}
@@ -3738,10 +3736,9 @@
gch->gen_process_strong_roots(_cmsGen->level(),
true, // younger gens are roots
true, // activate StrongRootsScope
- false, // not scavenging
SharedHeap::ScanningOption(roots_scanning_options()),
¬Older,
- true, // walk all of code cache if (so & SO_CodeCache)
+ true, // walk all of code cache if (so & SO_AllCodeCache)
NULL,
&klass_closure);
}
@@ -4373,7 +4370,7 @@
// should really use wait/notify, which is the recommended
// way of doing this type of interaction. Additionally, we should
// consolidate the eight methods that do the yield operation and they
- // are almost identical into one for better maintenability and
+ // are almost identical into one for better maintainability and
// readability. See 6445193.
//
// Tony 2006.06.29
@@ -4541,7 +4538,7 @@
// If Eden's current occupancy is below this threshold,
// immediately schedule the remark; else preclean
// past the next scavenge in an effort to
- // schedule the pause as described avove. By choosing
+ // schedule the pause as described above. By choosing
// CMSScheduleRemarkEdenSizeThreshold >= max eden size
// we will never do an actual abortable preclean cycle.
if (get_eden_used() > CMSScheduleRemarkEdenSizeThreshold) {
@@ -5238,14 +5235,13 @@
gch->gen_process_strong_roots(_collector->_cmsGen->level(),
false, // yg was scanned above
false, // this is parallel code
- false, // not scavenging
SharedHeap::ScanningOption(_collector->CMSCollector::roots_scanning_options()),
&par_mri_cl,
- true, // walk all of code cache if (so & SO_CodeCache)
+ true, // walk all of code cache if (so & SO_AllCodeCache)
NULL,
&klass_closure);
assert(_collector->should_unload_classes()
- || (_collector->CMSCollector::roots_scanning_options() & SharedHeap::SO_CodeCache),
+ || (_collector->CMSCollector::roots_scanning_options() & SharedHeap::SO_AllCodeCache),
"if we didn't scan the code cache, we have to be ready to drop nmethods with expired weak oops");
_timer.stop();
if (PrintCMSStatistics != 0) {
@@ -5375,14 +5371,13 @@
gch->gen_process_strong_roots(_collector->_cmsGen->level(),
false, // yg was scanned above
false, // this is parallel code
- false, // not scavenging
SharedHeap::ScanningOption(_collector->CMSCollector::roots_scanning_options()),
&par_mrias_cl,
- true, // walk all of code cache if (so & SO_CodeCache)
+ true, // walk all of code cache if (so & SO_AllCodeCache)
NULL,
NULL); // The dirty klasses will be handled below
assert(_collector->should_unload_classes()
- || (_collector->CMSCollector::roots_scanning_options() & SharedHeap::SO_CodeCache),
+ || (_collector->CMSCollector::roots_scanning_options() & SharedHeap::SO_AllCodeCache),
"if we didn't scan the code cache, we have to be ready to drop nmethods with expired weak oops");
_timer.stop();
if (PrintCMSStatistics != 0) {
@@ -5537,8 +5532,8 @@
// CAUTION! CAUTION! CAUTION! CAUTION! CAUTION! CAUTION! CAUTION!
// CAUTION: This closure has state that persists across calls to
// the work method dirty_range_iterate_clear() in that it has
- // imbedded in it a (subtype of) UpwardsObjectClosure. The
- // use of that state in the imbedded UpwardsObjectClosure instance
+ // embedded in it a (subtype of) UpwardsObjectClosure. The
+ // use of that state in the embedded UpwardsObjectClosure instance
// assumes that the cards are always iterated (even if in parallel
// by several threads) in monotonically increasing order per each
// thread. This is true of the implementation below which picks
@@ -5553,7 +5548,7 @@
// sure that the changes there do not run counter to the
// assumptions made here and necessary for correctness and
// efficiency. Note also that this code might yield inefficient
- // behaviour in the case of very large objects that span one or
+ // behavior in the case of very large objects that span one or
// more work chunks. Such objects would potentially be scanned
// several times redundantly. Work on 4756801 should try and
// address that performance anomaly if at all possible. XXX
@@ -5579,7 +5574,7 @@
while (!pst->is_task_claimed(/* reference */ nth_task)) {
// Having claimed the nth_task, compute corresponding mem-region,
- // which is a-fortiori aligned correctly (i.e. at a MUT bopundary).
+ // which is a-fortiori aligned correctly (i.e. at a MUT boundary).
// The alignment restriction ensures that we do not need any
// synchronization with other gang-workers while setting or
// clearing bits in thus chunk of the MUT.
@@ -5966,7 +5961,6 @@
gch->gen_process_strong_roots(_cmsGen->level(),
true, // younger gens as roots
false, // use the local StrongRootsScope
- false, // not scavenging
SharedHeap::ScanningOption(roots_scanning_options()),
&mrias_cl,
true, // walk code active on stacks
@@ -5974,7 +5968,7 @@
NULL); // The dirty klasses will be handled below
assert(should_unload_classes()
- || (roots_scanning_options() & SharedHeap::SO_CodeCache),
+ || (roots_scanning_options() & SharedHeap::SO_AllCodeCache),
"if we didn't scan the code cache, we have to be ready to drop nmethods with expired weak oops");
}
@@ -6371,7 +6365,7 @@
_inter_sweep_timer.reset();
_inter_sweep_timer.start();
- // We need to use a monotonically non-deccreasing time in ms
+ // We need to use a monotonically non-decreasing time in ms
// or we will see time-warp warnings and os::javaTimeMillis()
// does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
@@ -6732,7 +6726,7 @@
warning("CMS bit map allocation failure");
return false;
}
- // For now we'll just commit all of the bit map up fromt.
+ // For now we'll just commit all of the bit map up front.
// Later on we'll try to be more parsimonious with swap.
if (!_virtual_space.initialize(brs, brs.size())) {
warning("CMS bit map backing store failure");
@@ -6839,8 +6833,8 @@
// XXX FIX ME !!! In the MT case we come in here holding a
// leaf lock. For printing we need to take a further lock
-// which has lower rank. We need to recallibrate the two
-// lock-ranks involved in order to be able to rpint the
+// which has lower rank. We need to recalibrate the two
+// lock-ranks involved in order to be able to print the
// messages below. (Or defer the printing to the caller.
// For now we take the expedient path of just disabling the
// messages for the problematic case.)
@@ -7180,7 +7174,7 @@
}
#endif // ASSERT
} else {
- // an unitialized object
+ // An uninitialized object.
assert(_bitMap->isMarked(addr+1), "missing Printezis mark?");
HeapWord* nextOneAddr = _bitMap->getNextMarkedWordAddress(addr + 2);
size = pointer_delta(nextOneAddr + 1, addr);
@@ -7188,7 +7182,7 @@
"alignment problem");
// Note that pre-cleaning needn't redirty the card. OopDesc::set_klass()
// will dirty the card when the klass pointer is installed in the
- // object (signalling the completion of initialization).
+ // object (signaling the completion of initialization).
}
} else {
// Either a not yet marked object or an uninitialized object
@@ -7999,7 +7993,7 @@
// we need to dirty all of the cards that the object spans,
// since the rescan of object arrays will be limited to the
// dirty cards.
- // Note that no one can be intefering with us in this action
+ // Note that no one can be interfering with us in this action
// of dirtying the mod union table, so no locking or atomics
// are required.
if (obj->is_objArray()) {
@@ -9025,7 +9019,7 @@
// It's OK to call this multi-threaded; the worst thing
// that can happen is that we'll get a bunch of closely
-// spaced simulated oveflows, but that's OK, in fact
+// spaced simulated overflows, but that's OK, in fact
// probably good as it would exercise the overflow code
// under contention.
bool CMSCollector::simulate_overflow() {
@@ -9145,7 +9139,7 @@
(void) Atomic::cmpxchg_ptr(NULL, &_overflow_list, BUSY);
}
} else {
- // Chop off the suffix and rerturn it to the global list.
+ // Chop off the suffix and return it to the global list.
assert(cur->mark() != BUSY, "Error");
oop suffix_head = cur->mark(); // suffix will be put back on global list
cur->set_mark(NULL); // break off suffix
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -171,19 +171,19 @@
// Ideally this should be GrowableArray<> just like MSC's marking stack(s).
class CMSMarkStack: public CHeapObj<mtGC> {
//
- friend class CMSCollector; // to get at expasion stats further below
+ friend class CMSCollector; // To get at expansion stats further below.
//
- VirtualSpace _virtual_space; // space for the stack
- oop* _base; // bottom of stack
- size_t _index; // one more than last occupied index
- size_t _capacity; // max #elements
- Mutex _par_lock; // an advisory lock used in case of parallel access
- NOT_PRODUCT(size_t _max_depth;) // max depth plumbed during run
+ VirtualSpace _virtual_space; // Space for the stack
+ oop* _base; // Bottom of stack
+ size_t _index; // One more than last occupied index
+ size_t _capacity; // Max #elements
+ Mutex _par_lock; // An advisory lock used in case of parallel access
+ NOT_PRODUCT(size_t _max_depth;) // Max depth plumbed during run
protected:
- size_t _hit_limit; // we hit max stack size limit
- size_t _failed_double; // we failed expansion before hitting limit
+ size_t _hit_limit; // We hit max stack size limit
+ size_t _failed_double; // We failed expansion before hitting limit
public:
CMSMarkStack():
@@ -238,7 +238,7 @@
_index = 0;
}
- // Expand the stack, typically in response to an overflow condition
+ // Expand the stack, typically in response to an overflow condition.
void expand();
// Compute the least valued stack element.
@@ -250,7 +250,7 @@
return least;
}
- // Exposed here to allow stack expansion in || case
+ // Exposed here to allow stack expansion in || case.
Mutex* par_lock() { return &_par_lock; }
};
@@ -557,7 +557,7 @@
// Manipulated with CAS in the parallel/multi-threaded case.
oop _overflow_list;
// The following array-pair keeps track of mark words
- // displaced for accomodating overflow list above.
+ // displaced for accommodating overflow list above.
// This code will likely be revisited under RFE#4922830.
Stack<oop, mtGC> _preserved_oop_stack;
Stack<markOop, mtGC> _preserved_mark_stack;
@@ -599,7 +599,7 @@
void verify_after_remark_work_1();
void verify_after_remark_work_2();
- // true if any verification flag is on.
+ // True if any verification flag is on.
bool _verifying;
bool verifying() const { return _verifying; }
void set_verifying(bool v) { _verifying = v; }
@@ -611,9 +611,9 @@
void set_did_compact(bool v);
// XXX Move these to CMSStats ??? FIX ME !!!
- elapsedTimer _inter_sweep_timer; // time between sweeps
- elapsedTimer _intra_sweep_timer; // time _in_ sweeps
- // padded decaying average estimates of the above
+ elapsedTimer _inter_sweep_timer; // Time between sweeps
+ elapsedTimer _intra_sweep_timer; // Time _in_ sweeps
+ // Padded decaying average estimates of the above
AdaptivePaddedAverage _inter_sweep_estimate;
AdaptivePaddedAverage _intra_sweep_estimate;
@@ -632,16 +632,16 @@
void report_heap_summary(GCWhen::Type when);
protected:
- ConcurrentMarkSweepGeneration* _cmsGen; // old gen (CMS)
- MemRegion _span; // span covering above two
- CardTableRS* _ct; // card table
+ ConcurrentMarkSweepGeneration* _cmsGen; // Old gen (CMS)
+ MemRegion _span; // Span covering above two
+ CardTableRS* _ct; // Card table
// CMS marking support structures
CMSBitMap _markBitMap;
CMSBitMap _modUnionTable;
CMSMarkStack _markStack;
- HeapWord* _restart_addr; // in support of marking stack overflow
+ HeapWord* _restart_addr; // In support of marking stack overflow
void lower_restart_addr(HeapWord* low);
// Counters in support of marking stack / work queue overflow handling:
@@ -656,12 +656,12 @@
size_t _par_kac_ovflw;
NOT_PRODUCT(ssize_t _num_par_pushes;)
- // ("Weak") Reference processing support
+ // ("Weak") Reference processing support.
ReferenceProcessor* _ref_processor;
CMSIsAliveClosure _is_alive_closure;
- // keep this textually after _markBitMap and _span; c'tor dependency
+ // Keep this textually after _markBitMap and _span; c'tor dependency.
- ConcurrentMarkSweepThread* _cmsThread; // the thread doing the work
+ ConcurrentMarkSweepThread* _cmsThread; // The thread doing the work
ModUnionClosure _modUnionClosure;
ModUnionClosurePar _modUnionClosurePar;
@@ -697,7 +697,7 @@
// State related to prologue/epilogue invocation for my generations
bool _between_prologue_and_epilogue;
- // Signalling/State related to coordination between fore- and backgroud GC
+ // Signaling/State related to coordination between fore- and background GC
// Note: When the baton has been passed from background GC to foreground GC,
// _foregroundGCIsActive is true and _foregroundGCShouldWait is false.
static bool _foregroundGCIsActive; // true iff foreground collector is active or
@@ -712,13 +712,13 @@
int _numYields;
size_t _numDirtyCards;
size_t _sweep_count;
- // number of full gc's since the last concurrent gc.
+ // Number of full gc's since the last concurrent gc.
uint _full_gcs_since_conc_gc;
- // occupancy used for bootstrapping stats
+ // Occupancy used for bootstrapping stats
double _bootstrap_occupancy;
- // timer
+ // Timer
elapsedTimer _timer;
// Timing, allocation and promotion statistics, used for scheduling.
@@ -770,7 +770,7 @@
int no_of_gc_threads);
void push_on_overflow_list(oop p);
void par_push_on_overflow_list(oop p);
- // the following is, obviously, not, in general, "MT-stable"
+ // The following is, obviously, not, in general, "MT-stable"
bool overflow_list_is_empty() const;
void preserve_mark_if_necessary(oop p);
@@ -778,24 +778,24 @@
void preserve_mark_work(oop p, markOop m);
void restore_preserved_marks_if_any();
NOT_PRODUCT(bool no_preserved_marks() const;)
- // in support of testing overflow code
+ // In support of testing overflow code
NOT_PRODUCT(int _overflow_counter;)
- NOT_PRODUCT(bool simulate_overflow();) // sequential
+ NOT_PRODUCT(bool simulate_overflow();) // Sequential
NOT_PRODUCT(bool par_simulate_overflow();) // MT version
// CMS work methods
- void checkpointRootsInitialWork(bool asynch); // initial checkpoint work
+ void checkpointRootsInitialWork(bool asynch); // Initial checkpoint work
- // a return value of false indicates failure due to stack overflow
- bool markFromRootsWork(bool asynch); // concurrent marking work
+ // A return value of false indicates failure due to stack overflow
+ bool markFromRootsWork(bool asynch); // Concurrent marking work
public: // FIX ME!!! only for testing
- bool do_marking_st(bool asynch); // single-threaded marking
- bool do_marking_mt(bool asynch); // multi-threaded marking
+ bool do_marking_st(bool asynch); // Single-threaded marking
+ bool do_marking_mt(bool asynch); // Multi-threaded marking
private:
- // concurrent precleaning work
+ // Concurrent precleaning work
size_t preclean_mod_union_table(ConcurrentMarkSweepGeneration* gen,
ScanMarkedObjectsAgainCarefullyClosure* cl);
size_t preclean_card_table(ConcurrentMarkSweepGeneration* gen,
@@ -811,26 +811,26 @@
// Resets (i.e. clears) the per-thread plab sample vectors
void reset_survivor_plab_arrays();
- // final (second) checkpoint work
+ // Final (second) checkpoint work
void checkpointRootsFinalWork(bool asynch, bool clear_all_soft_refs,
bool init_mark_was_synchronous);
- // work routine for parallel version of remark
+ // Work routine for parallel version of remark
void do_remark_parallel();
- // work routine for non-parallel version of remark
+ // Work routine for non-parallel version of remark
void do_remark_non_parallel();
- // reference processing work routine (during second checkpoint)
+ // Reference processing work routine (during second checkpoint)
void refProcessingWork(bool asynch, bool clear_all_soft_refs);
- // concurrent sweeping work
+ // Concurrent sweeping work
void sweepWork(ConcurrentMarkSweepGeneration* gen, bool asynch);
- // (concurrent) resetting of support data structures
+ // (Concurrent) resetting of support data structures
void reset(bool asynch);
// Clear _expansion_cause fields of constituent generations
void clear_expansion_cause();
- // An auxilliary method used to record the ends of
+ // An auxiliary method used to record the ends of
// used regions of each generation to limit the extent of sweep
void save_sweep_limits();
@@ -854,7 +854,7 @@
bool is_external_interruption();
void report_concurrent_mode_interruption();
- // If the backgrould GC is active, acquire control from the background
+ // If the background GC is active, acquire control from the background
// GC and do the collection.
void acquire_control_and_collect(bool full, bool clear_all_soft_refs);
@@ -893,7 +893,7 @@
ConcurrentMarkSweepGeneration* cmsGen() { return _cmsGen; }
- // locking checks
+ // Locking checks
NOT_PRODUCT(static bool have_cms_token();)
// XXXPERM bool should_collect(bool full, size_t size, bool tlab);
@@ -958,7 +958,7 @@
CMSBitMap* markBitMap() { return &_markBitMap; }
void directAllocated(HeapWord* start, size_t size);
- // main CMS steps and related support
+ // Main CMS steps and related support
void checkpointRootsInitial(bool asynch);
bool markFromRoots(bool asynch); // a return value of false indicates failure
// due to stack overflow
@@ -977,7 +977,7 @@
// Performance Counter Support
CollectorCounters* counters() { return _gc_counters; }
- // timer stuff
+ // Timer stuff
void startTimer() { assert(!_timer.is_active(), "Error"); _timer.start(); }
void stopTimer() { assert( _timer.is_active(), "Error"); _timer.stop(); }
void resetTimer() { assert(!_timer.is_active(), "Error"); _timer.reset(); }
@@ -1014,18 +1014,18 @@
static void print_on_error(outputStream* st);
- // debugging
+ // Debugging
void verify();
bool verify_after_remark(bool silent = VerifySilently);
void verify_ok_to_terminate() const PRODUCT_RETURN;
void verify_work_stacks_empty() const PRODUCT_RETURN;
void verify_overflow_empty() const PRODUCT_RETURN;
- // convenience methods in support of debugging
+ // Convenience methods in support of debugging
static const size_t skip_header_HeapWords() PRODUCT_RETURN0;
HeapWord* block_start(const void* p) const PRODUCT_RETURN0;
- // accessors
+ // Accessors
CMSMarkStack* verification_mark_stack() { return &_markStack; }
CMSBitMap* verification_mark_bm() { return &_verification_mark_bm; }
@@ -1109,7 +1109,7 @@
CollectionTypes _debug_collection_type;
- // True if a compactiing collection was done.
+ // True if a compacting collection was done.
bool _did_compact;
bool did_compact() { return _did_compact; }
@@ -1203,7 +1203,7 @@
// Support for compaction
CompactibleSpace* first_compaction_space() const;
- // Adjust quantites in the generation affected by
+ // Adjust quantities in the generation affected by
// the compaction.
void reset_after_compaction();
@@ -1301,7 +1301,7 @@
void setNearLargestChunk();
bool isNearLargestChunk(HeapWord* addr);
- // Get the chunk at the end of the space. Delagates to
+ // Get the chunk at the end of the space. Delegates to
// the space.
FreeChunk* find_chunk_at_end();
@@ -1422,7 +1422,6 @@
// marking from the roots following the first checkpoint.
// XXX This should really be a subclass of The serial version
// above, but i have not had the time to refactor things cleanly.
-// That willbe done for Dolphin.
class Par_MarkFromRootsClosure: public BitMapClosure {
CMSCollector* _collector;
MemRegion _whole_span;
@@ -1780,7 +1779,7 @@
void do_already_free_chunk(FreeChunk *fc);
// Work method called when processing an already free or a
// freshly garbage chunk to do a lookahead and possibly a
- // premptive flush if crossing over _limit.
+ // preemptive flush if crossing over _limit.
void lookahead_and_flush(FreeChunk* fc, size_t chunkSize);
// Process a garbage chunk during sweeping.
size_t do_garbage_chunk(FreeChunk *fc);
@@ -1879,7 +1878,7 @@
};
// Allow yielding or short-circuiting of reference list
-// prelceaning work.
+// precleaning work.
class CMSPrecleanRefsYieldClosure: public YieldClosure {
CMSCollector* _collector;
void do_yield_work();
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -197,13 +197,13 @@
}
-// Return the HeapWord address corrsponding to the next "0" bit
+// Return the HeapWord address corresponding to the next "0" bit
// (inclusive).
inline HeapWord* CMSBitMap::getNextUnmarkedWordAddress(HeapWord* addr) const {
return getNextUnmarkedWordAddress(addr, endWord());
}
-// Return the HeapWord address corrsponding to the next "0" bit
+// Return the HeapWord address corresponding to the next "0" bit
// (inclusive).
inline HeapWord* CMSBitMap::getNextUnmarkedWordAddress(
HeapWord* start_addr, HeapWord* end_addr) const {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -164,7 +164,7 @@
// _pending_yields that holds the sum (of both sync and async requests), and
// a second counter _pending_decrements that only holds the async requests,
// for greater efficiency, since in a typical CMS run, there are many more
- // pontential (i.e. static) yield points than there are actual
+ // potential (i.e. static) yield points than there are actual
// (i.e. dynamic) yields because of requests, which are few and far between.
//
// Note that, while "_pending_yields >= _pending_decrements" is an invariant,
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -279,7 +279,7 @@
// When _spoolTail is NULL, then the set of slots with displaced headers
// is all those starting at the slot <_spoolHead, _firstIndex> and
// going up to the last slot of last block in the linked list.
-// In this lartter case, _splice_point points to the tail block of
+// In this latter case, _splice_point points to the tail block of
// this linked list of blocks holding displaced headers.
void PromotionInfo::verify() const {
// Verify the following:
--- a/hotspot/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -39,7 +39,7 @@
// up, the wrapped closure is applied to all elements, keeping track of
// this elapsed time of this process, and leaving the array empty.
// The caller must be sure to call "done" to process any unprocessed
-// buffered entriess.
+// buffered entries.
class Generation;
class HeapRegion;
@@ -98,116 +98,4 @@
_closure_app_seconds(0.0) { }
};
-class BufferingOopsInGenClosure: public OopsInGenClosure {
- BufferingOopClosure _boc;
- OopsInGenClosure* _oc;
- protected:
- template <class T> inline void do_oop_work(T* p) {
- assert(generation()->is_in_reserved((void*)p), "Must be in!");
- _boc.do_oop(p);
- }
- public:
- BufferingOopsInGenClosure(OopsInGenClosure *oc) :
- _boc(oc), _oc(oc) {}
-
- virtual void do_oop(narrowOop* p) { do_oop_work(p); }
- virtual void do_oop(oop* p) { do_oop_work(p); }
-
- void done() {
- _boc.done();
- }
-
- double closure_app_seconds () {
- return _boc.closure_app_seconds();
- }
-
- void set_generation(Generation* gen) {
- OopsInGenClosure::set_generation(gen);
- _oc->set_generation(gen);
- }
-
- void reset_generation() {
- // Make sure we finish the current work with the current generation.
- _boc.done();
- OopsInGenClosure::reset_generation();
- _oc->reset_generation();
- }
-
-};
-
-
-class BufferingOopsInHeapRegionClosure: public OopsInHeapRegionClosure {
-private:
- enum PrivateConstants {
- BufferLength = 1024
- };
-
- StarTask _buffer[BufferLength];
- StarTask* _buffer_top;
- StarTask* _buffer_curr;
-
- HeapRegion* _hr_buffer[BufferLength];
- HeapRegion** _hr_curr;
-
- OopsInHeapRegionClosure* _oc;
- double _closure_app_seconds;
-
- void process_buffer () {
-
- assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer),
- "the two lengths should be the same");
-
- double start = os::elapsedTime();
- HeapRegion** hr_curr = _hr_buffer;
- HeapRegion* hr_prev = NULL;
- for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
- HeapRegion* region = *hr_curr;
- if (region != hr_prev) {
- _oc->set_region(region);
- hr_prev = region;
- }
- if (curr->is_narrow()) {
- assert(UseCompressedOops, "Error");
- _oc->do_oop((narrowOop*)(*curr));
- } else {
- _oc->do_oop((oop*)(*curr));
- }
- ++hr_curr;
- }
- _buffer_curr = _buffer;
- _hr_curr = _hr_buffer;
- _closure_app_seconds += (os::elapsedTime() - start);
- }
-
-public:
- virtual void do_oop(narrowOop* p) { do_oop_work(p); }
- virtual void do_oop( oop* p) { do_oop_work(p); }
-
- template <class T> void do_oop_work(T* p) {
- if (_buffer_curr == _buffer_top) {
- assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr");
- process_buffer();
- }
- StarTask new_ref(p);
- *_buffer_curr = new_ref;
- ++_buffer_curr;
- *_hr_curr = _from;
- ++_hr_curr;
- }
- void done () {
- if (_buffer_curr > _buffer) {
- assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr");
- process_buffer();
- }
- }
- double closure_app_seconds () {
- return _closure_app_seconds;
- }
- BufferingOopsInHeapRegionClosure (OopsInHeapRegionClosure *oc) :
- _oc(oc),
- _buffer_curr(_buffer), _buffer_top(_buffer + BufferLength),
- _hr_curr(_hr_buffer),
- _closure_app_seconds(0.0) { }
-};
-
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -33,7 +33,7 @@
_threads(NULL), _n_threads(0),
_hot_card_cache(g1h)
{
- // Ergomonically select initial concurrent refinement parameters
+ // Ergonomically select initial concurrent refinement parameters
if (FLAG_IS_DEFAULT(G1ConcRefinementGreenZone)) {
FLAG_SET_DEFAULT(G1ConcRefinementGreenZone, MAX2<int>(ParallelGCThreads, 1));
}
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -44,8 +44,8 @@
_vtime_accum(0.0)
{
- // Each thread has its own monitor. The i-th thread is responsible for signalling
- // to thread i+1 if the number of buffers in the queue exceeds a threashold for this
+ // Each thread has its own monitor. The i-th thread is responsible for signaling
+ // to thread i+1 if the number of buffers in the queue exceeds a threshold for this
// thread. Monitors are also used to wake up the threads during termination.
// The 0th worker in notified by mutator threads and has a special monitor.
// The last worker is used for young gen rset size sampling.
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -909,7 +909,7 @@
}
#endif
- // Initialise marking structures. This has to be done in a STW phase.
+ // Initialize marking structures. This has to be done in a STW phase.
reset();
// For each region note start of marking.
@@ -923,8 +923,8 @@
// If we force an overflow during remark, the remark operation will
// actually abort and we'll restart concurrent marking. If we always
- // force an oveflow during remark we'll never actually complete the
- // marking phase. So, we initilize this here, at the start of the
+ // force an overflow during remark we'll never actually complete the
+ // marking phase. So, we initialize this here, at the start of the
// cycle, so that at the remaining overflow number will decrease at
// every remark and we'll eventually not need to cause one.
force_overflow_stw()->init();
@@ -959,7 +959,7 @@
*
* Note, however, that this code is also used during remark and in
* this case we should not attempt to leave / enter the STS, otherwise
- * we'll either hit an asseert (debug / fastdebug) or deadlock
+ * we'll either hit an assert (debug / fastdebug) or deadlock
* (product). So we should only leave / enter the STS if we are
* operating concurrently.
*
@@ -1001,7 +1001,7 @@
// task 0 is responsible for clearing the global data structures
// We should be here because of an overflow. During STW we should
// not clear the overflow flag since we rely on it being true when
- // we exit this method to abort the pause and restart concurent
+ // we exit this method to abort the pause and restart concurrent
// marking.
reset_marking_state(true /* clear_overflow */);
force_overflow()->update();
@@ -1251,7 +1251,7 @@
CMConcurrentMarkingTask markingTask(this, cmThread());
if (use_parallel_marking_threads()) {
_parallel_workers->set_active_workers((int)active_workers);
- // Don't set _n_par_threads because it affects MT in proceess_strong_roots()
+ // Don't set _n_par_threads because it affects MT in process_strong_roots()
// and the decisions on that MT processing is made elsewhere.
assert(_parallel_workers->active_workers() > 0, "Should have been set");
_parallel_workers->run_task(&markingTask);
@@ -1484,7 +1484,7 @@
}
// Set the marked bytes for the current region so that
- // it can be queried by a calling verificiation routine
+ // it can be queried by a calling verification routine
_region_marked_bytes = marked_bytes;
return false;
@@ -1619,7 +1619,6 @@
}
};
-
class G1ParVerifyFinalCountTask: public AbstractGangTask {
protected:
G1CollectedHeap* _g1h;
@@ -2307,7 +2306,7 @@
// oop closure (an instance of G1CMKeepAliveAndDrainClosure above).
//
// CMTask::do_marking_step() is called in a loop, which we'll exit
- // if there's nothing more to do (i.e. we'completely drained the
+ // if there's nothing more to do (i.e. we've completely drained the
// entries that were pushed as a a result of applying the 'keep alive'
// closure to the entries on the discovered ref lists) or we overflow
// the global marking stack.
@@ -2470,7 +2469,7 @@
// reference processing is not multi-threaded and is thus
// performed by the current thread instead of a gang worker).
//
- // The gang tasks involved in parallel reference procssing create
+ // The gang tasks involved in parallel reference processing create
// their own instances of these closures, which do their own
// synchronization among themselves.
G1CMKeepAliveAndDrainClosure g1_keep_alive(this, task(0), true /* is_serial */);
@@ -2529,10 +2528,9 @@
assert(!rp->discovery_enabled(), "Post condition");
}
- // Now clean up stale oops in StringTable
- StringTable::unlink(&g1_is_alive);
- // Clean up unreferenced symbols in symbol table.
- SymbolTable::unlink();
+ g1h->unlink_string_and_symbol_table(&g1_is_alive,
+ /* process_strings */ false, // currently strings are always roots
+ /* process_symbols */ true);
}
void ConcurrentMark::swapMarkBitMaps() {
@@ -2548,7 +2546,7 @@
public:
void work(uint worker_id) {
// Since all available tasks are actually started, we should
- // only proceed if we're supposed to be actived.
+ // only proceed if we're supposed to be active.
if (worker_id < _cm->active_tasks()) {
CMTask* task = _cm->task(worker_id);
task->record_start_time();
@@ -3068,7 +3066,7 @@
// 'start' should be in the heap.
assert(_g1h->is_in_g1_reserved(start) && _ct_bs->is_card_aligned(start), "sanity");
- // 'end' *may* be just beyone the end of the heap (if hr is the last region)
+ // 'end' *may* be just beyond the end of the heap (if hr is the last region)
assert(!_g1h->is_in_g1_reserved(end) || _ct_bs->is_card_aligned(end), "sanity");
BitMap::idx_t start_idx = _cm->card_bitmap_index_for(start);
@@ -4416,7 +4414,7 @@
// overflow was raised. This means we have to restart the
// marking phase and start iterating over regions. However, in
// order to do this we have to make sure that all tasks stop
- // what they are doing and re-initialise in a safe manner. We
+ // what they are doing and re-initialize in a safe manner. We
// will achieve this with the use of two barrier sync points.
if (_cm->verbose_low()) {
@@ -4430,7 +4428,7 @@
// When we exit this sync barrier we know that all tasks have
// stopped doing marking work. So, it's now safe to
- // re-initialise our data structures. At the end of this method,
+ // re-initialize our data structures. At the end of this method,
// task 0 will clear the global data structures.
}
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -378,19 +378,19 @@
friend class G1CMDrainMarkingStackClosure;
protected:
- ConcurrentMarkThread* _cmThread; // the thread doing the work
- G1CollectedHeap* _g1h; // the heap.
- uint _parallel_marking_threads; // the number of marking
- // threads we're use
- uint _max_parallel_marking_threads; // max number of marking
- // threads we'll ever use
- double _sleep_factor; // how much we have to sleep, with
+ ConcurrentMarkThread* _cmThread; // The thread doing the work
+ G1CollectedHeap* _g1h; // The heap
+ uint _parallel_marking_threads; // The number of marking
+ // threads we're using
+ uint _max_parallel_marking_threads; // Max number of marking
+ // threads we'll ever use
+ double _sleep_factor; // How much we have to sleep, with
// respect to the work we just did, to
// meet the marking overhead goal
- double _marking_task_overhead; // marking target overhead for
+ double _marking_task_overhead; // Marking target overhead for
// a single task
- // same as the two above, but for the cleanup task
+ // Same as the two above, but for the cleanup task
double _cleanup_sleep_factor;
double _cleanup_task_overhead;
@@ -399,8 +399,8 @@
// Concurrent marking support structures
CMBitMap _markBitMap1;
CMBitMap _markBitMap2;
- CMBitMapRO* _prevMarkBitMap; // completed mark bitmap
- CMBitMap* _nextMarkBitMap; // under-construction mark bitmap
+ CMBitMapRO* _prevMarkBitMap; // Completed mark bitmap
+ CMBitMap* _nextMarkBitMap; // Under-construction mark bitmap
BitMap _region_bm;
BitMap _card_bm;
@@ -409,43 +409,43 @@
HeapWord* _heap_start;
HeapWord* _heap_end;
- // Root region tracking and claiming.
+ // Root region tracking and claiming
CMRootRegions _root_regions;
// For gray objects
- CMMarkStack _markStack; // Grey objects behind global finger.
- HeapWord* volatile _finger; // the global finger, region aligned,
+ CMMarkStack _markStack; // Grey objects behind global finger
+ HeapWord* volatile _finger; // The global finger, region aligned,
// always points to the end of the
// last claimed region
- // marking tasks
- uint _max_worker_id;// maximum worker id
- uint _active_tasks; // task num currently active
- CMTask** _tasks; // task queue array (max_worker_id len)
- CMTaskQueueSet* _task_queues; // task queue set
- ParallelTaskTerminator _terminator; // for termination
+ // Marking tasks
+ uint _max_worker_id;// Maximum worker id
+ uint _active_tasks; // Task num currently active
+ CMTask** _tasks; // Task queue array (max_worker_id len)
+ CMTaskQueueSet* _task_queues; // Task queue set
+ ParallelTaskTerminator _terminator; // For termination
- // Two sync barriers that are used to synchronise tasks when an
+ // Two sync barriers that are used to synchronize tasks when an
// overflow occurs. The algorithm is the following. All tasks enter
// the first one to ensure that they have all stopped manipulating
- // the global data structures. After they exit it, they re-initialise
- // their data structures and task 0 re-initialises the global data
+ // the global data structures. After they exit it, they re-initialize
+ // their data structures and task 0 re-initializes the global data
// structures. Then, they enter the second sync barrier. This
// ensure, that no task starts doing work before all data
- // structures (local and global) have been re-initialised. When they
+ // structures (local and global) have been re-initialized. When they
// exit it, they are free to start working again.
WorkGangBarrierSync _first_overflow_barrier_sync;
WorkGangBarrierSync _second_overflow_barrier_sync;
- // this is set by any task, when an overflow on the global data
- // structures is detected.
+ // This is set by any task, when an overflow on the global data
+ // structures is detected
volatile bool _has_overflown;
- // true: marking is concurrent, false: we're in remark
+ // True: marking is concurrent, false: we're in remark
volatile bool _concurrent;
- // set at the end of a Full GC so that marking aborts
+ // Set at the end of a Full GC so that marking aborts
volatile bool _has_aborted;
- // used when remark aborts due to an overflow to indicate that
+ // Used when remark aborts due to an overflow to indicate that
// another concurrent marking phase should start
volatile bool _restart_for_overflow;
@@ -455,10 +455,10 @@
// time of remark.
volatile bool _concurrent_marking_in_progress;
- // verbose level
+ // Verbose level
CMVerboseLevel _verbose_level;
- // All of these times are in ms.
+ // All of these times are in ms
NumberSeq _init_times;
NumberSeq _remark_times;
NumberSeq _remark_mark_times;
@@ -467,7 +467,7 @@
double _total_counting_time;
double _total_rs_scrub_time;
- double* _accum_task_vtime; // accumulated task vtime
+ double* _accum_task_vtime; // Accumulated task vtime
FlexibleWorkGang* _parallel_workers;
@@ -487,7 +487,7 @@
void reset_marking_state(bool clear_overflow = true);
// We do this after we're done with marking so that the marking data
- // structures are initialised to a sensible and predictable state.
+ // structures are initialized to a sensible and predictable state.
void set_non_marking_state();
// Called to indicate how many threads are currently active.
@@ -497,14 +497,14 @@
// mark or remark) and how many threads are currently active.
void set_concurrency_and_phase(uint active_tasks, bool concurrent);
- // prints all gathered CM-related statistics
+ // Prints all gathered CM-related statistics
void print_stats();
bool cleanup_list_is_empty() {
return _cleanup_list.is_empty();
}
- // accessor methods
+ // Accessor methods
uint parallel_marking_threads() const { return _parallel_marking_threads; }
uint max_parallel_marking_threads() const { return _max_parallel_marking_threads;}
double sleep_factor() { return _sleep_factor; }
@@ -542,7 +542,7 @@
// frequently.
HeapRegion* claim_region(uint worker_id);
- // It determines whether we've run out of regions to scan.
+ // It determines whether we've run out of regions to scan
bool out_of_regions() { return _finger == _heap_end; }
// Returns the task with the given id
@@ -816,7 +816,7 @@
inline bool do_yield_check(uint worker_i = 0);
inline bool should_yield();
- // Called to abort the marking cycle after a Full GC takes palce.
+ // Called to abort the marking cycle after a Full GC takes place.
void abort();
bool has_aborted() { return _has_aborted; }
@@ -933,11 +933,11 @@
// Similar to the above routine but there are times when we cannot
// safely calculate the size of obj due to races and we, therefore,
- // pass the size in as a parameter. It is the caller's reponsibility
+ // pass the size in as a parameter. It is the caller's responsibility
// to ensure that the size passed in for obj is valid.
inline bool par_mark_and_count(oop obj, size_t word_size, uint worker_id);
- // Unconditionally mark the given object, and unconditinally count
+ // Unconditionally mark the given object, and unconditionally count
// the object in the counting structures for worker id 0.
// Should *not* be called from parallel code.
inline bool mark_and_count(oop obj, HeapRegion* hr);
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -105,7 +105,7 @@
// will then correspond to a (non-existent) card that is also
// just beyond the heap.
if (g1h->is_in_g1_reserved(end) && !ct_bs->is_card_aligned(end)) {
- // end of region is not card aligned - incremement to cover
+ // end of region is not card aligned - increment to cover
// all the cards spanned by the region.
end_idx += 1;
}
@@ -222,7 +222,7 @@
return false;
}
-// Unconditionally mark the given object, and unconditinally count
+// Unconditionally mark the given object, and unconditionally count
// the object in the counting structures for worker id 0.
// Should *not* be called from parallel code.
inline bool ConcurrentMark::mark_and_count(oop obj, HeapRegion* hr) {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.inline.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.inline.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -70,7 +70,7 @@
inline HeapWord* G1AllocRegion::attempt_allocation_locked(size_t word_size,
bool bot_updates) {
- // First we have to tedo the allocation, assuming we're holding the
+ // First we have to redo the allocation, assuming we're holding the
// appropriate lock, in case another thread changed the region while
// we were waiting to get the lock.
HeapWord* result = attempt_allocation(word_size, bot_updates);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -79,7 +79,7 @@
assert((uintptr_t)end % mapping_granularity_in_bytes == 0,
err_msg("end mapping area address must be a multiple of mapping granularity %zd, is "PTR_FORMAT,
mapping_granularity_in_bytes, end));
- size_t num_target_elems = (end - bottom) / (mapping_granularity_in_bytes / HeapWordSize);
+ size_t num_target_elems = pointer_delta(end, bottom, mapping_granularity_in_bytes);
idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes;
address base = create_new_base_array(num_target_elems, target_elem_size_in_bytes);
initialize_base(base, num_target_elems, bias, target_elem_size_in_bytes, log2_intptr(mapping_granularity_in_bytes));
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -448,7 +448,7 @@
// Otherwise, find the block start using the table, but taking
// care (cf block_start_unsafe() above) not to parse any objects/blocks
- // on the cards themsleves.
+ // on the cards themselves.
size_t index = _array->index_for(addr);
assert(_array->address_for_index(index) == addr,
"arg should be start of card");
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -169,7 +169,7 @@
// We use the last address in hr as hr could be the
// last region in the heap. In which case trying to find
- // the card for hr->end() will be an OOB accesss to the
+ // the card for hr->end() will be an OOB access to the
// card table.
HeapWord* last = hr->end() - 1;
assert(_g1h->g1_committed().contains(last),
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -50,8 +50,8 @@
#include "gc_implementation/shared/gcTraceTime.hpp"
#include "gc_implementation/shared/isGCActiveMark.hpp"
#include "memory/gcLocker.inline.hpp"
-#include "memory/genOopClosures.inline.hpp"
#include "memory/generationSpec.hpp"
+#include "memory/iterator.hpp"
#include "memory/referenceProcessor.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.pcgc.inline.hpp"
@@ -1575,8 +1575,6 @@
void
G1CollectedHeap::
resize_if_necessary_after_full_collection(size_t word_size) {
- assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
-
// Include the current allocation, if any, and bytes that will be
// pre-allocated to support collections, as "used".
const size_t used_after_gc = used();
@@ -2996,7 +2994,17 @@
}
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
- return HeapRegion::GrainBytes;
+ return (_g1_policy->young_list_target_length() - young_list()->survivor_length()) * HeapRegion::GrainBytes;
+}
+
+size_t G1CollectedHeap::tlab_used(Thread* ignored) const {
+ return young_list()->eden_used_bytes();
+}
+
+// For G1 TLABs should not contain humongous objects, so the maximum TLAB size
+// must be smaller than the humongous object limit.
+size_t G1CollectedHeap::max_tlab_size() const {
+ return align_size_down(_humongous_object_threshold_in_words - 1, MinObjAlignment);
}
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
@@ -3008,11 +3016,11 @@
// humongous objects.
HeapRegion* hr = _mutator_alloc_region.get();
- size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
+ size_t max_tlab = max_tlab_size() * wordSize;
if (hr == NULL) {
- return max_tlab_size;
+ return max_tlab;
} else {
- return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab_size);
+ return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab);
}
}
@@ -3077,11 +3085,7 @@
return NULL; // keep some compilers happy
}
-// TODO: VerifyRootsClosure extends OopsInGenClosure so that we can
-// pass it as the perm_blk to SharedHeap::process_strong_roots.
-// When process_strong_roots stop calling perm_blk->younger_refs_iterate
-// we can change this closure to extend the simpler OopClosure.
-class VerifyRootsClosure: public OopsInGenClosure {
+class VerifyRootsClosure: public OopClosure {
private:
G1CollectedHeap* _g1h;
VerifyOption _vo;
@@ -3117,7 +3121,7 @@
void do_oop(narrowOop* p) { do_oop_nv(p); }
};
-class G1VerifyCodeRootOopClosure: public OopsInGenClosure {
+class G1VerifyCodeRootOopClosure: public OopClosure {
G1CollectedHeap* _g1h;
OopClosure* _root_cl;
nmethod* _nm;
@@ -3396,14 +3400,12 @@
// We apply the relevant closures to all the oops in the
// system dictionary, the string table and the code cache.
- const int so = SO_AllClasses | SO_Strings | SO_CodeCache;
+ const int so = SO_AllClasses | SO_Strings | SO_AllCodeCache;
// Need cleared claim bits for the strong roots processing
ClassLoaderDataGraph::clear_claimed_marks();
process_strong_roots(true, // activate StrongRootsScope
- false, // we set "is scavenging" to false,
- // so we don't reset the dirty cards.
ScanningOption(so), // roots scanning options
&rootsCl,
&blobsCl,
@@ -3655,6 +3657,7 @@
// always_do_update_barrier = false;
assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
// Fill TLAB's and such
+ accumulate_statistics_all_tlabs();
ensure_parsability(true);
if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) &&
@@ -3679,6 +3682,8 @@
"derived pointer present"));
// always_do_update_barrier = true;
+ resize_all_tlabs();
+
// We have just completed a GC. Update the soft reference
// policy with the new heap occupancy
Universe::update_heap_info_at_gc();
@@ -4651,8 +4656,8 @@
_during_initial_mark(_g1->g1_policy()->during_initial_mark_pause()),
_mark_in_progress(_g1->mark_in_progress()) { }
-template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
-void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>::mark_object(oop obj) {
+template <G1Barrier barrier, bool do_mark_object>
+void G1ParCopyClosure<barrier, do_mark_object>::mark_object(oop obj) {
#ifdef ASSERT
HeapRegion* hr = _g1->heap_region_containing(obj);
assert(hr != NULL, "sanity");
@@ -4663,8 +4668,8 @@
_cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
}
-template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
-void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
+template <G1Barrier barrier, bool do_mark_object>
+void G1ParCopyClosure<barrier, do_mark_object>
::mark_forwarded_object(oop from_obj, oop to_obj) {
#ifdef ASSERT
assert(from_obj->is_forwarded(), "from obj should be forwarded");
@@ -4687,8 +4692,8 @@
_cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id);
}
-template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
-oop G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
+template <G1Barrier barrier, bool do_mark_object>
+oop G1ParCopyClosure<barrier, do_mark_object>
::copy_to_survivor_space(oop old) {
size_t word_sz = old->size();
HeapRegion* from_region = _g1->heap_region_containing_raw(old);
@@ -4784,13 +4789,11 @@
}
}
-template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
+template <G1Barrier barrier, bool do_mark_object>
template <class T>
-void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
+void G1ParCopyClosure<barrier, do_mark_object>
::do_oop_work(T* p) {
oop obj = oopDesc::load_decode_heap_oop(p);
- assert(barrier != G1BarrierRS || obj != NULL,
- "Precondition: G1BarrierRS implies obj is non-NULL");
assert(_worker_id == _par_scan_state->queue_num(), "sanity");
@@ -4810,10 +4813,7 @@
mark_forwarded_object(obj, forwardee);
}
- // When scanning the RS, we only care about objs in CS.
- if (barrier == G1BarrierRS) {
- _par_scan_state->update_rs(_from, p, _worker_id);
- } else if (barrier == G1BarrierKlass) {
+ if (barrier == G1BarrierKlass) {
do_klass_barrier(p, forwardee);
}
} else {
@@ -4828,14 +4828,10 @@
if (barrier == G1BarrierEvac && obj != NULL) {
_par_scan_state->update_rs(_from, p, _worker_id);
}
-
- if (do_gen_barrier && obj != NULL) {
- par_do_barrier(p);
- }
-}
-
-template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
-template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(narrowOop* p);
+}
+
+template void G1ParCopyClosure<G1BarrierEvac, false>::do_oop_work(oop* p);
+template void G1ParCopyClosure<G1BarrierEvac, false>::do_oop_work(narrowOop* p);
template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
assert(has_partial_array_mask(p), "invariant");
@@ -5119,13 +5115,13 @@
BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
- assert(so & SO_CodeCache || scan_rs != NULL, "must scan code roots somehow");
+ assert(so & SO_AllCodeCache || scan_rs != NULL, "must scan code roots somehow");
// Walk the code cache/strong code roots w/o buffering, because StarTask
// cannot handle unaligned oop locations.
CodeBlobToOopClosure eager_scan_code_roots(scan_non_heap_roots, true /* do_marking */);
process_strong_roots(false, // no scoping; this is parallel code
- is_scavenging, so,
+ so,
&buf_scan_non_heap_roots,
&eager_scan_code_roots,
scan_klasses
@@ -5173,7 +5169,7 @@
// the collection set.
// Note all threads participate in this set of root tasks.
double mark_strong_code_roots_ms = 0.0;
- if (g1_policy()->during_initial_mark_pause() && !(so & SO_CodeCache)) {
+ if (g1_policy()->during_initial_mark_pause() && !(so & SO_AllCodeCache)) {
double mark_strong_roots_start = os::elapsedTime();
mark_strong_code_roots(worker_i);
mark_strong_code_roots_ms = (os::elapsedTime() - mark_strong_roots_start) * 1000.0;
@@ -5193,6 +5189,99 @@
SharedHeap::process_weak_roots(root_closure, &roots_in_blobs);
}
+class G1StringSymbolTableUnlinkTask : public AbstractGangTask {
+private:
+ BoolObjectClosure* _is_alive;
+ int _initial_string_table_size;
+ int _initial_symbol_table_size;
+
+ bool _process_strings;
+ int _strings_processed;
+ int _strings_removed;
+
+ bool _process_symbols;
+ int _symbols_processed;
+ int _symbols_removed;
+public:
+ G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) :
+ AbstractGangTask("Par String/Symbol table unlink"), _is_alive(is_alive),
+ _process_strings(process_strings), _strings_processed(0), _strings_removed(0),
+ _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) {
+
+ _initial_string_table_size = StringTable::the_table()->table_size();
+ _initial_symbol_table_size = SymbolTable::the_table()->table_size();
+ if (process_strings) {
+ StringTable::clear_parallel_claimed_index();
+ }
+ if (process_symbols) {
+ SymbolTable::clear_parallel_claimed_index();
+ }
+ }
+
+ ~G1StringSymbolTableUnlinkTask() {
+ guarantee(!_process_strings || StringTable::parallel_claimed_index() >= _initial_string_table_size,
+ err_msg("claim value "INT32_FORMAT" after unlink less than initial string table size "INT32_FORMAT,
+ StringTable::parallel_claimed_index(), _initial_string_table_size));
+ guarantee(!_process_strings || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
+ err_msg("claim value "INT32_FORMAT" after unlink less than initial symbol table size "INT32_FORMAT,
+ SymbolTable::parallel_claimed_index(), _initial_symbol_table_size));
+ }
+
+ void work(uint worker_id) {
+ if (G1CollectedHeap::use_parallel_gc_threads()) {
+ int strings_processed = 0;
+ int strings_removed = 0;
+ int symbols_processed = 0;
+ int symbols_removed = 0;
+ if (_process_strings) {
+ StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed);
+ Atomic::add(strings_processed, &_strings_processed);
+ Atomic::add(strings_removed, &_strings_removed);
+ }
+ if (_process_symbols) {
+ SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
+ Atomic::add(symbols_processed, &_symbols_processed);
+ Atomic::add(symbols_removed, &_symbols_removed);
+ }
+ } else {
+ if (_process_strings) {
+ StringTable::unlink(_is_alive, &_strings_processed, &_strings_removed);
+ }
+ if (_process_symbols) {
+ SymbolTable::unlink(&_symbols_processed, &_symbols_removed);
+ }
+ }
+ }
+
+ size_t strings_processed() const { return (size_t)_strings_processed; }
+ size_t strings_removed() const { return (size_t)_strings_removed; }
+
+ size_t symbols_processed() const { return (size_t)_symbols_processed; }
+ size_t symbols_removed() const { return (size_t)_symbols_removed; }
+};
+
+void G1CollectedHeap::unlink_string_and_symbol_table(BoolObjectClosure* is_alive,
+ bool process_strings, bool process_symbols) {
+ uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
+ _g1h->workers()->active_workers() : 1);
+
+ G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols);
+ if (G1CollectedHeap::use_parallel_gc_threads()) {
+ set_par_threads(n_workers);
+ workers()->run_task(&g1_unlink_task);
+ set_par_threads(0);
+ } else {
+ g1_unlink_task.work(0);
+ }
+ if (G1TraceStringSymbolTableScrubbing) {
+ gclog_or_tty->print_cr("Cleaned string and symbol table, "
+ "strings: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed, "
+ "symbols: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed",
+ g1_unlink_task.strings_processed(), g1_unlink_task.strings_removed(),
+ g1_unlink_task.symbols_processed(), g1_unlink_task.symbols_removed());
+ }
+}
+
// Weak Reference Processing support
// An always "is_alive" closure that is used to preserve referents.
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -209,7 +209,7 @@
friend class OldGCAllocRegion;
// Closures used in implementation.
- template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
+ template <G1Barrier barrier, bool do_mark_object>
friend class G1ParCopyClosure;
friend class G1IsAliveClosure;
friend class G1EvacuateFollowersClosure;
@@ -1373,7 +1373,7 @@
// Divide the heap region sequence into "chunks" of some size (the number
// of regions divided by the number of parallel threads times some
// overpartition factor, currently 4). Assumes that this will be called
- // in parallel by ParallelGCThreads worker threads with discinct worker
+ // in parallel by ParallelGCThreads worker threads with distinct worker
// ids in the range [0..max(ParallelGCThreads-1, 1)], that all parallel
// calls will use the same "claim_value", and that that claim value is
// different from the claim_value of any heap region before the start of
@@ -1470,9 +1470,11 @@
// Section on thread-local allocation buffers (TLABs)
// See CollectedHeap for semantics.
- virtual bool supports_tlab_allocation() const;
- virtual size_t tlab_capacity(Thread* thr) const;
- virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
+ bool supports_tlab_allocation() const;
+ size_t tlab_capacity(Thread* ignored) const;
+ size_t tlab_used(Thread* ignored) const;
+ size_t max_tlab_size() const;
+ size_t unsafe_max_tlab_alloc(Thread* ignored) const;
// Can a compiler initialize a new object without store barriers?
// This permission only extends from the creation of a new object
@@ -1518,7 +1520,7 @@
// Returns "true" iff the given word_size is "very large".
static bool isHumongous(size_t word_size) {
// Note this has to be strictly greater-than as the TLABs
- // are capped at the humongous thresold and we want to
+ // are capped at the humongous threshold and we want to
// ensure that we don't try to allocate a TLAB as
// humongous and that we don't allocate a humongous
// object in a TLAB.
@@ -1557,7 +1559,7 @@
void set_region_short_lived_locked(HeapRegion* hr);
// add appropriate methods for any other surv rate groups
- YoungList* young_list() { return _young_list; }
+ YoungList* young_list() const { return _young_list; }
// debugging
bool check_young_list_well_formed() {
@@ -1648,26 +1650,30 @@
// Optimized nmethod scanning support routines
- // Register the given nmethod with the G1 heap
+ // Register the given nmethod with the G1 heap.
virtual void register_nmethod(nmethod* nm);
- // Unregister the given nmethod from the G1 heap
+ // Unregister the given nmethod from the G1 heap.
virtual void unregister_nmethod(nmethod* nm);
// Migrate the nmethods in the code root lists of the regions
// in the collection set to regions in to-space. In the event
// of an evacuation failure, nmethods that reference objects
- // that were not successfullly evacuated are not migrated.
+ // that were not successfully evacuated are not migrated.
void migrate_strong_code_roots();
// During an initial mark pause, mark all the code roots that
// point into regions *not* in the collection set.
void mark_strong_code_roots(uint worker_id);
- // Rebuild the stong code root lists for each region
- // after a full GC
+ // Rebuild the strong code root lists for each region
+ // after a full GC.
void rebuild_strong_code_roots();
+ // Delete entries for dead interned string and clean up unreferenced symbols
+ // in symbol table, possibly in parallel.
+ void unlink_string_and_symbol_table(BoolObjectClosure* is_alive, bool unlink_strings = true, bool unlink_symbols = true);
+
// Verification
// The following is just to alert the verification code
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -318,7 +318,7 @@
void G1CollectorPolicy::initialize_alignments() {
_space_alignment = HeapRegion::GrainBytes;
- size_t card_table_alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
+ size_t card_table_alignment = GenRemSet::max_alignment_constraint();
size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size();
_heap_alignment = MAX3(card_table_alignment, _space_alignment, page_size);
}
@@ -1075,7 +1075,7 @@
}
_short_lived_surv_rate_group->start_adding_regions();
- // do that for any other surv rate groupsx
+ // Do that for any other surv rate groups
if (update_stats) {
double cost_per_card_ms = 0.0;
@@ -1741,7 +1741,7 @@
_inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms;
_inc_cset_bytes_used_before += used_bytes;
- // Cache the values we have added to the aggregated informtion
+ // Cache the values we have added to the aggregated information
// in the heap region in case we have to remove this region from
// the incremental collection set, or it is updated by the
// rset sampling code
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -116,7 +116,7 @@
// If only -XX:NewRatio is set we should use the specified ratio of the heap
// as both min and max. This will be interpreted as "fixed" just like the
// NewSize==MaxNewSize case above. But we will update the min and max
-// everytime the heap size changes.
+// every time the heap size changes.
//
// NewSize and MaxNewSize override NewRatio. So, NewRatio is ignored if it is
// combined with either NewSize or MaxNewSize. (A warning message is printed.)
@@ -523,9 +523,9 @@
// synchronize updates to this field.
size_t _inc_cset_recorded_rs_lengths;
- // A concurrent refinement thread periodcially samples the young
+ // A concurrent refinement thread periodically samples the young
// region RSets and needs to update _inc_cset_recorded_rs_lengths as
- // the RSets grow. Instead of having to syncronize updates to that
+ // the RSets grow. Instead of having to synchronize updates to that
// field we accumulate them in this field and add it to
// _inc_cset_recorded_rs_lengths_diffs at the start of a GC.
ssize_t _inc_cset_recorded_rs_lengths_diffs;
@@ -604,7 +604,7 @@
// Calculate and return the maximum young list target length that
// can fit into the pause time goal. The parameters are: rs_lengths
// represent the prediction of how large the young RSet lengths will
- // be, base_min_length is the alreay existing number of regions in
+ // be, base_min_length is the already existing number of regions in
// the young list, min_length and max_length are the desired min and
// max young list length according to the user's inputs.
uint calculate_young_list_target_length(size_t rs_lengths,
@@ -820,6 +820,8 @@
// do that for any other surv rate groups
}
+ size_t young_list_target_length() const { return _young_list_target_length; }
+
bool is_young_list_full() {
uint young_list_length = _g1->young_list()->length();
uint young_list_target_length = _young_list_target_length;
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -103,7 +103,7 @@
// The data structure implemented is a circular queue.
// Head "points" to the most recent addition, tail to the oldest one.
// The array is of fixed size and I don't think we'll need more than
- // two or three entries with the current behaviour of G1 pauses.
+ // two or three entries with the current behavior of G1 pauses.
// If the array is full, an easy fix is to look for the pauses with
// the shortest gap between them and consolidate them.
// For now, we have taken the expedient alternative of forgetting
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -131,7 +131,6 @@
ClassLoaderDataGraph::clear_claimed_marks();
sh->process_strong_roots(true, // activate StrongRootsScope
- false, // not scavenging.
SharedHeap::SO_SystemClasses,
&GenMarkSweep::follow_root_closure,
&GenMarkSweep::follow_code_root_closure,
@@ -163,11 +162,8 @@
// Prune dead klasses from subklass/sibling/implementor lists.
Klass::clean_weak_klass_links(&GenMarkSweep::is_alive);
- // Delete entries for dead interned strings.
- StringTable::unlink(&GenMarkSweep::is_alive);
-
- // Clean up unreferenced symbols in symbol table.
- SymbolTable::unlink();
+ // Delete entries for dead interned string and clean up unreferenced symbols in symbol table.
+ G1CollectedHeap::heap()->unlink_string_and_symbol_table(&GenMarkSweep::is_alive);
if (VerifyDuringGC) {
HandleMark hm; // handle scope
@@ -180,7 +176,7 @@
// any hash values from the mark word. These hash values are
// used when verifying the dictionaries and so removing them
// from the mark word can make verification of the dictionaries
- // fail. At the end of the GC, the orginal mark word values
+ // fail. At the end of the GC, the original mark word values
// (including hash values) are restored to the appropriate
// objects.
if (!VerifySilently) {
@@ -311,7 +307,6 @@
ClassLoaderDataGraph::clear_claimed_marks();
sh->process_strong_roots(true, // activate StrongRootsScope
- false, // not scavenging.
SharedHeap::SO_AllClasses,
&GenMarkSweep::adjust_pointer_closure,
NULL, // do not touch code cache here
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MonitoringSupport.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MonitoringSupport.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -112,7 +112,7 @@
// take_sample() only returns "used". When sampling was used, there
// were some anomolous values emitted which may have been the consequence
// of not updating all values simultaneously (i.e., see the calculation done
- // in eden_space_used(), is it possbile that the values used to
+ // in eden_space_used(), is it possible that the values used to
// calculate either eden_used or survivor_used are being updated by
// the collector when the sample is being done?).
const bool sampled = false;
@@ -135,7 +135,7 @@
// Young collection set
// name "generation.0". This is logically the young generation.
- // The "0, 3" are paremeters for the n-th genertaion (=0) with 3 spaces.
+ // The "0, 3" are parameters for the n-th generation (=0) with 3 spaces.
// See _old_collection_counters for additional counters
_young_collection_counters = new G1YoungGenerationCounters(this, "young");
@@ -254,7 +254,7 @@
eden_counters()->update_capacity(pad_capacity(eden_space_committed()));
eden_counters()->update_used(eden_space_used());
// only the to survivor space (s1) is active, so we don't need to
- // update the counteres for the from survivor space (s0)
+ // update the counters for the from survivor space (s0)
to_counters()->update_capacity(pad_capacity(survivor_space_committed()));
to_counters()->update_used(survivor_space_used());
old_space_counters()->update_capacity(pad_capacity(old_space_committed()));
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -108,7 +108,7 @@
// is that all the above sizes need to be recalculated when the old
// gen changes capacity (after a GC or after a humongous allocation)
// but only the eden occupancy changes when a new eden region is
-// allocated. So, in the latter case we have minimal recalcuation to
+// allocated. So, in the latter case we have minimal recalculation to
// do which is important as we want to keep the eden region allocation
// path as low-overhead as possible.
--- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -38,7 +38,7 @@
// A class that scans oops in a given heap region (much as OopsInGenClosure
// scans oops in a generation.)
-class OopsInHeapRegionClosure: public OopsInGenClosure {
+class OopsInHeapRegionClosure: public ExtendedOopClosure {
protected:
HeapRegion* _from;
public:
@@ -131,7 +131,7 @@
template <class T> void do_klass_barrier(T* p, oop new_obj);
};
-template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
+template <G1Barrier barrier, bool do_mark_object>
class G1ParCopyClosure : public G1ParCopyHelper {
G1ParScanClosure _scanner;
template <class T> void do_oop_work(T* p);
@@ -166,22 +166,16 @@
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
};
-typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure;
-typedef G1ParCopyClosure<false, G1BarrierKlass, false> G1ParScanMetadataClosure;
+typedef G1ParCopyClosure<G1BarrierNone, false> G1ParScanExtRootClosure;
+typedef G1ParCopyClosure<G1BarrierKlass, false> G1ParScanMetadataClosure;
-typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure;
-typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkClosure;
-typedef G1ParCopyClosure<false, G1BarrierKlass, true> G1ParScanAndMarkMetadataClosure;
-
-// The following closure types are no longer used but are retained
-// for historical reasons:
-// typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure;
-// typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure;
+typedef G1ParCopyClosure<G1BarrierNone, true> G1ParScanAndMarkExtRootClosure;
+typedef G1ParCopyClosure<G1BarrierKlass, true> G1ParScanAndMarkMetadataClosure;
// The following closure type is defined in g1_specialized_oop_closures.hpp:
//
-// typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure;
+// typedef G1ParCopyClosure<G1BarrierEvac, false> G1ParScanHeapEvacClosure;
// We use a separate closure to handle references during evacuation
// failure processing.
@@ -189,7 +183,7 @@
// (since that closure no longer assumes that the references it
// handles point into the collection set).
-typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure;
+typedef G1ParCopyClosure<G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure;
class FilterIntoCSClosure: public ExtendedOopClosure {
G1CollectedHeap* _g1;
--- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -177,7 +177,7 @@
// The _record_refs_into_cset flag is true during the RSet
// updating part of an evacuation pause. It is false at all
// other times:
- // * rebuilding the rembered sets after a full GC
+ // * rebuilding the remembered sets after a full GC
// * during concurrent refinement.
// * updating the remembered sets of regions in the collection
// set in the event of an evacuation failure (when deferred
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -195,7 +195,7 @@
HeapRegionRemSetIterator iter(hrrs);
size_t card_index;
- // We claim cards in block so as to recude the contention. The block size is determined by
+ // We claim cards in block so as to reduce the contention. The block size is determined by
// the G1RSetScanBlockSize parameter.
size_t jump_to_card = hrrs->iter_claimed_next(_block_size);
for (size_t current_card = 0; iter.has_next(card_index); current_card++) {
@@ -587,7 +587,7 @@
// While we are processing RSet buffers during the collection, we
// actually don't want to scan any cards on the collection set,
- // since we don't want to update remebered sets with entries that
+ // since we don't want to update remembered sets with entries that
// point into the collection set, given that live objects from the
// collection set are about to move and such entries will be stale
// very soon. This change also deals with a reliability issue which
--- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -71,6 +71,9 @@
diagnostic(bool, G1TraceConcRefinement, false, \
"Trace G1 concurrent refinement") \
\
+ experimental(bool, G1TraceStringSymbolTableScrubbing, false, \
+ "Trace information string and symbol table scrubbing.") \
+ \
product(double, G1ConcMarkStepDurationMillis, 10.0, \
"Target duration of individual concurrent marking steps " \
"in milliseconds.") \
--- a/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -33,18 +33,17 @@
// Forward declarations.
enum G1Barrier {
G1BarrierNone,
- G1BarrierRS,
G1BarrierEvac,
G1BarrierKlass
};
-template<bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
+template<G1Barrier barrier, bool do_mark_object>
class G1ParCopyClosure;
class G1ParScanClosure;
class G1ParPushHeapRSClosure;
-typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure;
+typedef G1ParCopyClosure<G1BarrierEvac, false> G1ParScanHeapEvacClosure;
class FilterIntoCSClosure;
class FilterOutOfRegionClosure;
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -1027,7 +1027,7 @@
}
}
- // Loook up end - 1
+ // Look up end - 1
HeapWord* addr_4 = the_end - 1;
HeapWord* b_start_4 = _offsets.block_start_const(addr_4);
if (b_start_4 != p) {
@@ -1111,7 +1111,7 @@
// will be false, and it will pick up top() as the high water mark
// of region. If it does so after _gc_time_stamp = ..., then it
// will pick up the right saved_mark_word() as the high water mark
- // of the region. Either way, the behaviour will be correct.
+ // of the region. Either way, the behavior will be correct.
ContiguousSpace::set_saved_mark();
OrderAccess::storestore();
_gc_time_stamp = curr_gc_time_stamp;
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -97,7 +97,7 @@
HeapWord* heap_end() const {return _regions.end_address_mapped(); }
public:
- // Empty contructor, we'll initialize it with the initialize() method.
+ // Empty constructor, we'll initialize it with the initialize() method.
HeapRegionSeq() : _regions(), _committed_length(0), _next_search_index(0), _allocated_length(0) { }
void initialize(HeapWord* bottom, HeapWord* end);
--- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -71,7 +71,7 @@
assert(_lock->owned_by_self(), "Required.");
// We have to unlock _lock (which may be Shared_DirtyCardQ_lock) before
- // we acquire DirtyCardQ_CBL_mon inside enqeue_complete_buffer as they
+ // we acquire DirtyCardQ_CBL_mon inside enqueue_complete_buffer as they
// have the same rank and we may get the "possible deadlock" message
_lock->unlock();
@@ -151,7 +151,7 @@
// The current PtrQ may be the shared dirty card queue and
// may be being manipulated by more than one worker thread
- // during a pause. Since the enqueuing of the completed
+ // during a pause. Since the enqueueing of the completed
// buffer unlocks the Shared_DirtyCardQ_lock more than one
// worker thread can 'race' on reading the shared queue attributes
// (_buf and _index) and multiple threads can call into this
@@ -170,7 +170,7 @@
locking_enqueue_completed_buffer(buf); // enqueue completed buffer
- // While the current thread was enqueuing the buffer another thread
+ // While the current thread was enqueueing the buffer another thread
// may have a allocated a new buffer and inserted it into this pointer
// queue. If that happens then we just return so that the current
// thread doesn't overwrite the buffer allocated by the other thread
--- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -144,7 +144,7 @@
// Attempts to ensure that the given card_index in the given region is in
// the sparse table. If successful (because the card was already
- // present, or because it was successfullly added) returns "true".
+ // present, or because it was successfully added) returns "true".
// Otherwise, returns "false" to indicate that the addition would
// overflow the entry for the region. The caller must transfer these
// entries to a larger-capacity representation.
@@ -201,8 +201,7 @@
bool has_next(size_t& card_index);
};
-// Concurrent accesss to a SparsePRT must be serialized by some external
-// mutex.
+// Concurrent access to a SparsePRT must be serialized by some external mutex.
class SparsePRTIter;
class SparsePRTCleanupTask;
@@ -248,7 +247,7 @@
// Attempts to ensure that the given card_index in the given region is in
// the sparse table. If successful (because the card was already
- // present, or because it was successfullly added) returns "true".
+ // present, or because it was successfully added) returns "true".
// Otherwise, returns "false" to indicate that the addition would
// overflow the entry for the region. The caller must transfer these
// entries to a larger-capacity representation.
--- a/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -154,7 +154,7 @@
// There used to be this guarantee there.
// guarantee ((eden_size + 2*survivor_size) <= _max_gen_size, "incorrect input arguments");
// Code below forces this requirement. In addition the desired eden
- // size and disired survivor sizes are desired goals and may
+ // size and desired survivor sizes are desired goals and may
// exceed the total generation size.
assert(min_gen_size() <= orig_size && orig_size <= max_gen_size(),
--- a/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -213,7 +213,7 @@
&& sp->block_is_obj(first_block) // first block is an object
&& !(oop(first_block)->is_objArray() // first block is not an array (arrays are precisely dirtied)
|| oop(first_block)->is_typeArray())) {
- // Find our least non-clean card, so that a left neighbour
+ // Find our least non-clean card, so that a left neighbor
// does not scan an object straddling the mutual boundary
// too far to the right, and attempt to scan a portion of
// that object twice.
@@ -247,14 +247,14 @@
} NOISY(else {
tty->print_cr(" LNC: Found no dirty card in current chunk; leaving LNC entry NULL");
// In the future, we could have this thread look for a non-NULL value to copy from its
- // right neighbour (up to the end of the first object).
+ // right neighbor (up to the end of the first object).
if (last_card_of_cur_chunk < last_card_of_first_obj) {
tty->print_cr(" LNC: BEWARE!!! first obj straddles past right end of chunk:\n"
" might be efficient to get value from right neighbour?");
}
})
} else {
- // In this case we can help our neighbour by just asking them
+ // In this case we can help our neighbor by just asking them
// to stop at our first card (even though it may not be dirty).
NOISY(tty->print_cr(" LNC: first block is not a non-array object; setting LNC to first card of current chunk");)
assert(lowest_non_clean[cur_chunk_index] == NULL, "Write once : value should be stable hereafter");
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -612,14 +612,13 @@
KlassScanClosure klass_scan_closure(&par_scan_state.to_space_root_closure(),
gch->rem_set()->klass_rem_set());
- int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
+ int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_ScavengeCodeCache;
par_scan_state.start_strong_roots();
gch->gen_process_strong_roots(_gen->level(),
true, // Process younger gens, if any,
// as strong roots.
false, // no scope; this is parallel code
- true, // is scavenging
SharedHeap::ScanningOption(so),
&par_scan_state.to_space_root_closure(),
true, // walk *all* scavengable nmethods
@@ -1071,7 +1070,7 @@
size_policy->avg_survived()->sample(from()->used());
}
- // We need to use a monotonically non-deccreasing time in ms
+ // We need to use a monotonically non-decreasing time in ms
// or we will see time-warp warnings and os::javaTimeMillis()
// does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
@@ -1403,7 +1402,7 @@
#ifndef PRODUCT
// It's OK to call this multi-threaded; the worst thing
// that can happen is that we'll get a bunch of closely
-// spaced simulated oveflows, but that's OK, in fact
+// spaced simulated overflows, but that's OK, in fact
// probably good as it would exercise the overflow code
// under contention.
bool ParNewGeneration::should_simulate_overflow() {
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -118,8 +118,8 @@
// Make checks on the current sizes of the generations and
-// the contraints on the sizes of the generations. Push
-// up the boundary within the contraints. A partial
+// the constraints on the sizes of the generations. Push
+// up the boundary within the constraints. A partial
// push can occur.
void AdjoiningGenerations::request_old_gen_expansion(size_t expand_in_bytes) {
assert(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary, "runtime check");
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -69,7 +69,7 @@
// the available space and attempt to move the boundary if more space
// is needed. The growth is not guaranteed to occur.
void adjust_boundary_for_old_gen_needs(size_t desired_change_in_bytes);
- // Similary for a growth of the young generation.
+ // Similarly for a growth of the young generation.
void adjust_boundary_for_young_gen_needs(size_t eden_size, size_t survivor_size);
// Return the total byte size of the reserved space
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -65,7 +65,7 @@
}
};
-// Checks all objects for the existance of some type of mark,
+// Checks all objects for the existence of some type of mark,
// precise or imprecise, dirty or newgen.
class CheckForUnmarkedObjects : public ObjectClosure {
private:
@@ -84,7 +84,7 @@
}
// Card marks are not precise. The current system can leave us with
- // a mismash of precise marks and beginning of object marks. This means
+ // a mismatch of precise marks and beginning of object marks. This means
// we test for missing precise marks first. If any are found, we don't
// fail unless the object head is also unmarked.
virtual void do_object(oop obj) {
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -202,12 +202,12 @@
list->print("list:");
}
if (list->is_empty()) {
- // Enqueuing the empty list: nothing to do.
+ // Enqueueing the empty list: nothing to do.
return;
}
uint list_length = list->length();
if (is_empty()) {
- // Enqueuing to empty list: just acquire elements.
+ // Enqueueing to empty list: just acquire elements.
set_insert_end(list->insert_end());
set_remove_end(list->remove_end());
set_length(list_length);
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -303,7 +303,7 @@
// load balancing (i.e., over partitioning). The last task to be
// executed by a GC thread in a job is a work stealing task. A
// GC thread that gets a work stealing task continues to execute
-// that task until the job is done. In the static number of GC theads
+// that task until the job is done. In the static number of GC threads
// case, tasks are added to a queue (FIFO). The work stealing tasks are
// the last to be added. Once the tasks are added, the GC threads grab
// a task and go. A single thread can do all the non-work stealing tasks
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -139,11 +139,6 @@
return true;
}
}
- // No object starts in this slice; verify this using
- // more traditional methods: Note that no object can
- // start before the start_addr.
- assert(end_addr == start_addr ||
- object_start(end_addr - 1) <= start_addr,
- "Oops an object does start in this slice?");
+
return false;
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -488,6 +488,10 @@
return young_gen()->eden_space()->tlab_capacity(thr);
}
+size_t ParallelScavengeHeap::tlab_used(Thread* thr) const {
+ return young_gen()->eden_space()->tlab_used(thr);
+}
+
size_t ParallelScavengeHeap::unsafe_max_tlab_alloc(Thread* thr) const {
return young_gen()->eden_space()->unsafe_max_tlab_alloc(thr);
}
@@ -673,7 +677,7 @@
// Before delegating the resize to the young generation,
// the reserved space for the young and old generations
-// may be changed to accomodate the desired resize.
+// may be changed to accommodate the desired resize.
void ParallelScavengeHeap::resize_young_gen(size_t eden_size,
size_t survivor_size) {
if (UseAdaptiveGCBoundary) {
@@ -690,7 +694,7 @@
// Before delegating the resize to the old generation,
// the reserved space for the young and old generations
-// may be changed to accomodate the desired resize.
+// may be changed to accommodate the desired resize.
void ParallelScavengeHeap::resize_old_gen(size_t desired_free_space) {
if (UseAdaptiveGCBoundary) {
if (size_policy()->bytes_absorbed_from_eden() != 0) {
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -187,6 +187,7 @@
bool supports_tlab_allocation() const { return true; }
size_t tlab_capacity(Thread* thr) const;
+ size_t tlab_used(Thread* thr) const;
size_t unsafe_max_tlab_alloc(Thread* thr) const;
// Can a compiler initialize a new object without store barriers?
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -45,7 +45,7 @@
// the do_it() method of a ThreadRootsMarkingTask is executed, it
// starts marking from the thread's roots.
//
-// The enqueuing of the MarkFromRootsTask and ThreadRootsMarkingTask
+// The enqueueing of the MarkFromRootsTask and ThreadRootsMarkingTask
// do little more than create the task and put it on a queue. The
// queue is a GCTaskQueue and threads steal tasks from this GCTaskQueue.
//
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
#include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp"
#include "gc_implementation/parallelScavenge/psScavenge.hpp"
@@ -76,6 +77,38 @@
_old_gen_policy_is_ready = false;
}
+size_t PSAdaptiveSizePolicy::calculate_free_based_on_live(size_t live, uintx ratio_as_percentage) {
+ // We want to calculate how much free memory there can be based on the
+ // amount of live data currently in the old gen. Using the formula:
+ // ratio * (free + live) = free
+ // Some equation solving later we get:
+ // free = (live * ratio) / (1 - ratio)
+
+ const double ratio = ratio_as_percentage / 100.0;
+ const double ratio_inverse = 1.0 - ratio;
+ const double tmp = live * ratio;
+ size_t free = (size_t)(tmp / ratio_inverse);
+
+ return free;
+}
+
+size_t PSAdaptiveSizePolicy::calculated_old_free_size_in_bytes() const {
+ size_t free_size = (size_t)(_promo_size + avg_promoted()->padded_average());
+ size_t live = ParallelScavengeHeap::heap()->old_gen()->used_in_bytes();
+
+ if (MinHeapFreeRatio != 0) {
+ size_t min_free = calculate_free_based_on_live(live, MinHeapFreeRatio);
+ free_size = MAX2(free_size, min_free);
+ }
+
+ if (MaxHeapFreeRatio != 100) {
+ size_t max_free = calculate_free_based_on_live(live, MaxHeapFreeRatio);
+ free_size = MIN2(max_free, free_size);
+ }
+
+ return free_size;
+}
+
void PSAdaptiveSizePolicy::major_collection_begin() {
// Update the interval time
_major_timer.stop();
@@ -482,7 +515,7 @@
// adjust down the total heap size. Adjust down the larger of the
// generations.
- // Add some checks for a threshhold for a change. For example,
+ // Add some checks for a threshold for a change. For example,
// a change less than the necessary alignment is probably not worth
// attempting.
@@ -1161,7 +1194,7 @@
// We use the tenuring threshold to equalize the cost of major
// and minor collections.
// ThresholdTolerance is used to indicate how sensitive the
- // tenuring threshold is to differences in cost betweent the
+ // tenuring threshold is to differences in cost between the
// collection types.
// Get the times of interest. This involves a little work, so
@@ -1292,3 +1325,18 @@
st,
PSScavenge::tenuring_threshold());
}
+
+#ifndef PRODUCT
+
+void TestOldFreeSpaceCalculation_test() {
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 20) == 25, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 50) == 100, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 60) == 150, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 75) == 300, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 20) == 100, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 50) == 400, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 60) == 600, "Calculation of free memory failed");
+ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 75) == 1200, "Calculation of free memory failed");
+}
+
+#endif /* !PRODUCT */
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -37,7 +37,7 @@
//
// It also computes an optimal tenuring threshold between the young
// and old generations, so as to equalize the cost of collections
-// of those generations, as well as optimial survivor space sizes
+// of those generations, as well as optimal survivor space sizes
// for the young generation.
//
// While this class is specifically intended for a generational system
@@ -113,7 +113,7 @@
// Changing the generation sizing depends on the data that is
// gathered about the effects of changes on the pause times and
// throughput. These variable count the number of data points
- // gathered. The policy may use these counters as a threshhold
+ // gathered. The policy may use these counters as a threshold
// for reliable data.
julong _young_gen_change_for_major_pause_count;
@@ -240,7 +240,6 @@
void major_collection_begin();
void major_collection_end(size_t amount_live, GCCause::Cause gc_cause);
- //
void tenured_allocation(size_t size) {
_avg_pretenured->sample(size);
}
@@ -248,9 +247,9 @@
// Accessors
// NEEDS_CLEANUP should use sizes.hpp
- size_t calculated_old_free_size_in_bytes() const {
- return (size_t)(_promo_size + avg_promoted()->padded_average());
- }
+ static size_t calculate_free_based_on_live(size_t live, uintx ratio_as_percentage);
+
+ size_t calculated_old_free_size_in_bytes() const;
size_t average_old_live_in_bytes() const {
return (size_t) avg_old_live()->average();
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -195,7 +195,7 @@
// Update all the counters that can be updated from the size policy.
// This should be called after all policy changes have been made
- // and reflected internall in the size policy.
+ // and reflected internally in the size policy.
void update_counters_from_policy();
// Update counters that can be updated from fields internal to the
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -661,7 +661,7 @@
}
jlong PSMarkSweep::millis_since_last_gc() {
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
jlong ret_val = now - _time_of_last_gc;
@@ -674,7 +674,7 @@
}
void PSMarkSweep::reset_millis_since_last_gc() {
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
_time_of_last_gc = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -280,7 +280,7 @@
"Should be true before post_resize()");
MemRegion mangle_region(object_space()->end(), virtual_space_high);
// Note that the object space has not yet been updated to
- // coincede with the new underlying virtual space.
+ // coincide with the new underlying virtual space.
SpaceMangler::mangle_region(mangle_region);
}
post_resize();
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -187,7 +187,7 @@
void space_invariants() PRODUCT_RETURN;
- // Performace Counter support
+ // Performance Counter support
void update_counters();
// Printing support
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -2176,7 +2176,7 @@
heap->resize_all_tlabs();
- // Resize the metaspace capactiy after a collection
+ // Resize the metaspace capacity after a collection
MetaspaceGC::compute_new_size();
if (TraceGen1Time) accumulated_time()->stop();
@@ -3285,7 +3285,7 @@
}
jlong PSParallelCompact::millis_since_last_gc() {
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
jlong ret_val = now - _time_of_last_gc;
@@ -3298,7 +3298,7 @@
}
void PSParallelCompact::reset_millis_since_last_gc() {
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
_time_of_last_gc = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -877,7 +877,7 @@
// The summary phase calculates the total live data to the left of each region
// XXX. Based on that total and the bottom of the space, it can calculate the
// starting location of the live data in XXX. The summary phase calculates for
-// each region XXX quantites such as
+// each region XXX quantities such as
//
// - the amount of live data at the beginning of a region from an object
// entering the region.
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -78,7 +78,7 @@
// Returns a subregion containing all objects in this space.
MemRegion used_region() { return MemRegion(bottom(), top()); }
- // Boolean querries.
+ // Boolean queries.
bool is_empty() const { return used() == 0; }
bool not_empty() const { return used() > 0; }
bool contains(const void* p) const { return _bottom <= p && p < _end; }
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -529,8 +529,19 @@
counters->update_survivor_overflowed(_survivor_overflow);
}
+ size_t max_young_size = young_gen->max_size();
+
+ // Deciding a free ratio in the young generation is tricky, so if
+ // MinHeapFreeRatio or MaxHeapFreeRatio are in use (implicating
+ // that the old generation size may have been limited because of them) we
+ // should then limit our young generation size using NewRatio to have it
+ // follow the old generation size.
+ if (MinHeapFreeRatio != 0 || MaxHeapFreeRatio != 100) {
+ max_young_size = MIN2(old_gen->capacity_in_bytes() / NewRatio, young_gen->max_size());
+ }
+
size_t survivor_limit =
- size_policy->max_survivor_size(young_gen->max_size());
+ size_policy->max_survivor_size(max_young_size);
_tenuring_threshold =
size_policy->compute_survivor_space_size_and_threshold(
_survivor_overflow,
@@ -553,12 +564,11 @@
// Do call at minor collections?
// Don't check if the size_policy is ready at this
// level. Let the size_policy check that internally.
- if (UseAdaptiveSizePolicy &&
- UseAdaptiveGenerationSizePolicyAtMinorCollection &&
+ if (UseAdaptiveGenerationSizePolicyAtMinorCollection &&
((gc_cause != GCCause::_java_lang_system_gc) ||
UseAdaptiveSizePolicyWithSystemGC)) {
- // Calculate optimial free space amounts
+ // Calculate optimal free space amounts
assert(young_gen->max_size() >
young_gen->from_space()->capacity_in_bytes() +
young_gen->to_space()->capacity_in_bytes(),
@@ -568,7 +578,7 @@
size_t eden_live = young_gen->eden_space()->used_in_bytes();
size_t cur_eden = young_gen->eden_space()->capacity_in_bytes();
size_t max_old_gen_size = old_gen->max_gen_size();
- size_t max_eden_size = young_gen->max_size() -
+ size_t max_eden_size = max_young_size -
young_gen->from_space()->capacity_in_bytes() -
young_gen->to_space()->capacity_in_bytes();
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -35,7 +35,7 @@
class PSVirtualSpace : public CHeapObj<mtGC> {
friend class VMStructs;
protected:
- // The space is committed/uncommited in chunks of size _alignment. The
+ // The space is committed/uncommitted in chunks of size _alignment. The
// ReservedSpace passed to initialize() must be aligned to this value.
const size_t _alignment;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -136,7 +136,7 @@
// generation - the less space committed, the smaller the survivor
// space, possibly as small as an alignment. However, we are interested
// in the case where the young generation is 100% committed, as this
- // is the point where eden reachs its maximum size. At this point,
+ // is the point where eden reaches its maximum size. At this point,
// the size of a survivor space is max_survivor_size.
max_eden_size = size - 2 * max_survivor_size;
}
@@ -288,7 +288,7 @@
// There used to be this guarantee there.
// guarantee ((eden_size + 2*survivor_size) <= _max_gen_size, "incorrect input arguments");
// Code below forces this requirement. In addition the desired eden
- // size and disired survivor sizes are desired goals and may
+ // size and desired survivor sizes are desired goals and may
// exceed the total generation size.
assert(min_gen_size() <= orig_size && orig_size <= max_size(), "just checking");
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -127,7 +127,7 @@
void adjust_pointers();
void compact();
- // Called during/after gc
+ // Called during/after GC
void swap_spaces();
// Resize generation using suggested free space size and survivor size
@@ -146,14 +146,14 @@
size_t free_in_words() const;
// The max this generation can grow to
- size_t max_size() const { return _reserved.byte_size(); }
+ size_t max_size() const { return _reserved.byte_size(); }
// The max this generation can grow to if the boundary between
// the generations are allowed to move.
size_t gen_size_limit() const { return _max_gen_size; }
bool is_maximal_no_gc() const {
- return true; // never expands except at a GC
+ return true; // Never expands except at a GC
}
// Allocation
--- a/hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -121,7 +121,7 @@
// Choose a number of GC threads based on the current size
// of the heap. This may be complicated because the size of
- // the heap depends on factors such as the thoughput goal.
+ // the heap depends on factors such as the throughput goal.
// Still a large heap should be collected by more GC threads.
active_workers_by_heap_size =
MAX2((size_t) 2U, Universe::heap()->capacity() / HeapSizePerGCThread);
@@ -445,7 +445,7 @@
// into account (i.e., don't trigger if the amount of free
// space has suddenly jumped up). If the current is much
// higher than the average, use the average since it represents
- // the longer term behavor.
+ // the longer term behavior.
const size_t live_in_eden =
MIN2(eden_live, (size_t) avg_eden_live()->average());
const size_t free_in_eden = max_eden_size > live_in_eden ?
--- a/hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -74,7 +74,7 @@
};
// Goal for the fraction of the total time during which application
- // threads run.
+ // threads run
const double _throughput_goal;
// Last calculated sizes, in bytes, and aligned
@@ -83,21 +83,21 @@
size_t _survivor_size; // calculated survivor size in bytes
- // This is a hint for the heap: we've detected that gc times
+ // This is a hint for the heap: we've detected that GC times
// are taking longer than GCTimeLimit allows.
bool _gc_overhead_limit_exceeded;
// Use for diagnostics only. If UseGCOverheadLimit is false,
// this variable is still set.
bool _print_gc_overhead_limit_would_be_exceeded;
// Count of consecutive GC that have exceeded the
- // GC time limit criterion.
+ // GC time limit criterion
uint _gc_overhead_limit_count;
// This flag signals that GCTimeLimit is being exceeded
- // but may not have done so for the required number of consequetive
- // collections.
+ // but may not have done so for the required number of consecutive
+ // collections
// Minor collection timers used to determine both
- // pause and interval times for collections.
+ // pause and interval times for collections
static elapsedTimer _minor_timer;
// Major collection timers, used to determine both
@@ -120,7 +120,7 @@
// Statistics for survivor space calculation for young generation
AdaptivePaddedAverage* _avg_survived;
- // Objects that have been directly allocated in the old generation.
+ // Objects that have been directly allocated in the old generation
AdaptivePaddedNoZeroDevAverage* _avg_pretenured;
// Variable for estimating the major and minor pause times.
@@ -142,33 +142,33 @@
// for making ergonomic decisions.
double _latest_minor_mutator_interval_seconds;
- // Allowed difference between major and minor gc times, used
- // for computing tenuring_threshold.
+ // Allowed difference between major and minor GC times, used
+ // for computing tenuring_threshold
const double _threshold_tolerance_percent;
- const double _gc_pause_goal_sec; // goal for maximum gc pause
+ const double _gc_pause_goal_sec; // Goal for maximum GC pause
// Flag indicating that the adaptive policy is ready to use
bool _young_gen_policy_is_ready;
- // decrease/increase the young generation for minor pause time
+ // Decrease/increase the young generation for minor pause time
int _change_young_gen_for_min_pauses;
- // decrease/increase the old generation for major pause time
+ // Decrease/increase the old generation for major pause time
int _change_old_gen_for_maj_pauses;
- // change old geneneration for throughput
+ // change old generation for throughput
int _change_old_gen_for_throughput;
// change young generation for throughput
int _change_young_gen_for_throughput;
// Flag indicating that the policy would
- // increase the tenuring threshold because of the total major gc cost
- // is greater than the total minor gc cost
+ // increase the tenuring threshold because of the total major GC cost
+ // is greater than the total minor GC cost
bool _increment_tenuring_threshold_for_gc_cost;
- // decrease the tenuring threshold because of the the total minor gc
- // cost is greater than the total major gc cost
+ // decrease the tenuring threshold because of the the total minor GC
+ // cost is greater than the total major GC cost
bool _decrement_tenuring_threshold_for_gc_cost;
// decrease due to survivor size limit
bool _decrement_tenuring_threshold_for_survivor_limit;
@@ -182,7 +182,7 @@
// Changing the generation sizing depends on the data that is
// gathered about the effects of changes on the pause times and
// throughput. These variable count the number of data points
- // gathered. The policy may use these counters as a threshhold
+ // gathered. The policy may use these counters as a threshold
// for reliable data.
julong _young_gen_change_for_minor_throughput;
julong _old_gen_change_for_major_throughput;
@@ -225,7 +225,7 @@
// larger than 1.0 if just the sum of the minor cost the
// the major cost is used. Worse than that is the
// fact that the minor cost and the major cost each
- // tend toward 1.0 in the extreme of high gc costs.
+ // tend toward 1.0 in the extreme of high GC costs.
// Limit the value of gc_cost to 1.0 so that the mutator
// cost stays non-negative.
virtual double gc_cost() const {
@@ -238,23 +238,23 @@
virtual double time_since_major_gc() const;
// Average interval between major collections to be used
- // in calculating the decaying major gc cost. An overestimate
+ // in calculating the decaying major GC cost. An overestimate
// of this time would be a conservative estimate because
// this time is used to decide if the major GC cost
// should be decayed (i.e., if the time since the last
- // major gc is long compared to the time returned here,
+ // major GC is long compared to the time returned here,
// then the major GC cost will be decayed). See the
// implementations for the specifics.
virtual double major_gc_interval_average_for_decay() const {
return _avg_major_interval->average();
}
- // Return the cost of the GC where the major gc cost
+ // Return the cost of the GC where the major GC cost
// has been decayed based on the time since the last
// major collection.
double decaying_gc_cost() const;
- // Decay the major gc cost. Use this only for decisions on
+ // Decay the major GC cost. Use this only for decisions on
// whether to adjust, not to determine by how much to adjust.
// This approximation is crude and may not be good enough for the
// latter.
--- a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -49,11 +49,11 @@
// estimates.
AdaptivePaddedAverage _demand_rate_estimate;
- ssize_t _desired; // Demand stimate computed as described above
+ ssize_t _desired; // Demand estimate computed as described above
ssize_t _coal_desired; // desired +/- small-percent for tuning coalescing
- ssize_t _surplus; // count - (desired +/- small-percent),
- // used to tune splitting in best fit
+ ssize_t _surplus; // count - (desired +/- small-percent),
+ // used to tune splitting in best fit
ssize_t _bfr_surp; // surplus at start of current sweep
ssize_t _prev_sweep; // count from end of previous sweep
ssize_t _before_sweep; // count from before current sweep
--- a/hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -54,7 +54,7 @@
void ConcurrentGCThread::create_and_start() {
if (os::create_thread(this, os::cgc_thread)) {
// XXX: need to set this to low priority
- // unless "agressive mode" set; priority
+ // unless "aggressive mode" set; priority
// should be just less than that of VMThread.
os::set_priority(this, NearMaxPriority);
if (!_should_terminate && !DisableStartThread) {
--- a/hotspot/src/share/vm/gc_implementation/shared/gcUtil.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcUtil.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -159,7 +159,7 @@
// that no calculation of the slope has yet been done. Returning true
// for a slope equal to 0 reflects the intuitive expectation of the
// dependence on the slope. Don't use the complement of these functions
-// since that untuitive expectation is not built into the complement.
+// since that intuitive expectation is not built into the complement.
bool LinearLeastSquareFit::decrement_will_decrease() {
return (_slope >= 0.00);
}
--- a/hotspot/src/share/vm/gc_implementation/shared/gcUtil.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcUtil.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -210,7 +210,7 @@
double y(double x);
double slope() { return _slope; }
// Methods to decide if a change in the dependent variable will
- // achive a desired goal. Note that these methods are not
+ // achieve a desired goal. Note that these methods are not
// complementary and both are needed.
bool decrement_will_decrease();
bool increment_will_decrease();
--- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -72,7 +72,7 @@
#endif // NOT_PRODUCT
// There may be unallocated holes in the middle chunks
-// that should be filled with dead objects to ensure parseability.
+// that should be filled with dead objects to ensure parsability.
void MutableNUMASpace::ensure_parsability() {
for (int i = 0; i < lgrp_spaces()->length(); i++) {
LGRPSpace *ls = lgrp_spaces()->at(i);
@@ -173,6 +173,26 @@
return lgrp_spaces()->at(i)->space()->capacity_in_bytes();
}
+size_t MutableNUMASpace::tlab_used(Thread *thr) const {
+ // Please see the comments for tlab_capacity().
+ guarantee(thr != NULL, "No thread");
+ int lgrp_id = thr->lgrp_id();
+ if (lgrp_id == -1) {
+ if (lgrp_spaces()->length() > 0) {
+ return (used_in_bytes()) / lgrp_spaces()->length();
+ } else {
+ assert(false, "There should be at least one locality group");
+ return 0;
+ }
+ }
+ int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
+ if (i == -1) {
+ return 0;
+ }
+ return lgrp_spaces()->at(i)->space()->used_in_bytes();
+}
+
+
size_t MutableNUMASpace::unsafe_max_tlab_alloc(Thread *thr) const {
// Please see the comments for tlab_capacity().
guarantee(thr != NULL, "No thread");
@@ -880,8 +900,8 @@
}
void MutableNUMASpace::verify() {
- // This can be called after setting an arbitary value to the space's top,
- // so an object can cross the chunk boundary. We ensure the parsablity
+ // This can be called after setting an arbitrary value to the space's top,
+ // so an object can cross the chunk boundary. We ensure the parsability
// of the space and just walk the objects in linear fashion.
ensure_parsability();
MutableSpace::verify();
--- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -217,6 +217,7 @@
using MutableSpace::capacity_in_words;
virtual size_t capacity_in_words(Thread* thr) const;
virtual size_t tlab_capacity(Thread* thr) const;
+ virtual size_t tlab_used(Thread* thr) const;
virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
// Allocation (return NULL if full)
--- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -31,7 +31,7 @@
// A MutableSpace is a subtype of ImmutableSpace that supports the
// concept of allocation. This includes the concepts that a space may
-// be only partially full, and the querry methods that go with such
+// be only partially full, and the query methods that go with such
// an assumption. MutableSpace is also responsible for minimizing the
// page allocation time by having the memory pretouched (with
// AlwaysPretouch) and for optimizing page placement on NUMA systems
@@ -111,7 +111,7 @@
virtual void mangle_region(MemRegion mr) PRODUCT_RETURN;
- // Boolean querries.
+ // Boolean queries.
bool is_empty() const { return used_in_words() == 0; }
bool not_empty() const { return used_in_words() > 0; }
bool contains(const void* p) const { return _bottom <= p && p < _end; }
@@ -124,6 +124,7 @@
virtual size_t used_in_words() const { return pointer_delta(top(), bottom()); }
virtual size_t free_in_words() const { return pointer_delta(end(), top()); }
virtual size_t tlab_capacity(Thread* thr) const { return capacity_in_bytes(); }
+ virtual size_t tlab_used(Thread* thr) const { return used_in_bytes(); }
virtual size_t unsafe_max_tlab_alloc(Thread* thr) const { return free_in_bytes(); }
// Allocation (return NULL if full)
--- a/hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -89,6 +89,10 @@
// scavenge; it clears the sensor accumulators.
void PLABStats::adjust_desired_plab_sz(uint no_of_gc_workers) {
assert(ResizePLAB, "Not set");
+
+ assert(is_object_aligned(max_size()) && min_size() <= max_size(),
+ "PLAB clipping computation may be incorrect");
+
if (_allocated == 0) {
assert(_unused == 0,
err_msg("Inconsistency in PLAB stats: "
@@ -152,7 +156,7 @@
// The buffer comes with its own BOT, with a shared (obviously) underlying
// BlockOffsetSharedArray. We manipulate this BOT in the normal way
-// as we would for any contiguous space. However, on accasion we
+// as we would for any contiguous space. However, on occasion we
// need to do some buffer surgery at the extremities before we
// start using the body of the buffer for allocations. Such surgery
// (as explained elsewhere) is to prevent allocation on a card that
--- a/hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -92,7 +92,7 @@
}
// The total (word) size of the buffer, including both allocated and
- // unallocted space.
+ // unallocated space.
size_t word_sz() { return _word_sz; }
// Should only be done if we are about to reset with a new buffer of the
@@ -181,16 +181,7 @@
_used(0),
_desired_plab_sz(desired_plab_sz_),
_filter(wt)
- {
- size_t min_sz = min_size();
- size_t max_sz = max_size();
- size_t aligned_min_sz = align_object_size(min_sz);
- size_t aligned_max_sz = align_object_size(max_sz);
- assert(min_sz <= aligned_min_sz && max_sz >= aligned_max_sz &&
- min_sz <= max_sz,
- "PLAB clipping computation in adjust_desired_plab_sz()"
- " may be incorrect");
- }
+ { }
static const size_t min_size() {
return ParGCAllocBuffer::min_size();
--- a/hotspot/src/share/vm/gc_implementation/shared/spaceDecorator.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/spaceDecorator.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -75,7 +75,7 @@
// High water mark for allocations. Typically, the space above
// this point have been mangle previously and don't need to be
- // touched again. Space belows this point has been allocated
+ // touched again. Space below this point has been allocated
// and remangling is needed between the current top and this
// high water mark.
HeapWord* _top_for_allocations;
--- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -83,7 +83,7 @@
// Allocations may fail in several threads at about the same time,
// resulting in multiple gc requests. We only want to do one of them.
-// In case a GC locker is active and the need for a GC is already signalled,
+// In case a GC locker is active and the need for a GC is already signaled,
// we want to skip this GC attempt altogether, without doing a futile
// safepoint operation.
bool VM_GC_Operation::skip_operation() const {
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -320,6 +320,21 @@
assert(thread->deferred_card_mark().is_empty(), "invariant");
}
+size_t CollectedHeap::max_tlab_size() const {
+ // TLABs can't be bigger than we can fill with a int[Integer.MAX_VALUE].
+ // This restriction could be removed by enabling filling with multiple arrays.
+ // If we compute that the reasonable way as
+ // header_size + ((sizeof(jint) * max_jint) / HeapWordSize)
+ // we'll overflow on the multiply, so we do the divide first.
+ // We actually lose a little by dividing first,
+ // but that just makes the TLAB somewhat smaller than the biggest array,
+ // which is fine, since we'll be able to fill that.
+ size_t max_int_size = typeArrayOopDesc::header_size(T_INT) +
+ sizeof(jint) *
+ ((juint) max_jint / (size_t) HeapWordSize);
+ return align_size_down(max_int_size, MinObjAlignment);
+}
+
// Helper for ReduceInitialCardMarks. For performance,
// compiled code may elide card-marks for initializing stores
// to a newly allocated object along the fast-path. We
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -394,14 +394,16 @@
// the following methods:
// Returns "true" iff the heap supports thread-local allocation buffers.
// The default is "no".
- virtual bool supports_tlab_allocation() const {
- return false;
- }
+ virtual bool supports_tlab_allocation() const = 0;
+
// The amount of space available for thread-local allocation buffers.
- virtual size_t tlab_capacity(Thread *thr) const {
- guarantee(false, "thread-local allocation buffers not supported");
- return 0;
- }
+ virtual size_t tlab_capacity(Thread *thr) const = 0;
+
+ // The amount of used space for thread-local allocation buffers for the given thread.
+ virtual size_t tlab_used(Thread *thr) const = 0;
+
+ virtual size_t max_tlab_size() const;
+
// An estimate of the maximum allocation that could be performed
// for thread-local allocation buffers without triggering any
// collection or expansion activity.
--- a/hotspot/src/share/vm/gc_interface/gcCause.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/gc_interface/gcCause.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -31,7 +31,7 @@
// This class exposes implementation details of the various
// collector(s), and we need to be very careful with it. If
// use of this class grows, we should split it into public
-// and implemenation-private "causes".
+// and implementation-private "causes".
//
class GCCause : public AllStatic {
--- a/hotspot/src/share/vm/memory/allocation.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/allocation.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -576,8 +576,8 @@
bool allocated_on_res_area() const { return get_allocation_type() == RESOURCE_AREA; }
bool allocated_on_C_heap() const { return get_allocation_type() == C_HEAP; }
bool allocated_on_arena() const { return get_allocation_type() == ARENA; }
- ResourceObj(); // default construtor
- ResourceObj(const ResourceObj& r); // default copy construtor
+ ResourceObj(); // default constructor
+ ResourceObj(const ResourceObj& r); // default copy constructor
ResourceObj& operator=(const ResourceObj& r); // default copy assignment
~ResourceObj();
#endif // ASSERT
--- a/hotspot/src/share/vm/memory/barrierSet.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/barrierSet.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -124,7 +124,7 @@
virtual bool has_read_region_opt() = 0;
virtual bool has_write_region_opt() = 0;
- // These operations should assert false unless the correponding operation
+ // These operations should assert false unless the corresponding operation
// above returns true. Otherwise, they should perform an appropriate
// barrier for an array whose elements are all in the given memory region.
virtual void read_ref_array(MemRegion mr) = 0;
@@ -165,7 +165,7 @@
// normally reserve space for such tables, and commit parts of the table
// "covering" parts of the heap that are committed. The constructor is
// passed the maximum number of independently committable subregions to
- // be covered, and the "resize_covoered_region" function allows the
+ // be covered, and the "resize_covered_region" function allows the
// sub-parts of the heap to inform the barrier set of changes of their
// sizes.
BarrierSet(int max_covered_regions) :
--- a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -56,7 +56,7 @@
template <class Chunk_t, template <class> class FreeList_t>
void TreeChunk<Chunk_t, FreeList_t>::verify_tree_chunk_list() const {
TreeChunk<Chunk_t, FreeList_t>* nextTC = (TreeChunk<Chunk_t, FreeList_t>*)next();
- if (prev() != NULL) { // interior list node shouldn'r have tree fields
+ if (prev() != NULL) { // interior list node shouldn't have tree fields
guarantee(embedded_list()->parent() == NULL && embedded_list()->left() == NULL &&
embedded_list()->right() == NULL, "should be clear");
}
@@ -247,7 +247,7 @@
prevFC->link_after(nextTC);
}
- // Below this point the embeded TreeList<Chunk_t, FreeList_t> being used for the
+ // Below this point the embedded TreeList<Chunk_t, FreeList_t> being used for the
// tree node may have changed. Don't use "this"
// TreeList<Chunk_t, FreeList_t>*.
// chunk should still be a free chunk (bit set in _prev)
@@ -703,7 +703,7 @@
// The only use of this method would not pass the root of the
// tree (as indicated by the assertion above that the tree list
// has a parent) but the specification does not explicitly exclude the
- // passing of the root so accomodate it.
+ // passing of the root so accommodate it.
set_root(NULL);
}
debug_only(
--- a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -322,7 +322,7 @@
void set_tree_hints(void);
// Reset statistics for all the lists in the tree.
void clear_tree_census(void);
- // Print the statistcis for all the lists in the tree. Also may
+ // Print the statistics for all the lists in the tree. Also may
// print out summaries.
void print_dict_census(void) const;
void print_free_lists(outputStream* st) const;
--- a/hotspot/src/share/vm/memory/blockOffsetTable.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/blockOffsetTable.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -590,7 +590,7 @@
// Otherwise, find the block start using the table, but taking
// care (cf block_start_unsafe() above) not to parse any objects/blocks
- // on the cards themsleves.
+ // on the cards themselves.
size_t index = _array->index_for(addr);
assert(_array->address_for_index(index) == addr,
"arg should be start of card");
--- a/hotspot/src/share/vm/memory/blockOffsetTable.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/blockOffsetTable.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -424,7 +424,7 @@
BlockOffsetArray(array, mr, false),
_unallocated_block(_bottom) { }
- // accessor
+ // Accessor
HeapWord* unallocated_block() const {
assert(BlockOffsetArrayUseUnallocatedBlock,
"_unallocated_block is not being maintained");
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -98,7 +98,7 @@
"card marking array");
}
- // The assember store_check code will do an unsigned shift of the oop,
+ // The assembler store_check code will do an unsigned shift of the oop,
// then add it to byte_map_base, i.e.
//
// _byte_map = byte_map_base + (uintptr_t(low_bound) >> card_shift)
@@ -243,7 +243,7 @@
if (new_region.word_size() != old_region.word_size()) {
// Commit new or uncommit old pages, if necessary.
MemRegion cur_committed = _committed[ind];
- // Extend the end of this _commited region
+ // Extend the end of this _committed region
// to cover the end of any lower _committed regions.
// This forms overlapping regions, but never interior regions.
HeapWord* const max_prev_end = largest_prev_committed_end(ind);
@@ -448,7 +448,7 @@
// off parallelism is used, then active_workers can be used in
// place of n_par_threads.
// This is an example of a path where n_par_threads is
- // set to 0 to turn off parallism.
+ // set to 0 to turn off parallelism.
// [7] CardTableModRefBS::non_clean_card_iterate()
// [8] CardTableRS::younger_refs_in_space_iterate()
// [9] Generation::younger_refs_in_space_iterate()
--- a/hotspot/src/share/vm/memory/cardTableRS.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/cardTableRS.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -590,7 +590,7 @@
// Then, the case analysis above reveals that, in the worst case,
// any such stale card will be scanned unnecessarily at most twice.
//
- // It is nonethelss advisable to try and get rid of some of this
+ // It is nonetheless advisable to try and get rid of some of this
// redundant work in a subsequent (low priority) re-design of
// the card-scanning code, if only to simplify the underlying
// state machine analysis/proof. ysr 1/28/2002. XXX
--- a/hotspot/src/share/vm/memory/cardTableRS.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/cardTableRS.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -105,8 +105,6 @@
~CardTableRS();
// *** GenRemSet functions.
- GenRemSet::Name rs_kind() { return GenRemSet::CardTable; }
-
CardTableRS* as_CardTableRS() { return this; }
CardTableModRefBS* ct_bs() { return _ct_bs; }
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -45,7 +45,7 @@
#include "gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp"
#endif // INCLUDE_ALL_GCS
-// CollectorPolicy methods.
+// CollectorPolicy methods
CollectorPolicy::CollectorPolicy() :
_space_alignment(0),
@@ -178,17 +178,14 @@
// byte entry and the os page size is 4096, the maximum heap size should
// be 512*4096 = 2MB aligned.
- // There is only the GenRemSet in Hotspot and only the GenRemSet::CardTable
- // is supported.
- // Requirements of any new remembered set implementations must be added here.
- size_t alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
+ size_t alignment = GenRemSet::max_alignment_constraint();
// Parallel GC does its own alignment of the generations to avoid requiring a
// large page (256M on some platforms) for the permanent generation. The
// other collectors should also be updated to do their own alignment and then
// this use of lcm() should be removed.
if (UseLargePages && !UseParallelGC) {
- // in presence of large pages we have to make sure that our
+ // In presence of large pages we have to make sure that our
// alignment is large page aware
alignment = lcm(os::large_page_size(), alignment);
}
@@ -196,7 +193,7 @@
return alignment;
}
-// GenCollectorPolicy methods.
+// GenCollectorPolicy methods
GenCollectorPolicy::GenCollectorPolicy() :
_min_gen0_size(0),
@@ -378,10 +375,10 @@
_initial_heap_byte_size = InitialHeapSize;
}
- // adjust max heap size if necessary
+ // Adjust NewSize and OldSize or MaxHeapSize to match each other
if (NewSize + OldSize > MaxHeapSize) {
if (_max_heap_size_cmdline) {
- // somebody set a maximum heap size with the intention that we should not
+ // Somebody has set a maximum heap size with the intention that we should not
// exceed it. Adjust New/OldSize as necessary.
uintx calculated_size = NewSize + OldSize;
double shrink_factor = (double) MaxHeapSize / calculated_size;
@@ -442,9 +439,8 @@
// minimum gen0 sizes.
if (_max_heap_byte_size == _min_heap_byte_size) {
- // The maximum and minimum heap sizes are the same so
- // the generations minimum and initial must be the
- // same as its maximum.
+ // The maximum and minimum heap sizes are the same so the generations
+ // minimum and initial must be the same as its maximum.
_min_gen0_size = max_new_size;
_initial_gen0_size = max_new_size;
_max_gen0_size = max_new_size;
@@ -466,8 +462,7 @@
// For the case where NewSize is the default, use NewRatio
// to size the minimum and initial generation sizes.
// Use the default NewSize as the floor for these values. If
- // NewRatio is overly large, the resulting sizes can be too
- // small.
+ // NewRatio is overly large, the resulting sizes can be too small.
_min_gen0_size = MAX2(scale_by_NewRatio_aligned(_min_heap_byte_size), NewSize);
desired_new_size =
MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize);
@@ -486,8 +481,7 @@
_max_gen0_size = bound_minus_alignment(_max_gen0_size, _max_heap_byte_size);
// At this point all three sizes have been checked against the
- // maximum sizes but have not been checked for consistency
- // among the three.
+ // maximum sizes but have not been checked for consistency among the three.
// Final check min <= initial <= max
_min_gen0_size = MIN2(_min_gen0_size, _max_gen0_size);
@@ -495,7 +489,7 @@
_min_gen0_size = MIN2(_min_gen0_size, _initial_gen0_size);
}
- // Write back to flags if necessary
+ // Write back to flags if necessary.
if (NewSize != _initial_gen0_size) {
FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size);
}
@@ -541,7 +535,7 @@
}
// Minimum sizes of the generations may be different than
-// the initial sizes. An inconsistently is permitted here
+// the initial sizes. An inconsistency is permitted here
// in the total size that can be specified explicitly by
// command line specification of OldSize and NewSize and
// also a command line specification of -Xms. Issue a warning
@@ -553,12 +547,12 @@
// At this point the minimum, initial and maximum sizes
// of the overall heap and of gen0 have been determined.
// The maximum gen1 size can be determined from the maximum gen0
- // and maximum heap size since no explicit flags exits
+ // and maximum heap size since no explicit flags exist
// for setting the gen1 maximum.
_max_gen1_size = MAX2(_max_heap_byte_size - _max_gen0_size, _gen_alignment);
// If no explicit command line flag has been set for the
- // gen1 size, use what is left for gen1.
+ // gen1 size, use what is left for gen1
if (!FLAG_IS_CMDLINE(OldSize)) {
// The user has not specified any value but the ergonomics
// may have chosen a value (which may or may not be consistent
@@ -570,14 +564,14 @@
// _max_gen1_size has already been made consistent above
FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size);
} else {
- // It's been explicitly set on the command line. Use the
+ // OldSize has been explicitly set on the command line. Use the
// OldSize and then determine the consequences.
_min_gen1_size = MIN2(OldSize, _min_heap_byte_size - _min_gen0_size);
_initial_gen1_size = OldSize;
// If the user has explicitly set an OldSize that is inconsistent
// with other command line flags, issue a warning.
- // The generation minimums and the overall heap mimimum should
+ // The generation minimums and the overall heap minimum should
// be within one generation alignment.
if ((_min_gen1_size + _min_gen0_size + _gen_alignment) < _min_heap_byte_size) {
warning("Inconsistency between minimum heap size and minimum "
@@ -599,7 +593,7 @@
_min_gen0_size, _initial_gen0_size, _max_gen0_size);
}
}
- // Initial size
+ // The same as above for the old gen initial size.
if (adjust_gen0_sizes(&_initial_gen0_size, &_initial_gen1_size,
_initial_heap_byte_size)) {
if (PrintGCDetails && Verbose) {
@@ -609,10 +603,10 @@
}
}
}
- // Enforce the maximum gen1 size.
+
_min_gen1_size = MIN2(_min_gen1_size, _max_gen1_size);
- // Check that min gen1 <= initial gen1 <= max gen1
+ // Make sure that min gen1 <= initial gen1 <= max gen1.
_initial_gen1_size = MAX2(_initial_gen1_size, _min_gen1_size);
_initial_gen1_size = MIN2(_initial_gen1_size, _max_gen1_size);
@@ -653,10 +647,9 @@
HeapWord* result = NULL;
- // Loop until the allocation is satisified,
- // or unsatisfied after GC.
+ // Loop until the allocation is satisfied, or unsatisfied after GC.
for (int try_count = 1, gclocker_stalled_count = 0; /* return or throw */; try_count += 1) {
- HandleMark hm; // discard any handles allocated in each iteration
+ HandleMark hm; // Discard any handles allocated in each iteration.
// First allocation attempt is lock-free.
Generation *gen0 = gch->get_gen(0);
@@ -669,7 +662,7 @@
return result;
}
}
- unsigned int gc_count_before; // read inside the Heap_lock locked region
+ unsigned int gc_count_before; // Read inside the Heap_lock locked region.
{
MutexLocker ml(Heap_lock);
if (PrintGC && Verbose) {
@@ -688,19 +681,19 @@
if (GC_locker::is_active_and_needs_gc()) {
if (is_tlab) {
- return NULL; // Caller will retry allocating individual object
+ return NULL; // Caller will retry allocating individual object.
}
if (!gch->is_maximal_no_gc()) {
- // Try and expand heap to satisfy request
+ // Try and expand heap to satisfy request.
result = expand_heap_and_allocate(size, is_tlab);
- // result could be null if we are out of space
+ // Result could be null if we are out of space.
if (result != NULL) {
return result;
}
}
if (gclocker_stalled_count > GCLockerRetryAllocationCount) {
- return NULL; // we didn't get to do a GC and we didn't get any memory
+ return NULL; // We didn't get to do a GC and we didn't get any memory.
}
// If this thread is not in a jni critical section, we stall
@@ -735,7 +728,7 @@
result = op.result();
if (op.gc_locked()) {
assert(result == NULL, "must be NULL if gc_locked() is true");
- continue; // retry and/or stall as necessary
+ continue; // Retry and/or stall as necessary.
}
// Allocation has failed and a collection
@@ -796,7 +789,7 @@
if (!gch->is_maximal_no_gc()) {
result = expand_heap_and_allocate(size, is_tlab);
}
- return result; // could be null if we are out of space
+ return result; // Could be null if we are out of space.
} else if (!gch->incremental_collection_will_fail(false /* don't consult_young */)) {
// Do an incremental collection.
gch->do_collection(false /* full */,
@@ -918,10 +911,8 @@
GCCause::_metadata_GC_threshold);
VMThread::execute(&op);
- // If GC was locked out, try again. Check
- // before checking success because the prologue
- // could have succeeded and the GC still have
- // been locked out.
+ // If GC was locked out, try again. Check before checking success because the
+ // prologue could have succeeded and the GC still have been locked out.
if (op.gc_locked()) {
continue;
}
@@ -982,7 +973,7 @@
}
void MarkSweepPolicy::initialize_gc_policy_counters() {
- // initialize the policy counters - 2 collectors, 3 generations
+ // Initialize the policy counters - 2 collectors, 3 generations.
if (UseParNewGC) {
_gc_policy_counters = new GCPolicyCounters("ParNew:MSC", 2, 3);
} else {
--- a/hotspot/src/share/vm/memory/collectorPolicy.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -76,10 +76,10 @@
size_t _heap_alignment;
// Needed to keep information if MaxHeapSize was set on the command line
- // when the flag value is aligned etc by ergonomics
+ // when the flag value is aligned etc by ergonomics.
bool _max_heap_size_cmdline;
- // The sizing of the heap are controlled by a sizing policy.
+ // The sizing of the heap is controlled by a sizing policy.
AdaptiveSizePolicy* _size_policy;
// Set to true when policy wants soft refs cleared.
@@ -102,7 +102,7 @@
initialize_size_info();
}
- // Return maximum heap alignment that may be imposed by the policy
+ // Return maximum heap alignment that may be imposed by the policy.
static size_t compute_heap_alignment();
size_t space_alignment() { return _space_alignment; }
@@ -180,7 +180,7 @@
size_t size,
Metaspace::MetadataType mdtype);
- // Performace Counter support
+ // Performance Counter support
GCPolicyCounters* counters() { return _gc_policy_counters; }
// Create the jstat counters for the GC policy. By default, policy's
@@ -231,9 +231,8 @@
GenerationSpec **_generations;
- // Return true if an allocation should be attempted in the older
- // generation if it fails in the younger generation. Return
- // false, otherwise.
+ // Return true if an allocation should be attempted in the older generation
+ // if it fails in the younger generation. Return false, otherwise.
virtual bool should_try_older_generation_allocation(size_t word_size) const;
void initialize_flags();
@@ -245,7 +244,7 @@
// Try to allocate space by expanding the heap.
virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab);
- // Compute max heap alignment
+ // Compute max heap alignment.
size_t compute_max_alignment();
// Scale the base_size by NewRatio according to
@@ -253,7 +252,7 @@
// and align by min_alignment()
size_t scale_by_NewRatio_aligned(size_t base_size);
- // Bound the value by the given maximum minus the min_alignment
+ // Bound the value by the given maximum minus the min_alignment.
size_t bound_minus_alignment(size_t desired_size, size_t maximum_size);
public:
--- a/hotspot/src/share/vm/memory/defNewGeneration.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/defNewGeneration.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -61,7 +61,6 @@
DefNewGeneration::KeepAliveClosure::
KeepAliveClosure(ScanWeakRefClosure* cl) : _cl(cl) {
GenRemSet* rs = GenCollectedHeap::heap()->rem_set();
- assert(rs->rs_kind() == GenRemSet::CardTable, "Wrong rem set kind.");
_rs = (CardTableRS*)rs;
}
@@ -619,13 +618,12 @@
assert(gch->no_allocs_since_save_marks(0),
"save marks have not been newly set.");
- int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
+ int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_ScavengeCodeCache;
gch->gen_process_strong_roots(_level,
true, // Process younger gens, if any,
// as strong roots.
true, // activate StrongRootsScope
- true, // is scavenging
SharedHeap::ScanningOption(so),
&fsc_with_no_gc_barrier,
true, // walk *all* scavengable nmethods
@@ -1086,6 +1084,10 @@
return eden()->capacity();
}
+size_t DefNewGeneration::tlab_used() const {
+ return eden()->used();
+}
+
size_t DefNewGeneration::unsafe_max_tlab_alloc() const {
return unsafe_max_alloc_nogc();
}
--- a/hotspot/src/share/vm/memory/defNewGeneration.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/defNewGeneration.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -239,6 +239,7 @@
// Thread-local allocation buffers
bool supports_tlab_allocation() const { return true; }
size_t tlab_capacity() const;
+ size_t tlab_used() const;
size_t unsafe_max_tlab_alloc() const;
// Grow the generation by the specified number of bytes.
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -126,7 +126,7 @@
(HeapWord*)(heap_rs.base() + heap_rs.size()));
// It is important to do this in a way such that concurrent readers can't
- // temporarily think somethings in the heap. (Seen this happen in asserts.)
+ // temporarily think something is in the heap. (Seen this happen in asserts.)
_reserved.set_word_size(0);
_reserved.set_start((HeapWord*)heap_rs.base());
size_t actual_heap_size = heap_rs.size();
@@ -592,7 +592,6 @@
gen_process_strong_roots(int level,
bool younger_gens_as_roots,
bool activate_scope,
- bool is_scavenging,
SharedHeap::ScanningOption so,
OopsInGenClosure* not_older_gens,
bool do_code_roots,
@@ -601,12 +600,12 @@
// General strong roots.
if (!do_code_roots) {
- SharedHeap::process_strong_roots(activate_scope, is_scavenging, so,
+ SharedHeap::process_strong_roots(activate_scope, so,
not_older_gens, NULL, klass_closure);
} else {
bool do_code_marking = (activate_scope || nmethod::oops_do_marking_is_active());
CodeBlobToOopClosure code_roots(not_older_gens, /*do_marking=*/ do_code_marking);
- SharedHeap::process_strong_roots(activate_scope, is_scavenging, so,
+ SharedHeap::process_strong_roots(activate_scope, so,
not_older_gens, &code_roots, klass_closure);
}
@@ -933,6 +932,16 @@
return result;
}
+size_t GenCollectedHeap::tlab_used(Thread* thr) const {
+ size_t result = 0;
+ for (int i = 0; i < _n_gens; i += 1) {
+ if (_gens[i]->supports_tlab_allocation()) {
+ result += _gens[i]->tlab_used();
+ }
+ }
+ return result;
+}
+
size_t GenCollectedHeap::unsafe_max_tlab_alloc(Thread* thr) const {
size_t result = 0;
for (int i = 0; i < _n_gens; i += 1) {
@@ -1263,7 +1272,7 @@
};
jlong GenCollectedHeap::millis_since_last_gc() {
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
GenTimeOfLastGCClosure tolgc_cl(now);
--- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -248,6 +248,7 @@
// Section on TLAB's.
virtual bool supports_tlab_allocation() const;
virtual size_t tlab_capacity(Thread* thr) const;
+ virtual size_t tlab_used(Thread* thr) const;
virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
virtual HeapWord* allocate_new_tlab(size_t size);
@@ -315,7 +316,7 @@
}
// Update the gc statistics for each generation.
- // "level" is the level of the lastest collection
+ // "level" is the level of the latest collection.
void update_gc_stats(int current_level, bool full) {
for (int i = 0; i < _n_gens; i++) {
_gens[i]->update_gc_stats(current_level, full);
@@ -411,7 +412,6 @@
// The remaining arguments are in an order
// consistent with SharedHeap::process_strong_roots:
bool activate_scope,
- bool is_scavenging,
SharedHeap::ScanningOption so,
OopsInGenClosure* not_older_gens,
bool do_code_roots,
--- a/hotspot/src/share/vm/memory/genMarkSweep.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/genMarkSweep.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -148,8 +148,8 @@
Universe::update_heap_info_at_gc();
// Update time of last gc for all generations we collected
- // (which curently is all the generations in the heap).
- // We need to use a monotonically non-deccreasing time in ms
+ // (which currently is all the generations in the heap).
+ // We need to use a monotonically non-decreasing time in ms
// or we will see time-warp warnings and os::javaTimeMillis()
// does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
@@ -210,7 +210,6 @@
gch->gen_process_strong_roots(level,
false, // Younger gens are not roots.
true, // activate StrongRootsScope
- false, // not scavenging
SharedHeap::SO_SystemClasses,
&follow_root_closure,
true, // walk code active on stacks
@@ -296,7 +295,6 @@
gch->gen_process_strong_roots(level,
false, // Younger gens are not roots.
true, // activate StrongRootsScope
- false, // not scavenging
SharedHeap::SO_AllClasses,
&adjust_pointer_closure,
false, // do not walk code
--- a/hotspot/src/share/vm/memory/genOopClosures.inline.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/genOopClosures.inline.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -45,7 +45,6 @@
// Barrier set for the heap, must be set after heap is initialized
if (_rs == NULL) {
GenRemSet* rs = SharedHeap::heap()->rem_set();
- assert(rs->rs_kind() == GenRemSet::CardTable, "Wrong rem set kind");
_rs = (CardTableRS*)rs;
}
}
--- a/hotspot/src/share/vm/memory/genRemSet.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/genRemSet.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -31,8 +31,7 @@
// enumerate ref fields that have been modified (since the last
// enumeration.)
-uintx GenRemSet::max_alignment_constraint(Name nm) {
- assert(nm == GenRemSet::CardTable, "Unrecognized GenRemSet type.");
+uintx GenRemSet::max_alignment_constraint() {
return CardTableRS::ct_max_alignment_constraint();
}
--- a/hotspot/src/share/vm/memory/genRemSet.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/genRemSet.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -27,7 +27,7 @@
#include "oops/oop.hpp"
-// A GenRemSet provides ways of iterating over pointers accross generations.
+// A GenRemSet provides ways of iterating over pointers across generations.
// (This is especially useful for older-to-younger.)
class Generation;
@@ -53,19 +53,12 @@
KlassRemSet _klass_rem_set;
public:
- enum Name {
- CardTable,
- Other
- };
-
GenRemSet(BarrierSet * bs) : _bs(bs) {}
GenRemSet() : _bs(NULL) {}
- virtual Name rs_kind() = 0;
-
// These are for dynamic downcasts. Unfortunately that it names the
// possible subtypes (but not that they are subtypes!) Return NULL if
- // the cast is invalide.
+ // the cast is invalid.
virtual CardTableRS* as_CardTableRS() { return NULL; }
// Return the barrier set associated with "this."
@@ -106,10 +99,9 @@
// within the heap, this function tells whether they are met.
virtual bool is_aligned(HeapWord* addr) = 0;
- // If the RS (or BS) imposes an aligment constraint on maximum heap size.
- // (This must be static, and dispatch on "nm", because it is called
- // before an RS is created.)
- static uintx max_alignment_constraint(Name nm);
+ // Returns any alignment constraint that the remembered set imposes upon the
+ // heap.
+ static uintx max_alignment_constraint();
virtual void verify() = 0;
--- a/hotspot/src/share/vm/memory/generation.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/generation.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -289,7 +289,7 @@
// These functions return the addresses of the fields that define the
// boundaries of the contiguous allocation area. (These fields should be
- // physicall near to one another.)
+ // physically near to one another.)
virtual HeapWord** top_addr() const { return NULL; }
virtual HeapWord** end_addr() const { return NULL; }
@@ -299,6 +299,10 @@
guarantee(false, "Generation doesn't support thread local allocation buffers");
return 0;
}
+ virtual size_t tlab_used() const {
+ guarantee(false, "Generation doesn't support thread local allocation buffers");
+ return 0;
+ }
virtual size_t unsafe_max_tlab_alloc() const {
guarantee(false, "Generation doesn't support thread local allocation buffers");
return 0;
@@ -485,7 +489,7 @@
// General signature...
virtual void oop_since_save_marks_iterate_v(OopsInGenClosure* cl) = 0;
// ...and specializations for de-virtualization. (The general
- // implemention of the _nv versions call the virtual version.
+ // implementation of the _nv versions call the virtual version.
// Note that the _nv suffix is not really semantically necessary,
// but it avoids some not-so-useful warnings on Solaris.)
#define Generation_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
--- a/hotspot/src/share/vm/memory/heap.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/heap.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -183,7 +183,7 @@
size_t number_of_segments = size_to_segments(instance_size + sizeof(HeapBlock));
assert(segments_to_size(number_of_segments) >= sizeof(FreeBlock), "not enough room for FreeList");
- // First check if we can satify request from freelist
+ // First check if we can satisfy request from freelist
debug_only(verify());
HeapBlock* block = search_freelist(number_of_segments, is_critical);
debug_only(if (VerifyCodeCacheOften) verify());
@@ -372,7 +372,7 @@
}
// Scan for right place to put into list. List
- // is sorted by increasing addresseses
+ // is sorted by increasing addresses
FreeBlock* prev = NULL;
FreeBlock* cur = _freelist;
while(cur != NULL && cur < b) {
--- a/hotspot/src/share/vm/memory/heap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/heap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -127,8 +127,8 @@
// Heap extents
bool reserve(size_t reserved_size, size_t committed_size, size_t segment_size);
void release(); // releases all allocated memory
- bool expand_by(size_t size); // expands commited memory by size
- void shrink_by(size_t size); // shrinks commited memory by size
+ bool expand_by(size_t size); // expands committed memory by size
+ void shrink_by(size_t size); // shrinks committed memory by size
void clear(); // clears all heap contents
// Memory allocation
--- a/hotspot/src/share/vm/memory/heapInspection.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -347,7 +347,7 @@
#endif // INCLUDE_SERVICES
-// These declarations are needed since teh declaration of KlassInfoTable and
+// These declarations are needed since the declaration of KlassInfoTable and
// KlassInfoClosure are guarded by #if INLCUDE_SERVICES
class KlassInfoTable;
class KlassInfoClosure;
--- a/hotspot/src/share/vm/memory/metaspace.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -2399,7 +2399,7 @@
void SpaceManager::verify() {
// If there are blocks in the dictionary, then
- // verfication of chunks does not work since
+ // verification of chunks does not work since
// being in the dictionary alters a chunk.
if (block_freelists()->total_size() == 0) {
for (ChunkIndex i = ZeroIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) {
@@ -2868,7 +2868,7 @@
uint64_t klass_encoding_max = UnscaledClassSpaceMax << LogKlassAlignmentInBytes;
// If compressed class space fits in lower 32G, we don't need a base.
if (higher_address <= (address)klass_encoding_max) {
- lower_base = 0; // effectively lower base is zero.
+ lower_base = 0; // Effectively lower base is zero.
}
}
--- a/hotspot/src/share/vm/memory/metaspaceShared.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -487,7 +487,7 @@
NOT_PRODUCT(SystemDictionary::verify();)
// Copy the the symbol table, and the system dictionary to the shared
- // space in usable form. Copy the hastable
+ // space in usable form. Copy the hashtable
// buckets first [read-write], then copy the linked lists of entries
// [read-only].
@@ -953,7 +953,7 @@
// The following data in the shared misc data region are the linked
// list elements (HashtableEntry objects) for the symbol table, string
- // table, and shared dictionary. The heap objects refered to by the
+ // table, and shared dictionary. The heap objects referred to by the
// symbol table, string table, and shared dictionary are permanent and
// unmovable. Since new entries added to the string and symbol tables
// are always added at the beginning of the linked lists, THESE LINKED
--- a/hotspot/src/share/vm/memory/modRefBarrierSet.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/modRefBarrierSet.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -72,7 +72,7 @@
bool has_read_region_opt() { return false; }
- // These operations should assert false unless the correponding operation
+ // These operations should assert false unless the corresponding operation
// above returns true.
void read_ref_array(MemRegion mr) {
assert(false, "can't call");
--- a/hotspot/src/share/vm/memory/referenceProcessor.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -45,7 +45,7 @@
}
void ReferenceProcessor::init_statics() {
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
@@ -152,7 +152,7 @@
// Update (advance) the soft ref master clock field. This must be done
// after processing the soft ref list.
- // We need a monotonically non-deccreasing time in ms but
+ // We need a monotonically non-decreasing time in ms but
// os::javaTimeMillis() does not guarantee monotonicity.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
jlong soft_ref_clock = java_lang_ref_SoftReference::clock();
@@ -168,7 +168,7 @@
// javaTimeNanos(), which is guaranteed to be monotonically
// non-decreasing provided the underlying platform provides such
// a time source (and it is bug free).
- // In product mode, however, protect ourselves from non-monotonicty.
+ // In product mode, however, protect ourselves from non-monotonicity.
if (now > _soft_ref_timestamp_clock) {
_soft_ref_timestamp_clock = now;
java_lang_ref_SoftReference::set_clock(now);
@@ -349,7 +349,7 @@
oop obj = NULL;
oop next_d = refs_list.head();
- if (pending_list_uses_discovered_field()) { // New behaviour
+ if (pending_list_uses_discovered_field()) { // New behavior
// Walk down the list, self-looping the next field
// so that the References are not considered active.
while (obj != next_d) {
@@ -366,7 +366,7 @@
// Post-barrier not needed when looping to self.
java_lang_ref_Reference::set_next_raw(obj, obj);
if (next_d == obj) { // obj is last
- // Swap refs_list into pendling_list_addr and
+ // Swap refs_list into pending_list_addr and
// set obj's discovered to what we read from pending_list_addr.
oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr);
// Need post-barrier on pending_list_addr above;
@@ -376,7 +376,7 @@
oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), old);
}
}
- } else { // Old behaviour
+ } else { // Old behavior
// Walk down the list, copying the discovered field into
// the next field and clearing the discovered field.
while (obj != next_d) {
@@ -390,7 +390,7 @@
assert(java_lang_ref_Reference::next(obj) == NULL,
"The reference should not be enqueued");
if (next_d == obj) { // obj is last
- // Swap refs_list into pendling_list_addr and
+ // Swap refs_list into pending_list_addr and
// set obj's next to what we read from pending_list_addr.
oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr);
// Need oop_check on pending_list_addr above;
@@ -1341,7 +1341,7 @@
// whose referents are still alive, whose referents are NULL or which
// are not active (have a non-NULL next field). NOTE: When we are
// thus precleaning the ref lists (which happens single-threaded today),
-// we do not disable refs discovery to honour the correct semantics of
+// we do not disable refs discovery to honor the correct semantics of
// java.lang.Reference. As a result, we need to be careful below
// that ref removal steps interleave safely with ref discovery steps
// (in this thread).
--- a/hotspot/src/share/vm/memory/referenceProcessor.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/referenceProcessor.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -474,7 +474,7 @@
bool processing_is_mt() const { return _processing_is_mt; }
void set_mt_processing(bool mt) { _processing_is_mt = mt; }
- // whether all enqueuing of weak references is complete
+ // whether all enqueueing of weak references is complete
bool enqueuing_is_done() { return _enqueuing_is_done; }
void set_enqueuing_is_done(bool v) { _enqueuing_is_done = v; }
--- a/hotspot/src/share/vm/memory/resourceArea.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/resourceArea.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -196,7 +196,7 @@
// leveraging existing data structures if we simply create a way to manage this one
// special need for a ResourceMark. If ResourceMark simply inherited from CHeapObj
// then existing ResourceMarks would work fine since no one use new to allocate them
-// and they would be stack allocated. This leaves open the possibilty of accidental
+// and they would be stack allocated. This leaves open the possibility of accidental
// misuse so we simple duplicate the ResourceMark functionality here.
class DeoptResourceMark: public CHeapObj<mtInternal> {
--- a/hotspot/src/share/vm/memory/sharedHeap.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/sharedHeap.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -137,7 +137,6 @@
}
void SharedHeap::process_strong_roots(bool activate_scope,
- bool is_scavenging,
ScanningOption so,
OopClosure* roots,
CodeBlobClosure* code_roots,
@@ -157,9 +156,11 @@
if (!_process_strong_tasks->is_task_claimed(SH_PS_JNIHandles_oops_do))
JNIHandles::oops_do(roots);
+ CLDToOopClosure roots_from_clds(roots);
+ // If we limit class scanning to SO_SystemClasses we need to apply a CLD closure to
+ // CLDs which are strongly reachable from the thread stacks.
+ CLDToOopClosure* roots_from_clds_p = ((so & SO_SystemClasses) ? &roots_from_clds : NULL);
// All threads execute this; the individual threads are task groups.
- CLDToOopClosure roots_from_clds(roots);
- CLDToOopClosure* roots_from_clds_p = (is_scavenging ? NULL : &roots_from_clds);
if (CollectedHeap::use_parallel_gc_threads()) {
Threads::possibly_parallel_oops_do(roots, roots_from_clds_p, code_roots);
} else {
@@ -187,9 +188,9 @@
if (!_process_strong_tasks->is_task_claimed(SH_PS_ClassLoaderDataGraph_oops_do)) {
if (so & SO_AllClasses) {
- ClassLoaderDataGraph::oops_do(roots, klass_closure, !is_scavenging);
+ ClassLoaderDataGraph::oops_do(roots, klass_closure, /* must_claim */ false);
} else if (so & SO_SystemClasses) {
- ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, !is_scavenging);
+ ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, /* must_claim */ true);
}
}
@@ -204,17 +205,18 @@
}
if (!_process_strong_tasks->is_task_claimed(SH_PS_CodeCache_oops_do)) {
- if (so & SO_CodeCache) {
+ if (so & SO_ScavengeCodeCache) {
assert(code_roots != NULL, "must supply closure for code cache");
- if (is_scavenging) {
- // We only visit parts of the CodeCache when scavenging.
- CodeCache::scavenge_root_nmethods_do(code_roots);
- } else {
- // CMSCollector uses this to do intermediate-strength collections.
- // We scan the entire code cache, since CodeCache::do_unloading is not called.
- CodeCache::blobs_do(code_roots);
- }
+ // We only visit parts of the CodeCache when scavenging.
+ CodeCache::scavenge_root_nmethods_do(code_roots);
+ }
+ if (so & SO_AllCodeCache) {
+ assert(code_roots != NULL, "must supply closure for code cache");
+
+ // CMSCollector uses this to do intermediate-strength collections.
+ // We scan the entire code cache, since CodeCache::do_unloading is not called.
+ CodeCache::blobs_do(code_roots);
}
// Verify that the code cache contents are not subject to
// movement by a scavenging collection.
--- a/hotspot/src/share/vm/memory/sharedHeap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/sharedHeap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -92,7 +92,7 @@
// 0 is a "special" value in set_n_threads() which translates to
// setting _n_threads to 1.
//
-// Some code uses _n_terminiation to decide if work should be done in
+// Some code uses _n_termination to decide if work should be done in
// parallel. The notorious possibly_parallel_oops_do() in threads.cpp
// is an example of such code. Look for variable "is_par" for other
// examples.
@@ -221,7 +221,8 @@
SO_AllClasses = 0x1,
SO_SystemClasses = 0x2,
SO_Strings = 0x4,
- SO_CodeCache = 0x8
+ SO_AllCodeCache = 0x8,
+ SO_ScavengeCodeCache = 0x10
};
FlexibleWorkGang* workers() const { return _workers; }
@@ -232,9 +233,9 @@
// "SO_AllClasses" applies the closure to all entries in the SystemDictionary;
// "SO_SystemClasses" to all the "system" classes and loaders;
// "SO_Strings" applies the closure to all entries in StringTable;
- // "SO_CodeCache" applies the closure to all elements of the CodeCache.
+ // "SO_AllCodeCache" applies the closure to all elements of the CodeCache.
+ // "SO_ScavengeCodeCache" applies the closure to elements on the scavenge root list in the CodeCache.
void process_strong_roots(bool activate_scope,
- bool is_scavenging,
ScanningOption so,
OopClosure* roots,
CodeBlobClosure* code_roots,
--- a/hotspot/src/share/vm/memory/space.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/space.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -112,7 +112,7 @@
// cards are processed. For instance, CMS must remember mutator updates
// (i.e. dirty cards) so as to re-scan mutated objects.
// Such work can be piggy-backed here on dirty card scanning, so as to make
- // it slightly more efficient than doing a complete non-detructive pre-scan
+ // it slightly more efficient than doing a complete non-destructive pre-scan
// of the card table.
MemRegionClosure* pCl = _sp->preconsumptionDirtyCardClosure();
if (pCl != NULL) {
@@ -324,8 +324,8 @@
}
void OffsetTableContigSpace::set_end(HeapWord* new_end) {
- // Space should not advertize an increase in size
- // until after the underlying offest table has been enlarged.
+ // Space should not advertise an increase in size
+ // until after the underlying offset table has been enlarged.
_offsets.resize(pointer_delta(new_end, bottom()));
Space::set_end(new_end);
}
@@ -729,7 +729,7 @@
object_iterate_from(bm, blk);
}
-// For a continguous space object_iterate() and safe_object_iterate()
+// For a ContiguousSpace object_iterate() and safe_object_iterate()
// are the same.
void ContiguousSpace::safe_object_iterate(ObjectClosure* blk) {
object_iterate(blk);
--- a/hotspot/src/share/vm/memory/space.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/space.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -56,7 +56,7 @@
// Here's the Space hierarchy:
//
-// - Space -- an asbtract base class describing a heap area
+// - Space -- an abstract base class describing a heap area
// - CompactibleSpace -- a space supporting compaction
// - CompactibleFreeListSpace -- (used for CMS generation)
// - ContiguousSpace -- a compactible space in which all free space
@@ -159,7 +159,7 @@
// (that is, if the space is contiguous), then this region must contain only
// such objects: the memregion will be from the bottom of the region to the
// saved mark. Otherwise, the "obj_allocated_since_save_marks" method of
- // the space must distiguish between objects in the region allocated before
+ // the space must distinguish between objects in the region allocated before
// and after the call to save marks.
virtual MemRegion used_region_at_save_marks() const {
return MemRegion(bottom(), saved_mark_word());
@@ -190,7 +190,7 @@
// Returns true iff the given the space contains the
// given address as part of an allocated object. For
- // ceratin kinds of spaces, this might be a potentially
+ // certain kinds of spaces, this might be a potentially
// expensive operation. To prevent performance problems
// on account of its inadvertent use in product jvm's,
// we restrict its use to assertion checks only.
@@ -244,13 +244,13 @@
// Return an address indicating the extent of the iteration in the
// event that the iteration had to return because of finding an
// uninitialized object in the space, or if the closure "cl"
- // signalled early termination.
+ // signaled early termination.
virtual HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
virtual HeapWord* object_iterate_careful_m(MemRegion mr,
ObjectClosureCareful* cl);
// Create and return a new dirty card to oop closure. Can be
- // overriden to return the appropriate type of closure
+ // overridden to return the appropriate type of closure
// depending on the type of space in which the closure will
// operate. ResourceArea allocated.
virtual DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
@@ -474,13 +474,13 @@
// be one, since compaction must succeed -- we go to the first space of
// the previous generation if necessary, updating "cp"), reset compact_top
// and then forward. In either case, returns the new value of "compact_top".
- // If the forwarding crosses "cp->threshold", invokes the "cross_threhold"
+ // If the forwarding crosses "cp->threshold", invokes the "cross_threshold"
// function of the then-current compaction space, and updates "cp->threshold
// accordingly".
virtual HeapWord* forward(oop q, size_t size, CompactPoint* cp,
HeapWord* compact_top);
- // Return a size with adjusments as required of the space.
+ // Return a size with adjustments as required of the space.
virtual size_t adjust_object_size_v(size_t size) const { return size; }
protected:
@@ -500,7 +500,7 @@
// Requires "allowed_deadspace_words > 0", that "q" is the start of a
// free block of the given "word_len", and that "q", were it an object,
- // would not move if forwared. If the size allows, fill the free
+ // would not move if forwarded. If the size allows, fill the free
// block with an object, to prevent excessive compaction. Returns "true"
// iff the free region was made deadspace, and modifies
// "allowed_deadspace_words" to reflect the number of available deadspace
--- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -135,7 +135,7 @@
free());
}
}
- // If we had to expand to accomodate promotions from younger generations
+ // If we had to expand to accommodate promotions from younger generations
if (!result && _capacity_at_prologue < capacity()) {
result = true;
if (PrintGC && Verbose) {
--- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -34,6 +34,7 @@
// Thread-Local Edens support
// static member initialization
+size_t ThreadLocalAllocBuffer::_max_size = 0;
unsigned ThreadLocalAllocBuffer::_target_refills = 0;
GlobalTLABStats* ThreadLocalAllocBuffer::_global_stats = NULL;
@@ -45,7 +46,7 @@
void ThreadLocalAllocBuffer::accumulate_statistics_before_gc() {
global_stats()->initialize();
- for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
+ for (JavaThread *thread = Threads::first(); thread != NULL; thread = thread->next()) {
thread->tlab().accumulate_statistics();
thread->tlab().initialize_statistics();
}
@@ -60,28 +61,32 @@
}
void ThreadLocalAllocBuffer::accumulate_statistics() {
- size_t capacity = Universe::heap()->tlab_capacity(myThread()) / HeapWordSize;
- size_t unused = Universe::heap()->unsafe_max_tlab_alloc(myThread()) / HeapWordSize;
- size_t used = capacity - unused;
-
- // Update allocation history if a reasonable amount of eden was allocated.
- bool update_allocation_history = used > 0.5 * capacity;
+ Thread* thread = myThread();
+ size_t capacity = Universe::heap()->tlab_capacity(thread);
+ size_t used = Universe::heap()->tlab_used(thread);
_gc_waste += (unsigned)remaining();
+ size_t total_allocated = thread->allocated_bytes();
+ size_t allocated_since_last_gc = total_allocated - _allocated_before_last_gc;
+ _allocated_before_last_gc = total_allocated;
if (PrintTLAB && (_number_of_refills > 0 || Verbose)) {
print_stats("gc");
}
if (_number_of_refills > 0) {
+ // Update allocation history if a reasonable amount of eden was allocated.
+ bool update_allocation_history = used > 0.5 * capacity;
if (update_allocation_history) {
// Average the fraction of eden allocated in a tlab by this
// thread for use in the next resize operation.
// _gc_waste is not subtracted because it's included in
// "used".
- size_t allocation = _number_of_refills * desired_size();
- double alloc_frac = allocation / (double) used;
+ // The result can be larger than 1.0 due to direct to old allocations.
+ // These allocations should ideally not be counted but since it is not possible
+ // to filter them out here we just cap the fraction to be at most 1.0.
+ double alloc_frac = MIN2(1.0, (double) allocated_since_last_gc / used);
_allocation_fraction.sample(alloc_frac);
}
global_stats()->update_allocating_threads();
@@ -126,33 +131,32 @@
}
void ThreadLocalAllocBuffer::resize_all_tlabs() {
- for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
- thread->tlab().resize();
+ if (ResizeTLAB) {
+ for (JavaThread *thread = Threads::first(); thread != NULL; thread = thread->next()) {
+ thread->tlab().resize();
+ }
}
}
void ThreadLocalAllocBuffer::resize() {
+ // Compute the next tlab size using expected allocation amount
+ assert(ResizeTLAB, "Should not call this otherwise");
+ size_t alloc = (size_t)(_allocation_fraction.average() *
+ (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize));
+ size_t new_size = alloc / _target_refills;
- if (ResizeTLAB) {
- // Compute the next tlab size using expected allocation amount
- size_t alloc = (size_t)(_allocation_fraction.average() *
- (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize));
- size_t new_size = alloc / _target_refills;
-
- new_size = MIN2(MAX2(new_size, min_size()), max_size());
-
- size_t aligned_new_size = align_object_size(new_size);
+ new_size = MIN2(MAX2(new_size, min_size()), max_size());
- if (PrintTLAB && Verbose) {
- gclog_or_tty->print("TLAB new size: thread: " INTPTR_FORMAT " [id: %2d]"
- " refills %d alloc: %8.6f desired_size: " SIZE_FORMAT " -> " SIZE_FORMAT "\n",
- myThread(), myThread()->osthread()->thread_id(),
- _target_refills, _allocation_fraction.average(), desired_size(), aligned_new_size);
- }
- set_desired_size(aligned_new_size);
+ size_t aligned_new_size = align_object_size(new_size);
- set_refill_waste_limit(initial_refill_waste_limit());
+ if (PrintTLAB && Verbose) {
+ gclog_or_tty->print("TLAB new size: thread: " INTPTR_FORMAT " [id: %2d]"
+ " refills %d alloc: %8.6f desired_size: " SIZE_FORMAT " -> " SIZE_FORMAT "\n",
+ myThread(), myThread()->osthread()->thread_id(),
+ _target_refills, _allocation_fraction.average(), desired_size(), aligned_new_size);
}
+ set_desired_size(aligned_new_size);
+ set_refill_waste_limit(initial_refill_waste_limit());
}
void ThreadLocalAllocBuffer::initialize_statistics() {
@@ -248,31 +252,13 @@
return init_sz;
}
-const size_t ThreadLocalAllocBuffer::max_size() {
-
- // TLABs can't be bigger than we can fill with a int[Integer.MAX_VALUE].
- // This restriction could be removed by enabling filling with multiple arrays.
- // If we compute that the reasonable way as
- // header_size + ((sizeof(jint) * max_jint) / HeapWordSize)
- // we'll overflow on the multiply, so we do the divide first.
- // We actually lose a little by dividing first,
- // but that just makes the TLAB somewhat smaller than the biggest array,
- // which is fine, since we'll be able to fill that.
-
- size_t unaligned_max_size = typeArrayOopDesc::header_size(T_INT) +
- sizeof(jint) *
- ((juint) max_jint / (size_t) HeapWordSize);
- return align_size_down(unaligned_max_size, MinObjAlignment);
-}
-
void ThreadLocalAllocBuffer::print_stats(const char* tag) {
Thread* thrd = myThread();
size_t waste = _gc_waste + _slow_refill_waste + _fast_refill_waste;
size_t alloc = _number_of_refills * _desired_size;
double waste_percent = alloc == 0 ? 0.0 :
100.0 * waste / alloc;
- size_t tlab_used = Universe::heap()->tlab_capacity(thrd) -
- Universe::heap()->unsafe_max_tlab_alloc(thrd);
+ size_t tlab_used = Universe::heap()->tlab_used(thrd);
gclog_or_tty->print("TLAB: %s thread: " INTPTR_FORMAT " [id: %2d]"
" desired_size: " SIZE_FORMAT "KB"
" slow allocs: %d refill waste: " SIZE_FORMAT "B"
--- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -45,7 +45,9 @@
HeapWord* _end; // allocation end (excluding alignment_reserve)
size_t _desired_size; // desired size (including alignment_reserve)
size_t _refill_waste_limit; // hold onto tlab if free() is larger than this
+ size_t _allocated_before_last_gc; // total bytes allocated up until the last gc
+ static size_t _max_size; // maximum size of any TLAB
static unsigned _target_refills; // expected number of refills between GCs
unsigned _number_of_refills;
@@ -99,12 +101,13 @@
static GlobalTLABStats* global_stats() { return _global_stats; }
public:
- ThreadLocalAllocBuffer() : _allocation_fraction(TLABAllocationWeight) {
+ ThreadLocalAllocBuffer() : _allocation_fraction(TLABAllocationWeight), _allocated_before_last_gc(0) {
// do nothing. tlabs must be inited by initialize() calls
}
static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize); }
- static const size_t max_size();
+ static const size_t max_size() { assert(_max_size != 0, "max_size not set up"); return _max_size; }
+ static void set_max_size(size_t max_size) { _max_size = max_size; }
HeapWord* start() const { return _start; }
HeapWord* end() const { return _end; }
--- a/hotspot/src/share/vm/memory/universe.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/memory/universe.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -816,6 +816,8 @@
Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
}
+ ThreadLocalAllocBuffer::set_max_size(Universe::heap()->max_tlab_size());
+
jint status = Universe::heap()->initialize();
if (status != JNI_OK) {
return status;
@@ -1136,7 +1138,7 @@
SystemDictionary::ProtectionDomain_klass(), m);;
}
- // The folowing is initializing converter functions for serialization in
+ // The following is initializing converter functions for serialization in
// JVM.cpp. If we clean up the StrictMath code above we may want to find
// a better solution for this as well.
initialize_converter_functions();
@@ -1178,7 +1180,7 @@
if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
// CodeCache can only be updated by a thread_in_VM and they will all be
- // stopped dring the safepoint so CodeCache will be safe to update without
+ // stopped during the safepoint so CodeCache will be safe to update without
// holding the CodeCache_lock.
KlassDepChange changes(dependee);
@@ -1199,7 +1201,7 @@
if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
// CodeCache can only be updated by a thread_in_VM and they will all be
- // stopped dring the safepoint so CodeCache will be safe to update without
+ // stopped during the safepoint so CodeCache will be safe to update without
// holding the CodeCache_lock.
CallSiteDepChange changes(call_site(), method_handle());
@@ -1230,7 +1232,7 @@
if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
// CodeCache can only be updated by a thread_in_VM and they will all be
- // stopped dring the safepoint so CodeCache will be safe to update without
+ // stopped during the safepoint so CodeCache will be safe to update without
// holding the CodeCache_lock.
// Compute the dependent nmethods
--- a/hotspot/src/share/vm/oops/method.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/oops/method.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -38,13 +38,11 @@
#include "utilities/accessFlags.hpp"
#include "utilities/growableArray.hpp"
-// A Method* represents a Java method.
+// A Method represents a Java method.
//
// Memory layout (each line represents a word). Note that most applications load thousands of methods,
// so keeping the size of this structure small has a big impact on footprint.
//
-// We put all oops and method_size first for better gc cache locality.
-//
// The actual bytecodes are inlined after the end of the Method struct.
//
// There are bits in the access_flags telling whether inlined tables are present.
@@ -64,17 +62,17 @@
// | header |
// | klass |
// |------------------------------------------------------|
-// | ConstMethod* (oop) |
+// | ConstMethod* (metadata) |
// |------------------------------------------------------|
-// | methodData (oop) |
-// | methodCounters |
+// | MethodData* (metadata) |
+// | MethodCounters |
// |------------------------------------------------------|
// | access_flags |
// | vtable_index |
// |------------------------------------------------------|
// | result_index (C++ interpreter only) |
// |------------------------------------------------------|
-// | method_size | intrinsic_id| flags |
+// | method_size | intrinsic_id | flags |
// |------------------------------------------------------|
// | code (pointer) |
// | i2i (pointer) |
--- a/hotspot/src/share/vm/opto/runtime.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/opto/runtime.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -568,8 +568,7 @@
const TypeFunc *OptoRuntime::uncommon_trap_Type() {
// create input type (domain)
const Type **fields = TypeTuple::fields(1);
- // Symbol* name of class to be loaded
- fields[TypeFunc::Parms+0] = TypeInt::INT;
+ fields[TypeFunc::Parms+0] = TypeInt::INT; // trap_reason (deopt reason and action)
const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
// create result type (range)
--- a/hotspot/src/share/vm/prims/jni.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/prims/jni.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -4949,6 +4949,7 @@
void TestMetaspaceAux_test();
void TestMetachunk_test();
void TestVirtualSpaceNode_test();
+void TestOldFreeSpaceCalculation_test();
#if INCLUDE_ALL_GCS
void TestG1BiasedArray_test();
#endif
@@ -4969,6 +4970,7 @@
run_unit_test(QuickSort::test_quick_sort());
run_unit_test(AltHashing::test_alt_hash());
run_unit_test(test_loggc_filename());
+ run_unit_test(TestOldFreeSpaceCalculation_test());
#if INCLUDE_VM_STRUCTS
run_unit_test(VMStructs::test());
#endif
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -175,8 +175,8 @@
oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
assert(info.resolved_appendix().is_null(), "only normal methods here");
- KlassHandle receiver_limit = info.resolved_klass();
methodHandle m = info.resolved_method();
+ KlassHandle m_klass = m->method_holder();
int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
int vmindex = Method::invalid_vtable_index;
@@ -184,14 +184,13 @@
case CallInfo::itable_call:
vmindex = info.itable_index();
// More importantly, the itable index only works with the method holder.
- receiver_limit = m->method_holder();
- assert(receiver_limit->verify_itable_index(vmindex), "");
+ assert(m_klass->verify_itable_index(vmindex), "");
flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT);
if (TraceInvokeDynamic) {
ResourceMark rm;
- tty->print_cr("memberName: invokeinterface method_holder::method: %s, receiver: %s, itableindex: %d, access_flags:",
- Method::name_and_sig_as_C_string(receiver_limit(), m->name(), m->signature()),
- receiver_limit()->internal_name(), vmindex);
+ tty->print_cr("memberName: invokeinterface method_holder::method: %s, itableindex: %d, access_flags:",
+ Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
+ vmindex);
m->access_flags().print_on(tty);
if (!m->is_abstract()) {
tty->print("default");
@@ -203,12 +202,35 @@
case CallInfo::vtable_call:
vmindex = info.vtable_index();
flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
- assert(receiver_limit->is_subtype_of(m->method_holder()), "virtual call must be type-safe");
+ assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe");
+ if (m_klass->is_interface()) {
+ // This is a vtable call to an interface method (abstract "miranda method" or default method).
+ // The vtable index is meaningless without a class (not interface) receiver type, so get one.
+ // (LinkResolver should help us figure this out.)
+ KlassHandle m_klass_non_interface = info.resolved_klass();
+ if (m_klass_non_interface->is_interface()) {
+ m_klass_non_interface = SystemDictionary::Object_klass();
+#ifdef ASSERT
+ { ResourceMark rm;
+ Method* m2 = m_klass_non_interface->vtable()->method_at(vmindex);
+ assert(m->name() == m2->name() && m->signature() == m2->signature(),
+ err_msg("at %d, %s != %s", vmindex,
+ m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string()));
+ }
+#endif //ASSERT
+ }
+ if (!m->is_public()) {
+ assert(m->is_public(), "virtual call must be to public interface method");
+ return NULL; // elicit an error later in product build
+ }
+ assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe");
+ m_klass = m_klass_non_interface;
+ }
if (TraceInvokeDynamic) {
ResourceMark rm;
tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
- Method::name_and_sig_as_C_string(receiver_limit(), m->name(), m->signature()),
- receiver_limit()->internal_name(), vmindex);
+ Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
+ m_klass->internal_name(), vmindex);
m->access_flags().print_on(tty);
if (m->is_default_method()) {
tty->print("default");
@@ -223,10 +245,8 @@
flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
} else if (m->is_initializer()) {
flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
- assert(receiver_limit == m->method_holder(), "constructor call must be exactly typed");
} else {
flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
- assert(receiver_limit->is_subtype_of(m->method_holder()), "special call must be type-safe");
}
break;
@@ -242,7 +262,7 @@
java_lang_invoke_MemberName::set_flags( mname_oop, flags);
java_lang_invoke_MemberName::set_vmtarget(mname_oop, m());
java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex); // vtable/itable index
- java_lang_invoke_MemberName::set_clazz( mname_oop, receiver_limit->java_mirror());
+ java_lang_invoke_MemberName::set_clazz( mname_oop, m_klass->java_mirror());
// Note: name and type can be lazily computed by resolve_MemberName,
// if Java code needs them as resolved String and MethodType objects.
// The clazz must be eagerly stored, because it provides a GC
@@ -569,7 +589,7 @@
// An unresolved member name is a mere symbolic reference.
// Resolving it plants a vmtarget/vmindex in it,
// which refers directly to JVM internals.
-Handle MethodHandles::resolve_MemberName(Handle mname, TRAPS) {
+Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS) {
Handle empty;
assert(java_lang_invoke_MemberName::is_instance(mname()), "");
@@ -646,20 +666,20 @@
assert(!HAS_PENDING_EXCEPTION, "");
if (ref_kind == JVM_REF_invokeStatic) {
LinkResolver::resolve_static_call(result,
- defc, name, type, KlassHandle(), false, false, THREAD);
+ defc, name, type, caller, caller.not_null(), false, THREAD);
} else if (ref_kind == JVM_REF_invokeInterface) {
LinkResolver::resolve_interface_call(result, Handle(), defc,
- defc, name, type, KlassHandle(), false, false, THREAD);
+ defc, name, type, caller, caller.not_null(), false, THREAD);
} else if (mh_invoke_id != vmIntrinsics::_none) {
assert(!is_signature_polymorphic_static(mh_invoke_id), "");
LinkResolver::resolve_handle_call(result,
- defc, name, type, KlassHandle(), THREAD);
+ defc, name, type, caller, THREAD);
} else if (ref_kind == JVM_REF_invokeSpecial) {
LinkResolver::resolve_special_call(result,
- defc, name, type, KlassHandle(), false, THREAD);
+ defc, name, type, caller, caller.not_null(), THREAD);
} else if (ref_kind == JVM_REF_invokeVirtual) {
LinkResolver::resolve_virtual_call(result, Handle(), defc,
- defc, name, type, KlassHandle(), false, false, THREAD);
+ defc, name, type, caller, caller.not_null(), false, THREAD);
} else {
assert(false, err_msg("ref_kind=%d", ref_kind));
}
@@ -683,7 +703,7 @@
assert(!HAS_PENDING_EXCEPTION, "");
if (name == vmSymbols::object_initializer_name()) {
LinkResolver::resolve_special_call(result,
- defc, name, type, KlassHandle(), false, THREAD);
+ defc, name, type, caller, caller.not_null(), THREAD);
} else {
break; // will throw after end of switch
}
@@ -700,7 +720,7 @@
fieldDescriptor result; // find_field initializes fd if found
{
assert(!HAS_PENDING_EXCEPTION, "");
- LinkResolver::resolve_field(result, defc, name, type, KlassHandle(), Bytecodes::_nop, false, false, THREAD);
+ LinkResolver::resolve_field(result, defc, name, type, caller, Bytecodes::_nop, false, false, THREAD);
if (HAS_PENDING_EXCEPTION) {
return empty;
}
@@ -1121,7 +1141,11 @@
}
}
- Handle resolved = MethodHandles::resolve_MemberName(mname, CHECK_NULL);
+ KlassHandle caller(THREAD,
+ caller_jh == NULL ? (Klass*) NULL :
+ java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)));
+ Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
+
if (resolved.is_null()) {
int flags = java_lang_invoke_MemberName::flags(mname());
int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
--- a/hotspot/src/share/vm/prims/methodHandles.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -55,7 +55,7 @@
public:
// working with member names
- static Handle resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type
+ static Handle resolve_MemberName(Handle mname, KlassHandle caller, TRAPS); // compute vmtarget/vmindex from name/type
static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing
static Handle new_MemberName(TRAPS); // must be followed by init_MemberName
static oop init_MemberName(Handle mname_h, Handle target_h); // compute vmtarget/vmindex from target
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -306,7 +306,7 @@
* profiling can start at level 0 and finish at level 3.
*
* b. 0 -> 2 -> 3 -> 4.
- * This case occures when the load on C2 is deemed too high. So, instead of transitioning
+ * This case occurs when the load on C2 is deemed too high. So, instead of transitioning
* into state 3 directly and over-profiling while a method is in the C2 queue we transition to
* level 2 and wait until the load on C2 decreases. This path is disabled for OSRs.
*
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -185,7 +185,7 @@
PropertyList_add(&_system_properties, new SystemProperty("java.vm.name", VM_Version::vm_name(), false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.info", VM_Version::vm_info_string(), true));
- // following are JVMTI agent writeable properties.
+ // Following are JVMTI agent writable properties.
// Properties values are set to NULL and they are
// os specific they are initialized in os::init_system_properties_values().
_java_ext_dirs = new SystemProperty("java.ext.dirs", NULL, true);
@@ -1314,7 +1314,7 @@
if (!FLAG_IS_DEFAULT(OldPLABSize)) {
if (FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim)) {
// OldPLABSize is not the default value but CMSParPromoteBlocksToClaim
- // is. In this situtation let CMSParPromoteBlocksToClaim follow
+ // is. In this situation let CMSParPromoteBlocksToClaim follow
// the value (either from the command line or ergonomics) of
// OldPLABSize. Following OldPLABSize is an ergonomics decision.
FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, OldPLABSize);
@@ -1577,6 +1577,16 @@
vm_exit(1);
}
+ if (UseAdaptiveSizePolicy) {
+ // We don't want to limit adaptive heap sizing's freedom to adjust the heap
+ // unless the user actually sets these flags.
+ if (FLAG_IS_DEFAULT(MinHeapFreeRatio)) {
+ FLAG_SET_DEFAULT(MinHeapFreeRatio, 0);
+ }
+ if (FLAG_IS_DEFAULT(MaxHeapFreeRatio)) {
+ FLAG_SET_DEFAULT(MaxHeapFreeRatio, 100);
+ }
+ }
// If InitialSurvivorRatio or MinSurvivorRatio were not specified, but the
// SurvivorRatio has been set, reset their default values to SurvivorRatio +
@@ -1849,7 +1859,7 @@
}
bool Arguments::verify_percentage(uintx value, const char* name) {
- if (value <= 100) {
+ if (is_percentage(value)) {
return true;
}
jio_fprintf(defaultStream::error_stream(),
@@ -1937,6 +1947,34 @@
return count_p < 2 && count_t < 2;
}
+bool Arguments::verify_MinHeapFreeRatio(FormatBuffer<80>& err_msg, uintx min_heap_free_ratio) {
+ if (!is_percentage(min_heap_free_ratio)) {
+ err_msg.print("MinHeapFreeRatio must have a value between 0 and 100");
+ return false;
+ }
+ if (min_heap_free_ratio > MaxHeapFreeRatio) {
+ err_msg.print("MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or "
+ "equal to MaxHeapFreeRatio (" UINTX_FORMAT ")", min_heap_free_ratio,
+ MaxHeapFreeRatio);
+ return false;
+ }
+ return true;
+}
+
+bool Arguments::verify_MaxHeapFreeRatio(FormatBuffer<80>& err_msg, uintx max_heap_free_ratio) {
+ if (!is_percentage(max_heap_free_ratio)) {
+ err_msg.print("MaxHeapFreeRatio must have a value between 0 and 100");
+ return false;
+ }
+ if (max_heap_free_ratio < MinHeapFreeRatio) {
+ err_msg.print("MaxHeapFreeRatio (" UINTX_FORMAT ") must be greater than or "
+ "equal to MinHeapFreeRatio (" UINTX_FORMAT ")", max_heap_free_ratio,
+ MinHeapFreeRatio);
+ return false;
+ }
+ return true;
+}
+
// Check consistency of GC selection
bool Arguments::check_gc_consistency() {
check_gclog_consistency();
@@ -2042,8 +2080,6 @@
status = status && verify_interval(AdaptiveSizePolicyWeight, 0, 100,
"AdaptiveSizePolicyWeight");
status = status && verify_percentage(ThresholdTolerance, "ThresholdTolerance");
- status = status && verify_percentage(MinHeapFreeRatio, "MinHeapFreeRatio");
- status = status && verify_percentage(MaxHeapFreeRatio, "MaxHeapFreeRatio");
// Divide by bucket size to prevent a large size from causing rollover when
// calculating amount of memory needed to be allocated for the String table.
@@ -2053,15 +2089,19 @@
status = status && verify_interval(SymbolTableSize, minimumSymbolTableSize,
(max_uintx / SymbolTable::bucket_size()), "SymbolTable size");
- if (MinHeapFreeRatio > MaxHeapFreeRatio) {
- jio_fprintf(defaultStream::error_stream(),
- "MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or "
- "equal to MaxHeapFreeRatio (" UINTX_FORMAT ")\n",
- MinHeapFreeRatio, MaxHeapFreeRatio);
- status = false;
+ {
+ // Using "else if" below to avoid printing two error messages if min > max.
+ // This will also prevent us from reporting both min>100 and max>100 at the
+ // same time, but that is less annoying than printing two identical errors IMHO.
+ FormatBuffer<80> err_msg("");
+ if (!verify_MinHeapFreeRatio(err_msg, MinHeapFreeRatio)) {
+ jio_fprintf(defaultStream::error_stream(), "%s\n", err_msg.buffer());
+ status = false;
+ } else if (!verify_MaxHeapFreeRatio(err_msg, MaxHeapFreeRatio)) {
+ jio_fprintf(defaultStream::error_stream(), "%s\n", err_msg.buffer());
+ status = false;
+ }
}
- // Keeping the heap 100% free is hard ;-) so limit it to 99%.
- MinHeapFreeRatio = MIN2(MinHeapFreeRatio, (uintx) 99);
// Min/MaxMetaspaceFreeRatio
status = status && verify_percentage(MinMetaspaceFreeRatio, "MinMetaspaceFreeRatio");
@@ -2694,7 +2734,7 @@
} else if (match_option(option, "-Xmaxf", &tail)) {
char* err;
int maxf = (int)(strtod(tail, &err) * 100);
- if (*err != '\0' || maxf < 0 || maxf > 100) {
+ if (*err != '\0' || *tail == '\0' || maxf < 0 || maxf > 100) {
jio_fprintf(defaultStream::error_stream(),
"Bad max heap free percentage size: %s\n",
option->optionString);
@@ -2706,7 +2746,7 @@
} else if (match_option(option, "-Xminf", &tail)) {
char* err;
int minf = (int)(strtod(tail, &err) * 100);
- if (*err != '\0' || minf < 0 || minf > 100) {
+ if (*err != '\0' || *tail == '\0' || minf < 0 || minf > 100) {
jio_fprintf(defaultStream::error_stream(),
"Bad min heap free percentage size: %s\n",
option->optionString);
@@ -3651,9 +3691,9 @@
// Set per-collector flags
if (UseParallelGC || UseParallelOldGC) {
set_parallel_gc_flags();
- } else if (UseConcMarkSweepGC) { // should be done before ParNew check below
+ } else if (UseConcMarkSweepGC) { // Should be done before ParNew check below
set_cms_and_parnew_gc_flags();
- } else if (UseParNewGC) { // skipped if CMS is set above
+ } else if (UseParNewGC) { // Skipped if CMS is set above
set_parnew_gc_flags();
} else if (UseG1GC) {
set_g1_gc_flags();
@@ -3667,22 +3707,26 @@
" using -XX:ParallelGCThreads=N");
}
}
+ if (MinHeapFreeRatio == 100) {
+ // Keeping the heap 100% free is hard ;-) so limit it to 99%.
+ FLAG_SET_ERGO(uintx, MinHeapFreeRatio, 99);
+ }
#else // INCLUDE_ALL_GCS
assert(verify_serial_gc_flags(), "SerialGC unset");
#endif // INCLUDE_ALL_GCS
- // Initialize Metaspace flags and alignments.
+ // Initialize Metaspace flags and alignments
Metaspace::ergo_initialize();
// Set bytecode rewriting flags
set_bytecode_flags();
- // Set flags if Aggressive optimization flags (-XX:+AggressiveOpts) enabled.
+ // Set flags if Aggressive optimization flags (-XX:+AggressiveOpts) enabled
set_aggressive_opts_flags();
// Turn off biased locking for locking debug mode flags,
- // which are subtlely different from each other but neither works with
- // biased locking.
+ // which are subtly different from each other but neither works with
+ // biased locking
if (UseHeavyMonitors
#ifdef COMPILER1
|| !UseFastLocking
--- a/hotspot/src/share/vm/runtime/arguments.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/arguments.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -27,6 +27,7 @@
#include "runtime/java.hpp"
#include "runtime/perfData.hpp"
+#include "utilities/debug.hpp"
#include "utilities/top.hpp"
// Arguments parses the command line and recognizes options
@@ -370,11 +371,16 @@
static jint parse_vm_init_args(const JavaVMInitArgs* args);
static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, SysClassPath* scp_p, bool* scp_assembly_required_p, Flag::Flags origin);
static jint finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_required);
- static bool is_bad_option(const JavaVMOption* option, jboolean ignore,
- const char* option_type);
+ static bool is_bad_option(const JavaVMOption* option, jboolean ignore, const char* option_type);
+
static bool is_bad_option(const JavaVMOption* option, jboolean ignore) {
return is_bad_option(option, ignore, NULL);
}
+
+ static bool is_percentage(uintx val) {
+ return val <= 100;
+ }
+
static bool verify_interval(uintx val, uintx min,
uintx max, const char* name);
static bool verify_min_value(intx val, intx min, const char* name);
@@ -440,11 +446,20 @@
static jint apply_ergo();
// Adjusts the arguments after the OS have adjusted the arguments
static jint adjust_after_os();
+
+ // Verifies that the given value will fit as a MinHeapFreeRatio. If not, an error
+ // message is returned in the provided buffer.
+ static bool verify_MinHeapFreeRatio(FormatBuffer<80>& err_msg, uintx min_heap_free_ratio);
+
+ // Verifies that the given value will fit as a MaxHeapFreeRatio. If not, an error
+ // message is returned in the provided buffer.
+ static bool verify_MaxHeapFreeRatio(FormatBuffer<80>& err_msg, uintx max_heap_free_ratio);
+
// 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
+ // Check consistency or otherwise of VM argument settings
static bool check_vm_args_consistency();
// Check stack pages settings
static bool check_stack_pages();
@@ -494,7 +509,7 @@
// -Xprof
static bool has_profile() { return _has_profile; }
- // -Xms, -Xmx
+ // -Xms
static uintx min_heap_size() { return _min_heap_size; }
static void set_min_heap_size(uintx v) { _min_heap_size = v; }
--- a/hotspot/src/share/vm/runtime/compilationPolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/compilationPolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -233,7 +233,7 @@
}
void NonTieredCompPolicy::reset_counter_for_back_branch_event(methodHandle m) {
- // Delay next back-branch event but pump up invocation counter to triger
+ // Delay next back-branch event but pump up invocation counter to trigger
// whole method compilation.
MethodCounters* mcs = m->method_counters();
assert(mcs != NULL, "MethodCounters cannot be NULL for profiling");
@@ -251,7 +251,7 @@
//
// CounterDecay
//
-// Interates through invocation counters and decrements them. This
+// Iterates through invocation counters and decrements them. This
// is done at each safepoint.
//
class CounterDecay : public AllStatic {
@@ -321,7 +321,7 @@
}
// This method can be called by any component of the runtime to notify the policy
-// that it's recommended to delay the complation of this method.
+// that it's recommended to delay the compilation of this method.
void NonTieredCompPolicy::delay_compilation(Method* method) {
MethodCounters* mcs = method->method_counters();
if (mcs != NULL) {
--- a/hotspot/src/share/vm/runtime/compilationPolicy.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/compilationPolicy.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -72,7 +72,7 @@
// reprofile request
virtual void reprofile(ScopeDesc* trap_scope, bool is_osr) = 0;
// delay_compilation(method) can be called by any component of the runtime to notify the policy
- // that it's recommended to delay the complation of this method.
+ // that it's recommended to delay the compilation of this method.
virtual void delay_compilation(Method* method) = 0;
// disable_compilation() is called whenever the runtime decides to disable compilation of the
// specified method.
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -380,7 +380,7 @@
frame deopt_sender = stub_frame.sender(&dummy_map); // First is the deoptee frame
deopt_sender = deopt_sender.sender(&dummy_map); // Now deoptee caller
- // It's possible that the number of paramters at the call site is
+ // It's possible that the number of parameters at the call site is
// different than number of arguments in the callee when method
// handles are used. If the caller is interpreted get the real
// value so that the proper amount of space can be added to it's
@@ -540,7 +540,7 @@
// popframe condition bit set, we should always clear it now
thread->clear_popframe_condition();
#else
- // C++ interpeter will clear has_pending_popframe when it enters
+ // C++ interpreter will clear has_pending_popframe when it enters
// with method_resume. For deopt_resume2 we clear it now.
if (thread->popframe_forcing_deopt_reexecution())
thread->clear_popframe_condition();
--- a/hotspot/src/share/vm/runtime/deoptimization.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/deoptimization.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -206,7 +206,7 @@
// Called by assembly stub after execution has returned to
// deoptimized frame and after the stack unrolling.
// @argument thread. Thread where stub_frame resides.
- // @argument exec_mode. Determines how execution should be continuted in top frame.
+ // @argument exec_mode. Determines how execution should be continued in top frame.
// 0 means continue after current byte code
// 1 means exception has happened, handle exception
// 2 means reexecute current bytecode (for uncommon traps).
--- a/hotspot/src/share/vm/runtime/frame.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/frame.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -649,7 +649,7 @@
#endif
}
-// Return whether the frame is in the VM or os indicating a Hotspot problem.
+// Print whether the frame is in the VM or OS indicating a HotSpot problem.
// Otherwise, it's likely a bug in the native library that the Java code calls,
// hopefully indicating where to submit bugs.
void frame::print_C_frame(outputStream* st, char* buf, int buflen, address pc) {
@@ -928,7 +928,7 @@
// klass, and the klass needs to be kept alive while executing. The GCs
// don't trace through method pointers, so typically in similar situations
// the mirror or the class loader of the klass are installed as a GC root.
- // To minimze the overhead of doing that here, we ask the GC to pass down a
+ // To minimize the overhead of doing that here, we ask the GC to pass down a
// closure that knows how to keep klasses alive given a ClassLoaderData.
cld_f->do_cld(m->method_holder()->class_loader_data());
}
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/globals.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -3135,15 +3135,15 @@
"Maximum size of class area in Metaspace when compressed " \
"class pointers are used") \
\
- product(uintx, MinHeapFreeRatio, 40, \
+ manageable(uintx, MinHeapFreeRatio, 40, \
"The minimum percentage of heap free after GC to avoid expansion."\
- " For most GCs this applies to the old generation. In G1 it" \
- " applies to the whole heap. Not supported by ParallelGC.") \
- \
- product(uintx, MaxHeapFreeRatio, 70, \
+ " For most GCs this applies to the old generation. In G1 and" \
+ " ParallelGC it applies to the whole heap.") \
+ \
+ manageable(uintx, MaxHeapFreeRatio, 70, \
"The maximum percentage of heap free after GC to avoid shrinking."\
- " For most GCs this applies to the old generation. In G1 it" \
- " applies to the whole heap. Not supported by ParallelGC.") \
+ " For most GCs this applies to the old generation. In G1 and" \
+ " ParallelGC it applies to the whole heap.") \
\
product(intx, SoftRefLRUPolicyMSPerMB, 1000, \
"Number of milliseconds per MB of free space in the heap") \
@@ -3639,7 +3639,7 @@
product(uintx, MaxDirectMemorySize, 0, \
"Maximum total size of NIO direct-buffer allocations") \
\
- /* temporary developer defined flags */ \
+ /* Flags used for temporary code during development */ \
\
diagnostic(bool, UseNewCode, false, \
"Testing Only: Use the new version while testing") \
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -31,7 +31,7 @@
// Construct enum of Flag_<cmdline-arg> constants.
-// Parens left off in the following for the enum decl below.
+// Parenthesis left off in the following for the enum decl below.
#define FLAG_MEMBER(flag) Flag_##flag
#define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
--- a/hotspot/src/share/vm/runtime/handles.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/handles.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -267,7 +267,7 @@
// HandleMarks manually.
//
// A HandleMark constructor will record the current handle area top, and the
-// desctructor will reset the top, destroying all handles allocated in between.
+// destructor will reset the top, destroying all handles allocated in between.
// The following code will therefore NOT work:
//
// Handle h;
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -302,7 +302,7 @@
// Check if we need to wrap a potential OS exception handler around thread
// This is used for e.g. Win32 structured exception handlers
assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls");
- // Need to wrap each and everytime, since there might be native code down the
+ // Need to wrap each and every time, since there might be native code down the
// stack that has installed its own exception handlers
os::os_exception_wrapper(call_helper, result, &method, args, THREAD);
}
--- a/hotspot/src/share/vm/runtime/jniHandles.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/jniHandles.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -463,7 +463,7 @@
// Append new block
Thread* thread = Thread::current();
Handle obj_handle(thread, obj);
- // This can block, so we need to preserve obj accross call.
+ // This can block, so we need to preserve obj across call.
_last->_next = JNIHandleBlock::allocate_block(thread);
_last = _last->_next;
_allocate_before_rebuild--;
@@ -530,7 +530,7 @@
return result;
}
-// This method is not thread-safe, i.e., must be called whule holding a lock on the
+// This method is not thread-safe, i.e., must be called while holding a lock on the
// structure.
long JNIHandleBlock::memory_usage() const {
return length() * sizeof(JNIHandleBlock);
--- a/hotspot/src/share/vm/runtime/jniHandles.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/jniHandles.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -106,7 +106,7 @@
JNIHandleBlock* _next; // Link to next block
// The following instance variables are only used by the first block in a chain.
- // Having two types of blocks complicates the code and the space overhead in negligble.
+ // Having two types of blocks complicates the code and the space overhead in negligible.
JNIHandleBlock* _last; // Last block in use
JNIHandleBlock* _pop_frame_link; // Block to restore on PopLocalFrame call
oop* _free_list; // Handle free list
--- a/hotspot/src/share/vm/runtime/mutex.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/mutex.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -507,7 +507,7 @@
_OnDeck = NULL ;
// Note that we current drop the inner lock (clear OnDeck) in the slow-path
- // epilog immediately after having acquired the outer lock.
+ // epilogue immediately after having acquired the outer lock.
// But instead we could consider the following optimizations:
// A. Shift or defer dropping the inner lock until the subsequent IUnlock() operation.
// This might avoid potential reacquisition of the inner lock in IUlock().
@@ -931,7 +931,7 @@
check_block_state(Self);
if (Self->is_Java_thread()) {
- // Horribile dictu - we suffer through a state transition
+ // Horrible dictu - we suffer through a state transition
assert(rank() > Mutex::special, "Potential deadlock with special or lesser rank mutex");
ThreadBlockInVM tbivm ((JavaThread *) Self) ;
ILock (Self) ;
@@ -963,7 +963,7 @@
}
-// Returns true if thread succeceed [sic] in grabbing the lock, otherwise false.
+// Returns true if thread succeeds in grabbing the lock, otherwise false.
bool Monitor::try_lock() {
Thread * const Self = Thread::current();
--- a/hotspot/src/share/vm/runtime/mutex.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/mutex.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -90,7 +90,7 @@
// A special lock: Is a lock where you are guaranteed not to block while you are
// holding it, i.e., no vm operation can happen, taking other locks, etc.
// NOTE: It is critical that the rank 'special' be the lowest (earliest)
- // (except for "event"?) for the deadlock dection to work correctly.
+ // (except for "event"?) for the deadlock detection to work correctly.
// The rank native is only for use in Mutex's created by JVM_RawMonitorCreate,
// which being external to the VM are not subject to deadlock detection.
// The rank safepoint is used only for synchronization in reaching a
@@ -241,7 +241,7 @@
//
// Currently, however, the base object is a monitor. Monitor contains all the
// logic for wait(), notify(), etc. Mutex extends monitor and restricts the
-// visiblity of wait(), notify(), and notify_all().
+// visibility of wait(), notify(), and notify_all().
//
// Another viable alternative would have been to have Monitor extend Mutex and
// implement all the normal mutex and wait()-notify() logic in Mutex base class.
--- a/hotspot/src/share/vm/runtime/mutexLocker.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/mutexLocker.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -43,7 +43,7 @@
// Mutexes used in the VM.
extern Mutex* Patching_lock; // a lock used to guard code patching of compiled code
-extern Monitor* SystemDictionary_lock; // a lock on the system dictonary
+extern Monitor* SystemDictionary_lock; // a lock on the system dictionary
extern Mutex* PackageTable_lock; // a lock on the class loader package table
extern Mutex* CompiledIC_lock; // a lock used to guard compiled IC patching and access
extern Mutex* InlineCacheBuffer_lock; // a lock used to guard the InlineCacheBuffer
@@ -345,8 +345,8 @@
// - reentrant locking
// - locking out of order
//
-// Only too be used for verify code, where we can relaxe out dead-lock
-// dection code a bit (unsafe, but probably ok). This code is NEVER to
+// Only to be used for verify code, where we can relax out dead-lock
+// detection code a bit (unsafe, but probably ok). This code is NEVER to
// be included in a product version.
//
class VerifyMutexLocker: StackObj {
@@ -358,7 +358,7 @@
_mutex = mutex;
_reentrant = mutex->owned_by_self();
if (!_reentrant) {
- // We temp. diable strict safepoint checking, while we require the lock
+ // We temp. disable strict safepoint checking, while we require the lock
FlagSetting fs(StrictSafepointChecks, false);
_mutex->lock();
}
--- a/hotspot/src/share/vm/runtime/objectMonitor.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/objectMonitor.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -234,7 +234,7 @@
// * Taken together, the cxq and the EntryList constitute or form a
// single logical queue of threads stalled trying to acquire the lock.
// We use two distinct lists to improve the odds of a constant-time
-// dequeue operation after acquisition (in the ::enter() epilog) and
+// dequeue operation after acquisition (in the ::enter() epilogue) and
// to reduce heat on the list ends. (c.f. Michael Scott's "2Q" algorithm).
// A key desideratum is to minimize queue & monitor metadata manipulation
// that occurs while holding the monitor lock -- that is, we want to
@@ -677,7 +677,7 @@
// non-null and elect a new "Responsible" timer thread.
//
// This thread executes:
- // ST Responsible=null; MEMBAR (in enter epilog - here)
+ // ST Responsible=null; MEMBAR (in enter epilogue - here)
// LD cxq|EntryList (in subsequent exit)
//
// Entering threads in the slow/contended path execute:
@@ -2031,7 +2031,7 @@
TEVENT (Spin abort -- too many spinners) ;
return 0 ;
}
- // Slighty racy, but benign ...
+ // Slightly racy, but benign ...
Adjust (&_Spinner, 1) ;
}
--- a/hotspot/src/share/vm/runtime/objectMonitor.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/objectMonitor.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -101,7 +101,7 @@
static int Spinner_offset_in_bytes() { return offset_of(ObjectMonitor, _Spinner); }
public:
- // Eventaully we'll make provisions for multiple callbacks, but
+ // Eventually we'll make provisions for multiple callbacks, but
// now one will suffice.
static int (*SpinCallbackFunction)(intptr_t, int) ;
static intptr_t SpinCallbackArgument ;
@@ -272,7 +272,7 @@
// type int, or int32_t but not intptr_t. There's no reason
// to use 64-bit fields for these variables on a 64-bit JVM.
- volatile intptr_t _count; // reference count to prevent reclaimation/deflation
+ volatile intptr_t _count; // reference count to prevent reclamation/deflation
// at stop-the-world time. See deflate_idle_monitors().
// _count is approximately |_WaitSet| + |_EntryList|
protected:
--- a/hotspot/src/share/vm/runtime/orderAccess.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/orderAccess.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -61,13 +61,13 @@
//
// Ensures that Load1 completes before Store2 and any subsequent store
// operations. Loads before Load1 may *not* float below Store2 and any
-// subseqeuent store operations.
+// subsequent store operations.
//
// StoreLoad: Store1(s); StoreLoad; Load2
//
// Ensures that Store1 completes before Load2 and any subsequent load
// operations. Stores before Store1 may *not* float below Load2 and any
-// subseqeuent load operations.
+// subsequent load operations.
//
//
// We define two further operations, 'release' and 'acquire'. They are
@@ -176,7 +176,7 @@
// compilers that we currently use (SunStudio, gcc and VC++) respect the
// semantics of volatile here. If you build HotSpot using other
// compilers, you may need to verify that no compiler reordering occurs
-// across the sequence point respresented by the volatile access.
+// across the sequence point represented by the volatile access.
//
//
// os::is_MP Considered Redundant
@@ -311,7 +311,7 @@
private:
// This is a helper that invokes the StubRoutines::fence_entry()
// routine if it exists, It should only be used by platforms that
- // don't another way to do the inline eassembly.
+ // don't have another way to do the inline assembly.
static void StubRoutines_fence();
};
--- a/hotspot/src/share/vm/runtime/os.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/os.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -236,7 +236,7 @@
while (true) {
int sig;
{
- // FIXME : Currently we have not decieded what should be the status
+ // FIXME : Currently we have not decided what should be the status
// for this java thread blocked here. Once we decide about
// that we should fix this.
sig = os::signal_wait();
@@ -583,7 +583,7 @@
ptrdiff_t size = *size_addr_from_base(start_of_prev_block);
u_char* obj = start_of_prev_block + space_before;
if (size <= 0 ) {
- // start is bad; mayhave been confused by OS data inbetween objects
+ // start is bad; may have been confused by OS data in between objects
// search one more backwards
start_of_prev_block = find_cushion_backwards(start_of_prev_block);
size = *size_addr_from_base(start_of_prev_block);
@@ -1011,7 +1011,7 @@
if (Universe::heap()->is_in(addr)) {
HeapWord* p = Universe::heap()->block_start(addr);
bool print = false;
- // If we couldn't find it it just may mean that heap wasn't parseable
+ // If we couldn't find it it just may mean that heap wasn't parsable
// See if we were just given an oop directly
if (p != NULL && Universe::heap()->block_is_obj(p)) {
print = true;
@@ -1262,9 +1262,6 @@
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/lib/jfr.jar:"
-#ifdef __APPLE__
- "%/lib/JObjC.jar:"
-#endif
"%/classes";
char* sysclasspath = format_boot_path(classpath_format, home, home_len, fileSep, pathSep);
if (sysclasspath == NULL) return false;
@@ -1446,7 +1443,7 @@
// >= 2 physical CPU's and >=2GB of memory, with some fuzz
// because the graphics memory (?) sometimes masks physical memory.
// If you want to change the definition of a server class machine
-// on some OS or platform, e.g., >=4GB on Windohs platforms,
+// on some OS or platform, e.g., >=4GB on Windows platforms,
// then you'll have to parameterize this method based on that state,
// as was done for logical processors here, or replicate and
// specialize this method for each platform. (Or fix os to have
--- a/hotspot/src/share/vm/runtime/os.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/os.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -395,7 +395,7 @@
// was equal. However, some platforms mask off faulting addresses
// to the page size, so now we just check that the address is
// within the page. This makes the thread argument unnecessary,
- // but we retain the NULL check to preserve existing behaviour.
+ // but we retain the NULL check to preserve existing behavior.
if (thread == NULL) return false;
address page = (address) _mem_serialize_page;
return addr >= page && addr < (page + os::vm_page_size());
@@ -543,7 +543,7 @@
// Loads .dll/.so and
// in case of error it checks if .dll/.so was built for the
- // same architecture as Hotspot is running on
+ // same architecture as HotSpot is running on
static void* dll_load(const char *name, char *ebuf, int ebuflen);
// lookup symbol in a shared library
--- a/hotspot/src/share/vm/runtime/park.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/park.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -117,7 +117,7 @@
// 6399321 As a temporary measure we copied & modified the ParkEvent::
// allocate() and release() code for use by Parkers. The Parker:: forms
-// will eventually be removed as we consolide and shift over to ParkEvents
+// will eventually be removed as we consolidate and shift over to ParkEvents
// for both builtin synchronization and JSR166 operations.
volatile int Parker::ListLock = 0 ;
--- a/hotspot/src/share/vm/runtime/perfData.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/perfData.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -39,7 +39,7 @@
PerfDataList* PerfDataManager::_constants = NULL;
/*
- * The jvmstat global and subsysem jvmstat counter name spaces. The top
+ * The jvmstat global and subsystem jvmstat counter name spaces. The top
* level name spaces imply the interface stability level of the counter,
* which generally follows the Java package, class, and property naming
* conventions. The CounterNS enumeration values should be used to index
--- a/hotspot/src/share/vm/runtime/perfData.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/perfData.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -116,7 +116,7 @@
*
* A PerfData subtype is not required to provide an implementation for
* each variability classification. For example, the String type provides
- * Variable and Constant variablility classifications in the PerfStringVariable
+ * Variable and Constant variability classifications in the PerfStringVariable
* and PerfStringConstant classes, but does not provide a counter type.
*
* Performance data are also described by a unit of measure. Units allow
@@ -172,10 +172,10 @@
* foo_counter->inc();
*
* Creating a performance counter that holds a variably change long
- * data value with untis specified in U_Bytes in the "com.sun.ci
+ * data value with units specified in U_Bytes in the "com.sun.ci
* name space.
*
- * PerfLongVariable* bar_varible;
+ * PerfLongVariable* bar_variable;
* bar_variable = PerfDataManager::create_long_variable(COM_CI, "bar",
.* PerfData::U_Bytes,
* optionalInitialValue,
@@ -203,7 +203,7 @@
* In this example, the PerfData pointer can be ignored as the caller
* is relying on the StatSampler PeriodicTask to sample the given
* address at a regular interval. The interval is defined by the
- * PerfDataSamplingInterval global variable, and is applyied on
+ * PerfDataSamplingInterval global variable, and is applied on
* a system wide basis, not on an per-counter basis.
*
* Creating a performance counter in an arbitrary name space that utilizes
@@ -234,7 +234,7 @@
* the UsePerfData flag. Counters will be created on the c-heap
* if UsePerfData is false.
*
- * Until further noice, all PerfData objects should be created and
+ * Until further notice, all PerfData objects should be created and
* manipulated within a guarded block. The guard variable is
* UsePerfData, a product flag set to true by default. This flag may
* be removed from the product in the future.
@@ -586,7 +586,7 @@
*
* The abstraction is not complete. A more general container class
* would provide an Iterator abstraction that could be used to
- * traverse the lists. This implementation still relys upon integer
+ * traverse the lists. This implementation still relies upon integer
* iterators and the at(int index) method. However, the GrowableArray
* is not directly visible outside this class and can be replaced by
* some other implementation, as long as that implementation provides
--- a/hotspot/src/share/vm/runtime/perfMemory.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/perfMemory.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -55,7 +55,7 @@
* of the fields must be changed along with their counterparts in the
* PerfDataBuffer Java class. The first four bytes of this structure
* should never change, or compatibility problems between the monitoring
- * applications and Hotspot VMs will result. The reserved fields are
+ * applications and HotSpot VMs will result. The reserved fields are
* available for future enhancements.
*/
typedef struct {
--- a/hotspot/src/share/vm/runtime/reflection.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -482,7 +482,7 @@
ik = InstanceKlass::cast(hc);
// There's no way to make a host class loop short of patching memory.
- // Therefore there cannot be a loop here unles there's another bug.
+ // Therefore there cannot be a loop here unless there's another bug.
// Still, let's check for it.
assert(--inf_loop_check > 0, "no host_klass loop");
}
--- a/hotspot/src/share/vm/runtime/reflection.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/reflection.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -138,9 +138,9 @@
static BasicType basic_type_mirror_to_basic_type(oop basic_type_mirror, TRAPS);
public:
- // Method invokation through java.lang.reflect.Method
+ // Method invocation through java.lang.reflect.Method
static oop invoke_method(oop method_mirror, Handle receiver, objArrayHandle args, TRAPS);
- // Method invokation through java.lang.reflect.Constructor
+ // Method invocation through java.lang.reflect.Constructor
static oop invoke_constructor(oop method_mirror, objArrayHandle args, TRAPS);
};
--- a/hotspot/src/share/vm/runtime/registerMap.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/registerMap.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -70,7 +70,7 @@
// 3) The RegisterMap keeps track of the values of callee-saved registers
// from frame to frame (hence, the name). For some stack traversal the
// values of the callee-saved registers does not matter, e.g., if you
-// only need the static properies such as frame type, pc, and such.
+// only need the static properties such as frame type, pc, and such.
// Updating of the RegisterMap can be turned off by instantiating the
// register map as: RegisterMap map(thread, false);
--- a/hotspot/src/share/vm/runtime/relocator.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/relocator.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -141,7 +141,7 @@
}
// size is the new size of the instruction at bci. Hence, if size is less than the current
-// instruction sice, we will shrink the code.
+// instruction size, we will shrink the code.
methodHandle Relocator::insert_space_at(int bci, int size, u_char inst_buffer[], TRAPS) {
_changes = new GrowableArray<ChangeItem*> (10);
_changes->push(new ChangeWiden(bci, size, inst_buffer));
@@ -192,7 +192,7 @@
// Execute operation
if (!ci->handle_code_change(this)) return false;
- // Shuffel items up
+ // Shuffle items up
for (int index = 1; index < _changes->length(); index++) {
_changes->at_put(index-1, _changes->at(index));
}
@@ -214,7 +214,7 @@
}
// We need a special instruction size method, since lookupswitches and tableswitches might not be
-// properly alligned during relocation
+// properly aligned during relocation
int Relocator::rc_instr_len(int bci) {
Bytecodes::Code bc= code_at(bci);
switch (bc) {
@@ -611,7 +611,7 @@
// In case we have shrunken a tableswitch/lookupswitch statement, we store the last
// bytes that get overwritten. We have to copy the bytes after the change_jumps method
- // has been called, since it is likly to update last offset in a tableswitch/lookupswitch
+ // has been called, since it is likely to update last offset in a tableswitch/lookupswitch
if (delta < 0) {
assert(delta>=-3, "we cannot overwrite more than 3 bytes");
memcpy(_overwrite, addr_at(bci + ilen + delta), -delta);
--- a/hotspot/src/share/vm/runtime/safepoint.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -156,7 +156,7 @@
// stopped by different mechanisms:
//
// 1. Running interpreted
- // The interpeter dispatch table is changed to force it to
+ // The interpreter dispatch table is changed to force it to
// check for a safepoint condition between bytecodes.
// 2. Running in native code
// When returning from the native code, a Java thread must check
@@ -282,7 +282,7 @@
// See the comments in synchronizer.cpp for additional remarks on spinning.
//
// In the future we might:
- // 1. Modify the safepoint scheme to avoid potentally unbounded spinning.
+ // 1. Modify the safepoint scheme to avoid potentially unbounded spinning.
// This is tricky as the path used by a thread exiting the JVM (say on
// on JNI call-out) simply stores into its state field. The burden
// is placed on the VM thread, which must poll (spin).
@@ -489,7 +489,7 @@
ConcurrentGCThread::safepoint_desynchronize();
}
#endif // INCLUDE_ALL_GCS
- // record this time so VMThread can keep track how much time has elasped
+ // record this time so VMThread can keep track how much time has elapsed
// since last safepoint.
_end_of_last_safepoint = os::javaTimeMillis();
}
@@ -826,7 +826,7 @@
void SafepointSynchronize::print_safepoint_timeout(SafepointTimeoutReason reason) {
if (!timeout_error_printed) {
timeout_error_printed = true;
- // Print out the thread infor which didn't reach the safepoint for debugging
+ // Print out the thread info which didn't reach the safepoint for debugging
// purposes (useful when there are lots of threads in the debugger).
tty->print_cr("");
tty->print_cr("# SafepointSynchronize::begin: Timeout detected:");
@@ -1093,7 +1093,7 @@
if (caller_fr.is_deoptimized_frame()) {
// The exception patch will destroy registers that are still
// live and will be needed during deoptimization. Defer the
- // Async exception should have defered the exception until the
+ // Async exception should have deferred the exception until the
// next safepoint which will be detected when we get into
// the interpreter so if we have an exception now things
// are messed up.
--- a/hotspot/src/share/vm/runtime/safepoint.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/safepoint.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -59,7 +59,7 @@
public:
enum SynchronizeState {
_not_synchronized = 0, // Threads not synchronized at a safepoint
- // Keep this value 0. See the coment in do_call_back()
+ // Keep this value 0. See the comment in do_call_back()
_synchronizing = 1, // Synchronizing in progress
_synchronized = 2 // All Java threads are stopped at a safepoint. Only VM thread is running
};
@@ -91,7 +91,7 @@
} SafepointStats;
private:
- static volatile SynchronizeState _state; // Threads might read this flag directly, without acquireing the Threads_lock
+ static volatile SynchronizeState _state; // Threads might read this flag directly, without acquiring the Threads_lock
static volatile int _waiting_to_block; // number of threads we are waiting for to block
static int _current_jni_active_count; // Counts the number of active critical natives during the safepoint
@@ -106,7 +106,7 @@
private:
static long _end_of_last_safepoint; // Time of last safepoint in milliseconds
- // statistics
+ // Statistics
static jlong _safepoint_begin_time; // time when safepoint begins
static SafepointStats* _safepoint_stats; // array of SafepointStats struct
static int _cur_stat_index; // current index to the above array
@@ -155,7 +155,7 @@
_current_jni_active_count++;
}
- // Called when a thread volantary blocks
+ // Called when a thread voluntarily blocks
static void block(JavaThread *thread);
static void signal_thread_at_safepoint() { _waiting_to_block--; }
@@ -172,7 +172,7 @@
static bool is_cleanup_needed();
static void do_cleanup_tasks();
- // debugging
+ // Debugging
static void print_state() PRODUCT_RETURN;
static void safepoint_msg(const char* format, ...) PRODUCT_RETURN;
@@ -183,7 +183,7 @@
static void set_is_at_safepoint() { _state = _synchronized; }
static void set_is_not_at_safepoint() { _state = _not_synchronized; }
- // assembly support
+ // Assembly support
static address address_of_state() { return (address)&_state; }
static address safepoint_counter_addr() { return (address)&_safepoint_counter; }
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -472,7 +472,7 @@
return (jdouble)x;
JRT_END
-// Exception handling accross interpreter/compiler boundaries
+// Exception handling across interpreter/compiler boundaries
//
// exception_handler_for_return_address(...) returns the continuation address.
// The continuation address is the entry point of the exception handler of the
@@ -694,8 +694,8 @@
// Allow abbreviated catch tables. The idea is to allow a method
// to materialize its exceptions without committing to the exact
// routing of exceptions. In particular this is needed for adding
- // a synthethic handler to unlock monitors when inlining
- // synchonized methods since the unlock path isn't represented in
+ // a synthetic handler to unlock monitors when inlining
+ // synchronized methods since the unlock path isn't represented in
// the bytecodes.
t = table.entry_for(catch_pco, -1, 0);
}
@@ -819,7 +819,7 @@
// Exception happened in CodeCache. Must be either:
// 1. Inline-cache check in C2I handler blob,
// 2. Inline-cache check in nmethod, or
- // 3. Implict null exception in nmethod
+ // 3. Implicit null exception in nmethod
if (!cb->is_nmethod()) {
bool is_in_blob = cb->is_adapter_blob() || cb->is_method_handles_adapter_blob();
@@ -2850,7 +2850,7 @@
// called from very start of a compiled OSR nmethod. A temp array is
// allocated to hold the interesting bits of the interpreter frame. All
// active locks are inflated to allow them to move. The displaced headers and
-// active interpeter locals are copied into the temp buffer. Then we return
+// active interpreter locals are copied into the temp buffer. Then we return
// back to the compiled code. The compiled code then pops the current
// interpreter frame off the stack and pushes a new compiled frame. Then it
// copies the interpreter locals and displaced headers where it wants.
--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -382,7 +382,7 @@
// present if we see that compiled code is present the compiled call site
// will be patched/re-resolved so that later calls will run compiled.
- // Aditionally a c2i blob need to have a unverified entry because it can be reached
+ // Additionally a c2i blob need to have a unverified entry because it can be reached
// in situations where the call site is an inlined cache site and may go megamorphic.
// A i2c adapter is simpler than the c2i adapter. This is because it is assumed
@@ -576,7 +576,7 @@
// arguments for a Java-compiled call, and jumps to Rmethod-> code()->
// code_begin(). It is broken to call it without an nmethod assigned.
// The usual behavior is to lift any register arguments up out of the
-// stack and possibly re-pack the extra arguments to be contigious.
+// stack and possibly re-pack the extra arguments to be contiguous.
// I2C adapters will save what the interpreter's stack pointer will be
// after arguments are popped, then adjust the interpreter's frame
// size to force alignment and possibly to repack the arguments.
@@ -593,7 +593,7 @@
// outgoing stack args will be dead after the copy.
//
// Native wrappers, like adapters, marshal arguments. Unlike adapters they
-// also perform an offical frame push & pop. They have a call to the native
+// also perform an official frame push & pop. They have a call to the native
// routine in their middles and end in a return (instead of ending in a jump).
// The native wrappers are stored in real nmethods instead of the BufferBlobs
// used by the adapters. The code generation happens here because it's very
@@ -610,7 +610,7 @@
#ifdef ASSERT
// Captures code and signature used to generate this adapter when
- // verifing adapter equivalence.
+ // verifying adapter equivalence.
unsigned char* _saved_code;
int _saved_code_length;
#endif
--- a/hotspot/src/share/vm/runtime/sharedRuntimeTrans.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/sharedRuntimeTrans.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -113,7 +113,7 @@
}
/* __ieee754_log(x)
- * Return the logrithm of x
+ * Return the logarithm of x
*
* Method :
* 1. Argument Reduction: find k and f such that
--- a/hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -223,7 +223,7 @@
*
* fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
*
- * ih integer. If >0 it indicats q[] is >= 0.5, hence
+ * ih integer. If >0 it indicates q[] is >= 0.5, hence
* it also indicates the *sign* of the result.
*
*/
@@ -347,7 +347,7 @@
if(z==0.0) {
jz -= 1; q0 -= 24;
while(iq[jz]==0) { jz--; q0-=24;}
- } else { /* break z into 24-bit if neccessary */
+ } else { /* break z into 24-bit if necessary */
z = scalbnA(z,-q0);
if(z>=two24B) {
fw = (double)((int)(twon24*z));
@@ -409,7 +409,7 @@
/*
* ====================================================
- * Copyright (c) 1993 Oracle and/or its affilates. All rights reserved.
+ * Copyright (c) 1993 Oracle and/or its affiliates. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
--- a/hotspot/src/share/vm/runtime/signature.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/signature.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -152,7 +152,7 @@
_parameter_index = 0;
}
-// Optimized version of iterat_parameters when fingerprint is known
+// Optimized version of iterate_parameters when fingerprint is known
void SignatureIterator::iterate_parameters( uint64_t fingerprint ) {
uint64_t saved_fingerprint = fingerprint;
--- a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -387,7 +387,7 @@
int bci, CompLevel level, nmethod* nm, JavaThread* thread) {
// If the method is already compiling, quickly bail out.
if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, bci)) {
- // Use loop event as an opportinity to also check there's been
+ // Use loop event as an opportunity to also check there's been
// enough calls.
CompLevel cur_level = comp_level(mh());
CompLevel next_level = call_event(mh(), cur_level);
--- a/hotspot/src/share/vm/runtime/statSampler.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/statSampler.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -222,8 +222,8 @@
* The list of System Properties that have corresponding PerfData
* string instrumentation created by retrieving the named property's
* value from System.getProperty() and unconditionally creating a
- * PerfStringConstant object initialized to the retreived value. This
- * is not an exhustive list of Java properties with corresponding string
+ * PerfStringConstant object initialized to the retrieved value. This
+ * is not an exhaustive list of Java properties with corresponding string
* instrumentation as the create_system_property_instrumentation() method
* creates other property based instrumentation conditionally.
*/
@@ -325,7 +325,7 @@
// create string instrumentation for various Java properties.
create_system_property_instrumentation(CHECK);
- // hotspot flags (from .hotspotrc) and args (from command line)
+ // HotSpot flags (from .hotspotrc) and args (from command line)
//
PerfDataManager::create_string_constant(JAVA_RT, "vmFlags",
Arguments::jvm_flags(), CHECK);
--- a/hotspot/src/share/vm/runtime/stubCodeGenerator.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/stubCodeGenerator.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -111,7 +111,7 @@
};
-// Stack-allocated helper class used to assciate a stub code with a name.
+// Stack-allocated helper class used to associate a stub code with a name.
// All stub code generating functions that use a StubCodeMark will be registered
// in the global StubCodeDesc list and the generated stub code can be identified
// later via an address pointing into it.
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -737,10 +737,10 @@
}
// Be aware of this method could revoke bias of the lock object.
-// This method querys the ownership of the lock handle specified by 'h_obj'.
+// This method queries the ownership of the lock handle specified by 'h_obj'.
// If the current thread owns the lock, it returns owner_self. If no
// thread owns the lock, it returns owner_none. Otherwise, it will return
-// ower_other.
+// owner_other.
ObjectSynchronizer::LockOwnership ObjectSynchronizer::query_lock_ownership
(JavaThread *self, Handle h_obj) {
// The caller must beware this method can revoke bias, and
--- a/hotspot/src/share/vm/runtime/synchronizer.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/synchronizer.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -49,7 +49,7 @@
// to use enter() and exit() in order to make sure user be ware
// of the performance and semantics difference. They are normally
// used by ObjectLocker etc. The interpreter and compiler use
- // assembly copies of these routines. Please keep them synchornized.
+ // assembly copies of these routines. Please keep them synchronized.
//
// attempt_rebias flag is used by UseBiasedLocking implementation
static void fast_enter (Handle obj, BasicLock* lock, bool attempt_rebias, TRAPS);
--- a/hotspot/src/share/vm/runtime/thread.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/thread.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -767,7 +767,7 @@
void JavaThread::record_jump(address target, address instr, const char* file, int line) {
// This should not need to be atomic as the only way for simultaneous
- // updates is via interrupts. Even then this should be rare or non-existant
+ // updates is via interrupts. Even then this should be rare or non-existent
// and we don't care that much anyway.
int index = _jmp_ring_index;
@@ -925,10 +925,10 @@
// Threads_lock is special, since the safepoint synchronization will not start before this is
// acquired. Hence, a JavaThread cannot be holding it at a safepoint. So is VMOperationRequest_lock,
// since it is used to transfer control between JavaThreads and the VMThread
- // Do not *exclude* any locks unless you are absolutly sure it is correct. Ask someone else first!
+ // Do not *exclude* any locks unless you are absolutely sure it is correct. Ask someone else first!
if ( (cur->allow_vm_block() &&
cur != Threads_lock &&
- cur != Compile_lock && // Temporary: should not be necessary when we get spearate compilation
+ cur != Compile_lock && // Temporary: should not be necessary when we get separate compilation
cur != VMOperationRequest_lock &&
cur != VMOperationQueue_lock) ||
cur->rank() == Mutex::special) {
@@ -1271,7 +1271,7 @@
time_slept = 0;
time_before_loop = now;
} else {
- // need to recalulate since we might have new tasks in _tasks
+ // need to recalculate since we might have new tasks in _tasks
time_slept = (int) ((now - time_before_loop) / 1000000);
}
@@ -1638,7 +1638,7 @@
// initialize thread-local alloc buffer related fields
this->initialize_tlab();
- // used to test validitity of stack trace backs
+ // used to test validity of stack trace backs
this->record_base_of_stack_pointer();
// Record real stack base and size.
@@ -3372,7 +3372,7 @@
// Initialize system properties.
Arguments::init_system_properties();
- // So that JDK version can be used as a discrimintor when parsing arguments
+ // So that JDK version can be used as a discriminator when parsing arguments
JDK_Version_init();
// Update/Initialize System properties after JDK version number is known
@@ -3411,7 +3411,7 @@
jint adjust_after_os_result = Arguments::adjust_after_os();
if (adjust_after_os_result != JNI_OK) return adjust_after_os_result;
- // intialize TLS
+ // initialize TLS
ThreadLocalStorage::init();
// Bootstrap native memory tracking, so it can start recording memory
@@ -4138,7 +4138,7 @@
// but the garbage collector must provide a safe context for them to run.
// In particular, these things should never be called when the Threads_lock
// is held by some other thread. (Note: the Safepoint abstraction also
-// uses the Threads_lock to gurantee this property. It also makes sure that
+// uses the Threads_lock to guarantee this property. It also makes sure that
// all threads gets blocked when exiting or starting).
void Threads::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
--- a/hotspot/src/share/vm/runtime/thread.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/thread.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -1231,7 +1231,7 @@
void set_vframe_array_head(vframeArray* value) { _vframe_array_head = value; }
vframeArray* vframe_array_head() const { return _vframe_array_head; }
- // Side structure for defering update of java frame locals until deopt occurs
+ // Side structure for deferring update of java frame locals until deopt occurs
GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred_locals() const { return _deferred_locals_updates; }
void set_deferred_locals(GrowableArray<jvmtiDeferredLocalVariableSet *>* vf) { _deferred_locals_updates = vf; }
--- a/hotspot/src/share/vm/runtime/unhandledOops.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/unhandledOops.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -34,7 +34,7 @@
// destructor. The constructor adds the oop address on a list
// off each thread and the destructor removes the oop. At a potential
// safepoint, the stack addresses of the local variable oops are trashed
-// with a recognizeable value. If the local variable is used again, it
+// with a recognizable value. If the local variable is used again, it
// will segfault, indicating an unsafe use of that oop.
// eg:
// oop o; //register &o on list
--- a/hotspot/src/share/vm/runtime/vframeArray.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/vframeArray.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -53,7 +53,7 @@
frame _frame; // the interpreter frame we will unpack into
int _bci; // raw bci for this vframe
- bool _reexecute; // whether sould we reexecute this bytecode
+ bool _reexecute; // whether we should reexecute this bytecode
Method* _method; // the method for this vframe
MonitorChunk* _monitors; // active monitors for this vframe
StackValueCollection* _locals;
@@ -158,7 +158,7 @@
// Tells whether index is within bounds.
bool is_within_bounds(int index) const { return 0 <= index && index < frames(); }
- // Accessores for instance variable
+ // Accessories for instance variable
int frames() const { return _frames; }
static vframeArray* allocate(JavaThread* thread, int frame_size, GrowableArray<compiledVFrame*>* chunk,
--- a/hotspot/src/share/vm/runtime/virtualspace.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/virtualspace.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -551,10 +551,10 @@
// Determine which regions need to grow in this expand_by call.
// If you are growing in the lower region, high() must be in that
- // region so calcuate the size based on high(). For the middle and
+ // region so calculate the size based on high(). For the middle and
// upper regions, determine the starting point of growth based on the
// location of high(). By getting the MAX of the region's low address
- // (or the prevoius region's high address) and high(), we can tell if it
+ // (or the previous region's high address) and high(), we can tell if it
// is an intra or inter region growth.
size_t lower_needs = 0;
if (aligned_lower_new_high > lower_high()) {
--- a/hotspot/src/share/vm/runtime/vm_operations.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -154,7 +154,7 @@
void set_next(VM_Operation *next) { _next = next; }
void set_prev(VM_Operation *prev) { _prev = prev; }
- // Configuration. Override these appropriatly in subclasses.
+ // Configuration. Override these appropriately in subclasses.
virtual VMOp_Type type() const = 0;
virtual Mode evaluation_mode() const { return _safepoint; }
virtual bool allow_nested_vm_operations() const { return false; }
--- a/hotspot/src/share/vm/services/attachListener.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/services/attachListener.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -282,6 +282,20 @@
return JNI_ERR;
}
}
+
+ if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) {
+ FormatBuffer<80> err_msg("");
+ if (!Arguments::verify_MaxHeapFreeRatio(err_msg, value)) {
+ out->print_cr(err_msg.buffer());
+ return JNI_ERR;
+ }
+ } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) {
+ FormatBuffer<80> err_msg("");
+ if (!Arguments::verify_MinHeapFreeRatio(err_msg, value)) {
+ out->print_cr(err_msg.buffer());
+ return JNI_ERR;
+ }
+ }
bool res = CommandLineFlags::uintxAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
if (! res) {
out->print_cr("setting flag %s failed", name);
--- a/hotspot/src/share/vm/services/management.cpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/services/management.cpp Sun Feb 02 15:31:40 2014 -0500
@@ -1833,6 +1833,18 @@
succeed = CommandLineFlags::intxAtPut(name, &ivalue, Flag::MANAGEMENT);
} else if (flag->is_uintx()) {
uintx uvalue = (uintx)new_value.j;
+
+ if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) {
+ FormatBuffer<80> err_msg("");
+ if (!Arguments::verify_MaxHeapFreeRatio(err_msg, uvalue)) {
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg.buffer());
+ }
+ } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) {
+ FormatBuffer<80> err_msg("");
+ if (!Arguments::verify_MinHeapFreeRatio(err_msg, uvalue)) {
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg.buffer());
+ }
+ }
succeed = CommandLineFlags::uintxAtPut(name, &uvalue, Flag::MANAGEMENT);
} else if (flag->is_uint64_t()) {
uint64_t uvalue = (uint64_t)new_value.j;
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp Thu Jan 30 14:12:22 2014 -0800
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp Sun Feb 02 15:31:40 2014 -0500
@@ -149,7 +149,7 @@
// The larger HeapWordSize for 64bit requires larger heaps
// for the same application running in 64bit. See bug 4967770.
// The minimum alignment to a heap word size is done. Other
-// parts of the memory system may required additional alignment
+// parts of the memory system may require additional alignment
// and are responsible for those alignments.
#ifdef _LP64
#define ScaleForWordSize(x) align_size_down_((x) * 13 / 10, HeapWordSize)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/codegen/LoadWithMask.java Sun Feb 02 15:31:40 2014 -0500
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8032207
+ * @summary Invalid node sizing for loadUS2L_immI16 and loadI2L_immI
+ * @run main/othervm -server -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,LoadWithMask.foo LoadWithMask
+ *
+ */
+public class LoadWithMask {
+ static int x[] = new int[1];
+ static long foo() {
+ return x[0] & 0xfff0ffff;
+ }
+
+ public static void main(String[] args) {
+ x[0] = -1;
+ long l = 0;
+ for (int i = 0; i < 100000; ++i) {
+ l = foo();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/codegen/LoadWithMask2.java Sun Feb 02 15:31:40 2014 -0500
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8031743
+ * @summary loadI2L_immI broken for negative memory values
+ * @run main/othervm -server -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,*.foo* LoadWithMask2
+ *
+ */
+public class LoadWithMask2 {
+ static int x;
+ static long foo1() {
+ return x & 0xfffffffe;
+ }
+ static long foo2() {
+ return x & 0xff000000;
+ }
+ static long foo3() {
+ return x & 0x8abcdef1;
+ }
+
+ public static void main(String[] args) {
+ x = -1;
+ long l = 0;
+ for (int i = 0; i < 100000; ++i) {
+ l = foo1() & foo2() & foo3();
+ }
+ if (l > 0) {
+ System.out.println("FAILED");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/inlining/DefaultAndConcreteMethodsCHA.java Sun Feb 02 15:31:40 2014 -0500
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8031695
+ * @summary CHA ignores default methods during analysis leading to incorrect code generation
+ *
+ * @run main/othervm -Xbatch DefaultAndConcreteMethodsCHA
+ */
+interface I {
+ default int m() { return 0; }
+}
+
+class A implements I {}
+
+class C extends A { }
+class D extends A { public int m() { return 1; } }
+
+public class DefaultAndConcreteMethodsCHA {
+ public static int test(A obj) {
+ return obj.m();
+ }
+ public static void main(String[] args) {
+ for (int i = 0; i < 10000; i++) {
+ int idC = test(new C());
+ if (idC != 0) {
+ throw new Error("C.m didn't invoke I.m: id "+idC);
+ }
+
+ int idD = test(new D());
+ if (idD != 1) {
+ throw new Error("D.m didn't invoke D.m: id "+idD);
+ }
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/g1/Test2GbHeap.java Sun Feb 02 15:31:40 2014 -0500
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test Test2GbHeap
+ * @bug 8031686
+ * @summary Regression test to ensure we can start G1 with 2gb heap.
+ * @key gc
+ * @key regression
+ * @library /testlibrary
+ */
+
+import java.util.ArrayList;
+
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+public class Test2GbHeap {
+ public static void main(String[] args) throws Exception {
+ ArrayList<String> testArguments = new ArrayList<String>();
+
+ testArguments.add("-XX:+UseG1GC");
+ testArguments.add("-Xmx2g");
+ testArguments.add("-version");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(testArguments.toArray(new String[0]));
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ // Avoid failing test for setups not supported.
+ if (output.getOutput().contains("Could not reserve enough space for 2097152KB object heap")) {
+ // Will fail on machines with too little memory (and Windows 32-bit VM), ignore such failures.
+ output.shouldHaveExitValue(1);
+ } else if (output.getOutput().contains("G1 GC is disabled in this release")) {
+ // G1 is not supported on embedded, ignore such failures.
+ output.shouldHaveExitValue(1);
+ } else {
+ // Normally everything should be fine.
+ output.shouldHaveExitValue(0);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/g1/TestStringSymbolTableStats.java Sun Feb 02 15:31:40 2014 -0500
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestStringSymbolTableStats.java
+ * @bug 8027476 8027455
+ * @summary Ensure that the G1TraceStringSymbolTableScrubbing prints the expected message.
+ * @key gc
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.ProcessTools;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+public class TestStringSymbolTableStats {
+ public static void main(String[] args) throws Exception {
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC",
+ "-XX:+UnlockExperimentalVMOptions",
+ "-XX:+G1TraceStringSymbolTableScrubbing",
+ SystemGCTest.class.getName());
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ System.out.println("Output:\n" + output.getOutput());
+
+ output.shouldContain("Cleaned string and symbol table");
+ output.shouldHaveExitValue(0);
+ }
+
+ static class SystemGCTest {
+ public static void main(String [] args) {
+ System.out.println("Calling System.gc()");
+ System.gc();
+ }
+ }
+}