The 080-oom-throw test case has some code in triggerInstanceOOM to
exhaust memory. Unfortunately, a sufficiently intelligent compiler can
inline the call to memEater.confuseCompilerOptimization and realize that
it is a no-op. In that case, the memEater variable is dead, and if a
compiler can improve the GC map, the only live heap data will be the
last allocated chunk.
Fix this by ensuring that the start of the chain (memEater) is really
live. Also ensure that it becomes dead before exiting the method, or the
subsequent println will fail allocating memory.
Change-Id: I345ebc3e19bd86e176c616ff18bcac4ed8dbb419
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
static class InstanceMemEater {
static boolean sawOome;
+ static InstanceMemEater hook;
InstanceMemEater next;
double d1, d2, d3, d4, d5, d6, d7, d8; // Bloat this object so we fill the heap faster.
}
static void confuseCompilerOptimization(InstanceMemEater instance) {
+ hook = instance;
}
}
lastMemEater = lastMemEater.next;
} while (lastMemEater != null);
memEater.confuseCompilerOptimization(memEater);
+ InstanceMemEater.hook = null;
return InstanceMemEater.sawOome;
}