-
Bug
-
Resolution: Fixed
-
P3
-
None
-
b19
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8008518 | 8 | Coleen Phillimore | P3 | Closed | Fixed | b78 |
This is related to 8003419. The annotations are allocated in Metaspace during class file parsing and pointers to them are carried around through the parser. In order to clean these up, you'd have to have collect these pointers somewhere so they can be cleaned up if the parse fails.
Instead, attach method annotations to the constMethod so that they can be cleaned up if/when the ConstMethod is cleaned up.
If any annotations exists for any method, an Array<u1> is created for that method, but it's put into an Array<Array<u1>*> (an array of these arrays) where there's an entry for each method in the klass, so the other methods would have a pointer allocated for it whether needed or not. There are 3 of these array of arrays in the type Annotations, and an Annotations* object for type annotations, which are so far created infrequently.
The fix is to move the 4 types of method annotations to embedded pointers in the ConstMethod if they are needed and add a flag to indicate whether they are present. You could embed the annotations directly, but the length has to be pulled out as an 'int' from unaligned storage, and the bit math is getting to be too fragile without a redesign.
The real purpose of this change is to make the annotations allocated in Metaspace easier to find and clean up if class file parsing fails.
- backported by
-
JDK-8008518 NPG: move method annotations
-
- Closed
-
- relates to
-
JDK-8003419 NPG: Clean up metadata created during class loading if failure
-
- Closed
-
-
JDK-8009531 Crash when redefining class with annotated method
-
- Closed
-