Preload attribute

Dan Heidinga heidinga at redhat.com
Fri Jun 9 15:32:30 UTC 2023


On Thu, Jun 8, 2023 at 2:47 PM Frederic Parain <frederic.parain at oracle.com>
wrote:

> Hi Dan,
>
> I've looked at your exploration of the Preload attribute. The LoaderTest
> test loads class A but it doesn't link it. HotSpot looks at the PreLoad
> attribute at class link time, not class load time (yes, the name is
> misleading), this is why class B is not loaded.
>

Thanks Fred.  I knew I had to be doing something wrong as I couldn't find
anything in the jdk that would have accounted for it.

Interestingly, I missed this in part due to a behaviour difference between
OpenJ9 and Hotspot - by the time OpenJ9 returns a j.l.Class instance, the
vtables have been built and method sendTargets have been set.  It appears
Hotspot initializes the vtable in a separate pass.

--Dan


>
> Replacing the call to loadClass() with a call to Class.forName() to
> force the linking of the class will trigger the processing of the
> PreLoad attribute.
>
>
> public static void main(String[] args) throws Throwable {
>      ARGS = args;
>
>      ClassLoader cl = new LoaderTest2();
>      Class<?> c = Class.forName(args[0], true, cl);
>      System.out.println(""+c+"::loader="+c.getClassLoader());
>
> }
>
>
> Fred
>
>
> On 6/8/23 12:01 PM, Dan Heidinga wrote:
> > Thanks Dan and Fred for the clarification on the current spec and
> > Hotspot behaviour and John for suggesting we remove the attribute.
> >
> > I think the problem with the current status quo for the preload
> > attribute is that we're trying to treat it like an optimization - a
> > "we can have our cake" (know which classes to load at some
> > indeterminate point) and "eat it too" (not promise users anything
> > about when or if those classes will be loaded).
> >
> > As it stands, based just on the spec, it's hard for users to know what
> > the preload attribute will do for them.  There's nothing they can
> > depend on in the spec and are at the mercy of whatever behaviour VM
> > implementers pick on a given day.  Which means they will depend on the
> > current Hotspot behaviour (defacto standardization - yuck!) or expect
> > the behaviour to change all the time.
> >
> > If we decouple the list of preloadable classes from the classfile, how
> > would non-jdk classes be handled?  Many applications are a mix of
> > multiple jar files from different maintenance domains which would make
> > having a combined list difficult.  We'd also need to think through the
> > classloader implications vs today's approach which attempts to load on
> > the same loader as the class with the preload attribute.
> >
> > What if instead of ditching the attribute, or treating it like an
> > optimization, we firmed up the contract and treated it as a guarantee
> > similar to those of superclasses and superinterfaces as in the first
> > line in section 5.4 "Linking"?  The new text would read something like:
> >    > Linking a class or interface involves verifying and preparing
> > that class or interface, its direct superclass, its direct
> > superinterfaces, and its element type (if it is an array type), if
> > necessary. Any classes listed in the preload attribute will be loaded
> > at this point.
> >
> > We don't need to say in the JVMS why the classes are in the attribute,
> > but we should be explicit about where the attempt to load them occurs
> > and that errors are ignored.  This provides stability to the users and
> > allows for independent implementation while avoiding de
> > facto standardization of today's behaviour.
> >
> > Before responding, I built the latest lworld branch of the Valhalla
> > repo and played with the preload attribute to try and force a
> > classloader-related deadlock.  I was surprised to find that the
> > attribute doesn't seem to have an effect on user-defined loaders and
> > with the current spec, I can't even say if that's a bug or not.
> > Example classfiles for this exploration are in
> > https://github.com/DanHeidinga/valhalla-preload-example
> >
> > --Dan
> >
> > On Mon, Jun 5, 2023 at 9:52 PM John Rose <john.r.rose at oracle.com> wrote:
> >
> >     Overall, as we look at Preload, it is looking more and more like a
> >     no-op, as far as the JLS and JVMS is concerned. Perhaps that is a
> >     signal that it should be placed somewhere outside of the JVMS,
> >     such as in a Leyden-specific mechanism (a preload list) produced
> >     in a way decoupled from any transactions between the JLS and JVMS.
> >
> >     On 1 Jun 2023, at 11:24, Dan Smith wrote:
> >
> >             On Jun 1, 2023, at 10:53 AM, Dan Heidinga
> >             <heidinga at redhat.com> wrote:
> >
> >             A couple of questions about the spec for the Preload
> >             attribute[0]. The current spec says it indicates "certain
> >             classes contain information that may be of interest during
> >             linkage."
> >
> >             The Preload attribute removes one need for Q modifiers
> >             while allowing calling convention optimizations and layout
> >             decisions to be made early.
> >
> >             The current spec is quite vague on what classes should be
> >             included in the attribute and on when / what the VM will
> >             do with those classes (or even if it does anything).
> >
> >         FWIW, the JEP has more detail about when javac is expected to
> >         include classes in Preload.
> >
> >             I think it's time to tighten up the spec for Preload
> >             attribute and specify:
> >             * what the VM will do with classes listed in the attribute
> >
> >         It is intentional that the VM may choose to do nothing. So
> >         anything it does is purely an optimization.
> >
> >     Looks like a nop…
> >
> >     (In particular, it should not /reject/ any inputs, because that
> >     would destabilize separate compilability in unpredictable ways.)
> >
> >             * when those classes will be loaded (ie: somewhere in JVMS
> >             5.3)
> >
> >         If the VM chooses to load Preload classes, then our thinking
> >         was that JVMS 5.4 already describes the details of timing:
> >
> >
> https://docs.oracle.com/javase/specs/jvms/se20/html/jvms-5.html#jvms-5.4
> >
> >         So, for example, "Alternatively, an implementation may choose
> >         an "eager" linkage strategy, where all symbolic references are
> >         resolved at once when the class or interface is being
> >         verified." That is, the Preload classes could all be loaded
> >         during verification, or at some other stage of linking.
> >
> >         My expectation is that the natural point for processing
> >         Preload is during preparation as vtables are set up, but
> >         sometimes I get these things wrong. :-)
> >
> >     Sometimes you want them early (for instance layout) and sometimes
> >     you need to wait (vtable layout or even just before <clinit>).
> >
> >             * how invalid cases are handled, including circularities
> >             (Class A's Preload mentions B <: A)
> >
> >     Silent supression of errors, if any. Again, like a nop…
> >
> >         "Errors detected during linkage are thrown at a point in the
> >         program where some action is taken by the program that might,
> >         directly or indirectly, require linkage to the class or
> >         interface involved in the error."
> >
> >         I've always found this rule super vague, but I think "require"
> >         is the key word, and implies that errors caused by Preload
> >         resolution should just be ignored. (Because Preload isn't
> >         "required" to be processed at all.)
> >
> >             * what types of classes can be listed (any? only values?)
> >
> >         Definitely intend to support any classes of interest. Say a
> >         future optimization wants to know about a sealed
> >         superinterface, for example—it would be fine to tweak javac to
> >         add that interface to Preload, and then use the information to
> >         facilitate the optimization.
> >
> >         There's a lot of nondeterminism here—can a compliant system
> >         trigger changes to class loading timing, but just on my
> >         birthday?—but I think it's within the scope of JVMS 5.4, which
> >         provides a lot of latitude for loading classes whenever it's
> >         convenient.
> >
> >             It probably makes sense to start from the current Hotspot
> >             handling of the attribute and fine tune that into the spec?
> >
> >         So I've outlined our hands-off stake in the ground above. The
> >         spec would definitely benefit, at least, from a non-normative
> >         cross-reference to 5.4 and short explanation. Beyond that, I
> >         think we'd be open to specifying more if we can agree
> >         something more is needed...
> >
> >     I think we could get the benefits in Fred’s prototype (as he
> >     describes) with a list that is decoupled from any particular class
> >     file, and Leyden could deliver this list.
> >
> >     As you see, I’m kind of sour on a Preload attribute these days.
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/valhalla-spec-observers/attachments/20230609/0a04e1a0/attachment-0001.htm>


More information about the valhalla-spec-observers mailing list