[9] RFR (S): 8060147: SIGSEGV in Metadata::mark_on_stack() while marking metadata in ciEnv

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Thu Oct 30 20:32:55 UTC 2014


Coleen,

I implemented 2 approaches of the fix.

The fix with a special case for VM anon classes is:
http://cr.openjdk.java.net/~vlivanov/8060147/webrev.anon.00/

Both fix the bug, but have different properties.

(1) Special case for VM anon class is very focused on the actual cause, 
but more fragile - all the logic which keeps metadata from being 
deallocated is non-trivial and scattered around the whole ciMetadata 
hierarchy.

(2) On the other hand, initial version, which forcibly creates 
klass_holder ciObject for each ciMetadata, is much cleaner and 
localized, but does unnecessary work.

Am I right that you prefer (1) as a fix?

> I'm sorry that I didn't get to my email today but from the discussion I
> think changing two occurrences of "class_loader" in
> ciInstanceKlass::ciInstanceKlass to "klass_holder" would have solved
> your problem.
I don't think that's what we want. For VM anon classes, _loader == NULL, 
but if we place java_mirror there instead, it could cause problems in 
other parts of VM, since non-NULL _loader value implicates ClassLoader 
instance. Not sure all these places are guarded against seeing VM anon 
classes.

> Unless, you can add a ciMethod or ciMethodData without adding a
> ciInstanceKlass (which I don't think you can).
It's not possible right now. But ciObjectFactory doesn't forbid that.

> I think Roland pointed out a flaw though that you can safepoint before
> adding a ciInstanceKlass though, which you could fix by moving this up
> in ciMethod::ciMethod to before the safepoint.
>
>    _holder = env->get_instance_klass(h_m()->method_holder());
I simply pass _holder value into the ciMethod ctor.

Best regards,
Vladimir Ivanov

> I know I suggested adding the ciObject in ciMetadata but that's because
> this is done somewhere that is hard to find.  A good comment that this
> is what keeps metadata that ci points to from being unloaded by GC would
> help a lot with that.


>
> Thanks,
> Coleen
>
>
> On 10/30/2014 02:06 PM, Vladimir Kozlov wrote:
>> I would go with webrev.01 (updated initial version).
>>
>> Regards,
>> Vladimir
>>
>> On 10/30/14 7:55 AM, Vladimir Ivanov wrote:
>>>>> As a solution, _holder can be passed into ciMethod::ciMethod as a
>>>>> parameter. It should fix the problem.
>>>>
>>>> The first change you suggested
>>>> (http://cr.openjdk.java.net/~vlivanov/8060147/webrev.00) would fix the
>>>> ciMethod::ciMethod problem, right? The code would be more robust that
>>>> way and other similar issues could be avoided.
>>> Yes, initial version fixes ciMethod::ciMethod problem. It's also more
>>> robust and easier to reason about.
>>>
>>> The downside is that for every ciMetadata instantiation we do more work.
>>>
>>> I have an alternative version:
>>> http://cr.openjdk.java.net/~vlivanov/8060147/webrev.anon.00/
>>>
>>> Initial version (updated):
>>> http://cr.openjdk.java.net/~vlivanov/8060147/webrev.01/
>>>
>>> I like initial version more, but I don't have strong opinion here.
>>>
>>> Best regards,
>>> Vladimir Ivanov
>


More information about the hotspot-runtime-dev mailing list