JDK-8054402 : "klass->is_loader_alive(_is_alive)) failed: must be alive" for anonymous classes
Type:Bug
Component:hotspot
Sub-Component:compiler
Affected Version:8,9
Priority:P3
Status:Resolved
Resolution:Fixed
CPU:generic
Submitted:2014-08-06
Updated:2019-08-08
Resolved:2014-08-14
The Version table provides details related to the release that this issue/RFE will be addressed.
Unresolved : Release in which this issue/RFE will be addressed. Resolved: Release in which this issue/RFE has been resolved. Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.
JDK-8029443 was caused by a C2 bug specific to Sparc but the same error rarely occurs on other platforms as well.
ILW = MLH = P3
Comments
The error is in 'SystemDictionary::do_unloading'. First, 'ClassLoaderDataGraph::do_unloading ' is invoked to remove the class loader data of unloaded classes. Next, 'Dictionary::do_unloading' is called to remove the system dictionary entries of dead classes. 'unloading_occurred' is only set to true if dead class loaders were found _and_ entries were removed from the system dictionary. The problem is that anonymous classes are not in the system dictionary. In the rare case where only anonymous classes were unloaded, 'unloading_occurred' is set to false even if (anonymous) class unloading occurred.
A compiled IC in the C1 compiled method 'java.util.stream.Streams$RangeIntSpliterator::forEachRemaining' references the Klass 'java.util.stream.StreamSpliterators$IntWrappingSpliterator$$Lambda$170/25231275' that belongs to the unloaded mirror klass 'java/util/stream/StreamSpliterators$IntWrappingSpliterator$$Lambda$170'. The problem is that the IC is not cleaned because 'SystemDictionary::do_unloading' in 'GenMarkSweep::mark_sweep_phase1' returned false, i.e no class was unloaded by GC. How is it possible then, that the mirror class is unloaded?