Updated ARM Spec
Rémi Forax
forax at univ-mlv.fr
Mon Aug 23 03:06:03 PDT 2010
Le 23/08/2010 11:50, David Holmes a écrit :
> 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.
You can explicitly call setStackTrace() on a shared immutable exception,
hence there is a problem.
addSupressedExceptions() will have the same issue.
I think the fix is to:
- silently discard the stack trace taken as argument of setStackTrace()
if the cause is 'null' (or not 'this')
- silently don't register suppressed-exceptions if cause is 'null'
Rémi
>
>> 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 hotspot-runtime-dev
mailing list