--- a/hotspot/src/share/vm/gc/g1/concurrentG1Refine.cpp Wed Sep 09 23:47:32 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/concurrentG1Refine.cpp Thu Sep 10 06:15:43 2015 +0200
@@ -29,7 +29,7 @@
#include "gc/g1/g1HotCardCache.hpp"
#include "runtime/java.hpp"
-ConcurrentG1Refine::ConcurrentG1Refine(G1CollectedHeap* g1h, CardTableEntryClosure* refine_closure) :
+ConcurrentG1Refine::ConcurrentG1Refine(G1CollectedHeap* g1h) :
_threads(NULL), _n_threads(0),
_hot_card_cache(g1h)
{
@@ -48,29 +48,46 @@
FLAG_SET_DEFAULT(G1ConcRefinementRedZone, yellow_zone() * 2);
}
set_red_zone(MAX2<int>(G1ConcRefinementRedZone, yellow_zone()));
+}
- _n_worker_threads = thread_num();
+ConcurrentG1Refine* ConcurrentG1Refine::create(G1CollectedHeap* g1h, CardTableEntryClosure* refine_closure, jint* ecode) {
+ ConcurrentG1Refine* cg1r = new ConcurrentG1Refine(g1h);
+ if (cg1r == NULL) {
+ *ecode = JNI_ENOMEM;
+ vm_shutdown_during_initialization("Could not create ConcurrentG1Refine");
+ return NULL;
+ }
+ cg1r->_n_worker_threads = thread_num();
// We need one extra thread to do the young gen rset size sampling.
- _n_threads = _n_worker_threads + 1;
+ cg1r->_n_threads = cg1r->_n_worker_threads + 1;
+
+ cg1r->reset_threshold_step();
- reset_threshold_step();
-
- _threads = NEW_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _n_threads, mtGC);
+ cg1r->_threads = NEW_C_HEAP_ARRAY_RETURN_NULL(ConcurrentG1RefineThread*, cg1r->_n_threads, mtGC);
+ if (cg1r->_threads == NULL) {
+ *ecode = JNI_ENOMEM;
+ vm_shutdown_during_initialization("Could not allocate an array for ConcurrentG1RefineThread");
+ return NULL;
+ }
uint worker_id_offset = DirtyCardQueueSet::num_par_ids();
ConcurrentG1RefineThread *next = NULL;
- for (uint i = _n_threads - 1; i != UINT_MAX; i--) {
- ConcurrentG1RefineThread* t = new ConcurrentG1RefineThread(this, next, refine_closure, worker_id_offset, i);
+ for (uint i = cg1r->_n_threads - 1; i != UINT_MAX; i--) {
+ ConcurrentG1RefineThread* t = new ConcurrentG1RefineThread(cg1r, next, refine_closure, worker_id_offset, i);
assert(t != NULL, "Conc refine should have been created");
if (t->osthread() == NULL) {
- vm_shutdown_during_initialization("Could not create ConcurrentG1RefineThread");
+ *ecode = JNI_ENOMEM;
+ vm_shutdown_during_initialization("Could not create ConcurrentG1RefineThread");
+ return NULL;
}
- assert(t->cg1r() == this, "Conc refine thread should refer to this");
- _threads[i] = t;
+ assert(t->cg1r() == cg1r, "Conc refine thread should refer to this");
+ cg1r->_threads[i] = t;
next = t;
}
+ *ecode = JNI_OK;
+ return cg1r;
}
void ConcurrentG1Refine::reset_threshold_step() {
--- a/hotspot/src/share/vm/gc/g1/concurrentG1Refine.hpp Wed Sep 09 23:47:32 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/concurrentG1Refine.hpp Thu Sep 10 06:15:43 2015 +0200
@@ -71,10 +71,15 @@
// Reset the threshold step value based of the current zone boundaries.
void reset_threshold_step();
+ ConcurrentG1Refine(G1CollectedHeap* g1h);
+
public:
- ConcurrentG1Refine(G1CollectedHeap* g1h, CardTableEntryClosure* refine_closure);
~ConcurrentG1Refine();
+ // Returns ConcurrentG1Refine instance if succeeded to create/initialize ConcurrentG1Refine and ConcurrentG1RefineThread.
+ // Otherwise, returns NULL with error code.
+ static ConcurrentG1Refine* create(G1CollectedHeap* g1h, CardTableEntryClosure* refine_closure, jint* ecode);
+
void init(G1RegionToSpaceMapper* card_counts_storage);
void stop();
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Wed Sep 09 23:47:32 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Thu Sep 10 06:15:43 2015 +0200
@@ -2125,7 +2125,11 @@
_refine_cte_cl = new RefineCardTableEntryClosure();
- _cg1r = new ConcurrentG1Refine(this, _refine_cte_cl);
+ jint ecode = JNI_OK;
+ _cg1r = ConcurrentG1Refine::create(this, _refine_cte_cl, &ecode);
+ if (_cg1r == NULL) {
+ return ecode;
+ }
// Reserve the maximum.
--- a/hotspot/src/share/vm/gc/g1/g1EvacStats.cpp Wed Sep 09 23:47:32 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/g1EvacStats.cpp Thu Sep 10 06:15:43 2015 +0200
@@ -46,11 +46,11 @@
if (_allocated == 0) {
assert((_unused == 0),
err_msg("Inconsistency in PLAB stats: "
- "_allocated: "SIZE_FORMAT", "
- "_wasted: "SIZE_FORMAT", "
- "_region_end_waste: "SIZE_FORMAT", "
- "_unused: "SIZE_FORMAT", "
- "_used : "SIZE_FORMAT,
+ "_allocated: " SIZE_FORMAT ", "
+ "_wasted: " SIZE_FORMAT ", "
+ "_region_end_waste: " SIZE_FORMAT ", "
+ "_unused: " SIZE_FORMAT ", "
+ "_used : " SIZE_FORMAT,
_allocated, _wasted, _region_end_waste, _unused, used()));
_allocated = 1;
}
--- a/hotspot/test/gc/g1/humongousObjects/TestHumongousThreshold.java Wed Sep 09 23:47:32 2015 -0400
+++ b/hotspot/test/gc/g1/humongousObjects/TestHumongousThreshold.java Thu Sep 10 06:15:43 2015 +0200
@@ -56,11 +56,11 @@
* gc.g1.humongousObjects.TestHumongousThreshold
*
* @run main/othervm -XX:+UseG1GC -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:.
- * -XX:G1HeapRegionSize=16M
+ * -Xms128M -XX:G1HeapRegionSize=16M
* gc.g1.humongousObjects.TestHumongousThreshold
*
* @run main/othervm -XX:+UseG1GC -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:.
- * -XX:G1HeapRegionSize=32M
+ * -Xms200M -XX:G1HeapRegionSize=32M
* gc.g1.humongousObjects.TestHumongousThreshold
*
*/