Lambda class names no longer reported when listening for JVMTI_EVENT_CLASS_FILE_LOAD events

Brian Goetz brian.goetz at oracle.com
Wed Jan 22 16:18:29 PST 2014


Yes, the numbers after the slash are added by the anon class loader.  

Sent from my iPhone

On Jan 22, 2014, at 7:05 PM, "Frost, Gary" <Gary.Frost at amd.com> wrote:

> Hey Brian
> 
> After a bit of poking around I notice that if I turn on 
> 
> -verbose
> 
> The JVM reports loading the class I am interested in. 
> 
> I also noticed that the classes are passed to the JVMTI callback handler,  however the name is no longer passed, instead we seem to be passing NULL. 
> 
> Of course I have the bytes to the class being passed to my JVMTI handler ;) so when I dive into the classbytes I can indeed match the classname (sort of - see below). 
> 
> It looks like we are still passing the classbytes, we just chose to not pass the name.  Seemingly to make life a littl harder ;) for us Aparapi folk.
> 
> BTW I do note that there is some other  naming weirdness.  
> 
> These classes used to be called something like 
> 
> mypackage.MyClass$$lambda$1
> 
> Now the reflected classname of the implementation of IntConsumer (the lambda I am trying to get bytes for) is now 
> 
> mypackage.MyClass$$Lambda$1/XXXXX (where XXXXX is some 5 digit integer)
> 
> Whereas if I extract the name of the class from the bytes of the class the name is still 
> 
> mypackage.MyClass$$lambda$1
> 
> So whoever is composing this synthetic named class, seems to be encoding a different name in the class, than the name itself.  That seems scary. 
> 
> Gary
> 
> ________________________________________
> From: Brian Goetz [brian.goetz at oracle.com]
> Sent: Thursday, January 23, 2014 7:48 AM
> To: Frost, Gary
> Cc: lambda-dev at openjdk.java.net
> Subject: Re: Lambda class names no longer reported when listening for JVMTI_EVENT_CLASS_FILE_LOAD events
> 
> Yes.  We moved to "anonymous classes" (in the sense of Unsafe.defineAnonymousClass, not anonymous inner classes), for reasons of both security and performance.  This is an unfortunate side effect.
> 
> On Jan 22, 2014, at 5:33 PM, Frost, Gary wrote:
> 
>> Not sure when this change came about but I just started using
>> 
>> java version "1.8.0-ea"
>> Java(TM) SE Runtime Environment (build 1.8.0-ea-b124)
>> 
>> I noticed that the JVMTI agent I use to  listen for JVMTI_EVENT_CLASS_FILE_LOAD events is no longer seeing events for the dynamically create classes created to encapsulate 'captured' args.  Or possibly the class events are triggeted, but the 'name' is NULL. I am seeing an increase in the number of a events reported NULL as the name.
>> 
>> The Aparapi project listens for these events so we can determine the captured args for a given lambda.  These are the synthetic classes created on the fly by the method handle factory.
>> 
>> This had been working fine until recently.  Is there a reason we would stop generating  these, or is this just a regression?
>> 
>> Gary
> 
> 
> 


More information about the lambda-dev mailing list