8246258: Enable hs_err heap printing earlier during initialization

Reviewed-by: stuefe, sjohanss
diff --git a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp
index b262de0..3b81eb4 100644
--- a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp
+++ b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp
@@ -286,8 +286,10 @@
   // Cast away constness:
   ((VirtualSpace)_virtual_space).print_on(st);
 
-  st->print_cr("Allocation space:");
-  _space->print_on(st);
+  if (_space != NULL) {
+    st->print_cr("Allocation space:");
+    _space->print_on(st);
+  }
 
   MetaspaceUtils::print_on(st);
 }
diff --git a/src/hotspot/share/gc/epsilon/epsilonHeap.hpp b/src/hotspot/share/gc/epsilon/epsilonHeap.hpp
index 6147c80..db22ea7 100644
--- a/src/hotspot/share/gc/epsilon/epsilonHeap.hpp
+++ b/src/hotspot/share/gc/epsilon/epsilonHeap.hpp
@@ -52,7 +52,8 @@
   static EpsilonHeap* heap();
 
   EpsilonHeap() :
-          _memory_manager("Epsilon Heap", "") {};
+          _memory_manager("Epsilon Heap", ""),
+          _space(NULL) {};
 
   virtual Name kind() const {
     return CollectedHeap::Epsilon;
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
index 7030b0c..d3ac807 100644
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
@@ -2507,11 +2507,13 @@
 
 void G1CollectedHeap::print_on(outputStream* st) const {
   st->print(" %-20s", "garbage-first heap");
-  st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
-            capacity()/K, used_unlocked()/K);
-  st->print(" [" PTR_FORMAT ", " PTR_FORMAT ")",
-            p2i(_hrm->reserved().start()),
-            p2i(_hrm->reserved().end()));
+  if (_hrm != NULL) {
+    st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
+              capacity()/K, used_unlocked()/K);
+    st->print(" [" PTR_FORMAT ", " PTR_FORMAT ")",
+              p2i(_hrm->reserved().start()),
+              p2i(_hrm->reserved().end()));
+  }
   st->cr();
   st->print("  region size " SIZE_FORMAT "K, ", HeapRegion::GrainBytes / K);
   uint young_regions = young_regions_count();
@@ -2526,7 +2528,8 @@
     st->print("  remaining free region(s) on each NUMA node: ");
     const int* node_ids = _numa->node_ids();
     for (uint node_index = 0; node_index < num_nodes; node_index++) {
-      st->print("%d=%u ", node_ids[node_index], _hrm->num_free_regions(node_index));
+      uint num_free_regions = (_hrm != NULL ? _hrm->num_free_regions(node_index) : 0);
+      st->print("%d=%u ", node_ids[node_index], num_free_regions);
     }
     st->cr();
   }
@@ -2534,6 +2537,10 @@
 }
 
 void G1CollectedHeap::print_regions_on(outputStream* st) const {
+  if (_hrm == NULL) {
+    return;
+  }
+
   st->print_cr("Heap Regions: E=young(eden), S=young(survivor), O=old, "
                "HS=humongous(starts), HC=humongous(continues), "
                "CS=collection set, F=free, "
diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
index ac6901d..f970efc 100644
--- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
+++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
@@ -595,8 +595,12 @@
 }
 
 void ParallelScavengeHeap::print_on(outputStream* st) const {
-  young_gen()->print_on(st);
-  old_gen()->print_on(st);
+  if (young_gen() != NULL) {
+    young_gen()->print_on(st);
+  }
+  if (old_gen() != NULL) {
+    old_gen()->print_on(st);
+  }
   MetaspaceUtils::print_on(st);
 }
 
diff --git a/src/hotspot/share/gc/shared/collectedHeap.cpp b/src/hotspot/share/gc/shared/collectedHeap.cpp
index bdac805..2536863 100644
--- a/src/hotspot/share/gc/shared/collectedHeap.cpp
+++ b/src/hotspot/share/gc/shared/collectedHeap.cpp
@@ -143,7 +143,10 @@
   print_extended_on(st);
   st->cr();
 
-  BarrierSet::barrier_set()->print_on(st);
+  BarrierSet* bs = BarrierSet::barrier_set();
+  if (bs != NULL) {
+    bs->print_on(st);
+  }
 }
 
 void CollectedHeap::trace_heap(GCWhen::Type when, const GCTracer* gc_tracer) {
diff --git a/src/hotspot/share/gc/shared/genCollectedHeap.cpp b/src/hotspot/share/gc/shared/genCollectedHeap.cpp
index d5def39..5362219 100644
--- a/src/hotspot/share/gc/shared/genCollectedHeap.cpp
+++ b/src/hotspot/share/gc/shared/genCollectedHeap.cpp
@@ -82,6 +82,8 @@
                                    Generation::Name old,
                                    const char* policy_counters_name) :
   CollectedHeap(),
+  _young_gen(NULL),
+  _old_gen(NULL),
   _young_gen_spec(new GenerationSpec(young,
                                      NewSize,
                                      MaxNewSize,
@@ -92,9 +94,13 @@
                                    GenAlignment)),
   _rem_set(NULL),
   _soft_ref_gen_policy(),
+  _size_policy(NULL),
   _gc_policy_counters(new GCPolicyCounters(policy_counters_name, 2, 2)),
+  _incremental_collection_failed(false),
   _full_collections_completed(0),
-  _process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)) {
+  _process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)),
+  _young_manager(NULL),
+  _old_manager(NULL) {
 }
 
 jint GenCollectedHeap::initialize() {
@@ -129,7 +135,6 @@
 
   old_rs = old_rs.first_part(_old_gen_spec->max_size());
   _old_gen = _old_gen_spec->init(old_rs, rem_set());
-  clear_incremental_collection_failed();
 
   GCInitLogger::print();
 
@@ -1220,8 +1225,12 @@
 }
 
 void GenCollectedHeap::print_on(outputStream* st) const {
-  _young_gen->print_on(st);
-  _old_gen->print_on(st);
+  if (_young_gen != NULL) {
+    _young_gen->print_on(st);
+  }
+  if (_old_gen != NULL) {
+    _old_gen->print_on(st);
+  }
   MetaspaceUtils::print_on(st);
 }
 
diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp
index 1126ba6..9642d85 100644
--- a/src/hotspot/share/utilities/vmError.cpp
+++ b/src/hotspot/share/utilities/vmError.cpp
@@ -931,9 +931,12 @@
      if (_verbose) {
        GCLogPrecious::print_on_error(st);
 
-       if (Universe::is_fully_initialized()) {
+       if (Universe::heap() != NULL) {
          Universe::heap()->print_on_error(st);
          st->cr();
+       }
+
+       if (Universe::is_fully_initialized()) {
          st->print_cr("Polling page: " INTPTR_FORMAT, p2i(SafepointMechanism::get_polling_page()));
          st->cr();
        }