Updated ARM Spec

David Holmes David.Holmes at oracle.com
Mon Aug 23 02:50:41 PDT 2010


I said the following on 08/23/10 19:35:
> ...
> The "suppressedException" array as I currently understand it would need 
> to be cleared, if the pre-allocated instances with no backtrace can 
> still contain "suppressedExceptions" - which I believe they can.

I just realized however that clearing the suppressed-exception state is 
simply not an option as the same exception instance could be thrown 
concurrently in multiple threads. In short these shared immutable 
exception instances must remain immutable if they are to be shared. 
Hence they can not contain suppressed-exception information.

David Holmes

PS: I am not a subscriber to coin-dev.

> Aside: StackOverflowException is created on demand, not pre-allocated, 
> in Hotspot.
> 
> David Holmes
> ------------
> 
> 
> Rémi Forax said the following on 08/13/10 22:41:
>> Le 13/08/2010 05:28, Neal Gafter a écrit :
>>> When a stack overflow exception suppresses another exception, I assume
>>> it's suppressed exception list will be set.  But since there is only
>>> one such exception allocated by the VM, this will overwrite any data
>>> previously stored there.  Will the VM be modified to comply with this
>>> specification by allocating a new stack-overflow exception each time?
>>> Same question for out-of-memory error.
>>>    
>>
>> This problem already exists with jdk6.
>> This code change the stack trace of permanently allocated 
>> OutOfMerroryError.
>>
>>   public static void main(String[] args) {
>>     Error last = null;
>>
>>     for(int i=0; i<100; i++) {
>>       try {
>>         Object o = new int[Integer.MAX_VALUE];
>>       } catch (Error e) {
>>         StackTraceElement[] stackTrace = e.getStackTrace();
>>         if (stackTrace != null && stackTrace.length>0 && 
>> stackTrace[0].getLineNumber() == -3) {
>>           e.printStackTrace();
>>           return;
>>         }
>>
>>         if (last == e) {
>>           StackTraceElement element = new StackTraceElement("Foo", 
>> "foo", null, -3);
>>           e.setStackTrace(new StackTraceElement[]{element});
>>         }
>>         last = e;
>>       }
>>     }
>>   }
>>
>>
>>
>> To avoid that the VM has to clear the stacktrace when using the 
>> default error:
>> in universe.cpp, in Universe::gen_out_of_memory_error:
>>
>>   if (next < 0) {
>>       // all preallocated errors have been used.
>>       // return default
>> +    java_lang_Throwable::clear_stacktrace(default_err);
>>       return default_err;
>>     } else {
>>
>>
>> And we should do the same for the field suppressed exceptions.
>>
>> Rémi
>>



More information about the coin-dev mailing list