Adding serviceability-dev@... since this is JVM/TI...

Dan


On 9/25/18 10:48 AM, Doug Simon wrote:
A major design point of Graal is to treat allocations as non-side effecting to 
give more freedom to the optimizer by reducing the number of distinct 
FrameStates that need to be managed. When failing an allocation, Graal will 
deoptimize to the last side effecting instruction before the allocation. This 
mean the VM code for heap allocation will potentially be executed twice, once 
from Graal compiled code and then again in the interpreter. While this is 
perfectly fine according to the JVM specification, it can cause confusing 
behavior for JVMTI based tools. They will receive 2 ResourceExhausted events 
for a single allocation. Furthermore, the first ResourceExhausted event (on the 
Graal allocation slow path) might denote a bytecode instruction that performs 
no allocation, making it hard to debug the memory failure.

The proposed solution is to add an extra set of JVMCI VM runtime calls for 
allocation. These entry points will attempt the allocation and upon failure,
skip side-effects such as posting JVMTI events or handling 
-XX:OnOutOfMemoryError. The compiled code using these entry points is expected 
deoptmize on null.

The path from these new entry points to where allocation can fail goes through 
quite a bit of VM code. One could modify all these paths by:
* Returning null instead of throwing an exception on failure.
* Adding a `bool null_on_fail` argument to all relevant methods.
* Adding extra null checking where necessary after each call to these methods 
when `null_on_fail == true`.
This represents a significant number of changes.

Instead, the proposed solution introduces a new _in_retryable_allocation 
thread-local. This way, only the entry points and allocation routines that 
raise an exception need to be modified. Failure is communicated back to the new 
entry points by throwing a special pre-allocated OOME object (i.e., 
Universe::out_of_memory_error_retry()) which must not propagate back to Java 
code. Use of this object is not strictly necessary; it is introduced to 
highlight/document the special allocation mode.

The proposed solution is at http://cr.openjdk.java.net/~dnsimon/8208686.
THE JBS bug is: https://bugs.openjdk.java.net/browse/JDK-8208686

-Doug

Reply via email to