NoClassDef error when trying to preload additional class in systemDirectory::initialize_preloaded_classes()

Xiaoran Wang xiaoran at x1a0ran.com
Wed Jun 12 09:55:38 PDT 2013


I tried to build hotspot 7u6 with bootjdk 7u6, but it still gave me the
same error.
The ONLY change that I made was to src/share/classfile/vmSymbols.hpp:112 I
added a new line "template(foo_bar, "foo/bar") \" and that's it. Without
that change hotspot was built fine and no error from test_gamma.

Any thought?


On Tue, Jun 11, 2013 at 9:16 PM, Christian Thalinger <
christian.thalinger at oracle.com> wrote:

>
> On Jun 11, 2013, at 7:45 PM, Xiaoran Wang <xiaoran at x1a0ran.com> wrote:
>
> Thanks Christian. So I guess the best way would be to download jdk8 and
> build it without changes, and then instrument the hotspot JVM and build it
> with the jdk8 that's just built?
>
>
> An easier way would be to use the same JDK you are building for as boot
> JDK.
>
> -- Chris
>
>
>
> On Tue, Jun 11, 2013 at 7:19 PM, Christian Thalinger <
> christian.thalinger at oracle.com> wrote:
>
>>
>> On Jun 11, 2013, at 2:06 PM, Xiaoran Wang <xiaoran at x1a0ran.com> wrote:
>>
>> > I'm building openjdk 7u6 with ALT_BOOTDIR set to jdk7u21 downloaded from
>> > java.com, but it still gave me weird build errors. So I removed all my
>> > changes, and only added one symbol to vmSymbol.hpp, and then it gave me
>> an
>> > error again.
>> >
>> > added line:vmSymbol.hpp
>> > template(foo_bar,                        "foo/bar")
>>   \
>> >
>> > cd linux_amd64_compiler2/product && ./test_gamma
>> > Using java runtime at: /usr/lib/jvm/jdk1.7.0_21/jre
>>
>> That's a long standing problem which we fixed in the 8 repositories:
>>  test_gamma runs with the boot JDK.
>>
>> In your case you are trying to run a HotSpot version from 7u6 with a 7u21
>> JDK.  Mix-and-match is not supported and may lead to problems like this.
>>
>> -- Chris
>>
>> > Error occurred during initialization of VM
>> > java.lang.InternalError
>> >    at sun.misc.Launcher.getFileURL(Launcher.java:463)
>> >    at sun.misc.Launcher$ExtClassLoader.getExtURLs(Launcher.java:192)
>> >    at sun.misc.Launcher$ExtClassLoader.<init>(Launcher.java:164)
>> >    at sun.misc.Launcher$ExtClassLoader$1.run(Launcher.java:148)
>> >    at sun.misc.Launcher$ExtClassLoader$1.run(Launcher.java:142)
>> >    at java.security.AccessController.doPrivileged(Native Method)
>> >    at
>> sun.misc.Launcher$ExtClassLoader.getExtClassLoader(Launcher.java:141)
>> >    at sun.misc.Launcher.<init>(Launcher.java:71)
>> >    at sun.misc.Launcher.<clinit>(Launcher.java:57)
>> >    at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1486)
>> >    at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1468)
>> >
>> > So where seems to be the problem?
>> >
>> >
>> >
>> >
>> > On Mon, Jun 10, 2013 at 11:09 PM, David Holmes <david.holmes at oracle.com
>> >wrote:
>> >
>> >> What version of hotspot are you building? If it is current sources then
>> >> you will need a JDK7 import JDK or even JDK8. You can't take current
>> >> hotspot and place into a 6u JDK for example.
>> >>
>> >> David
>> >>
>> >>
>> >> On 9/06/2013 6:06 AM, Xiaoran Wang wrote:
>> >>
>> >>> To followup, I tried to put foo/bar.class into
>> $JAVA_HOME/jre/classes, now
>> >>> the linux_amd64_compiler2/product/**test_gamma passed without error,
>> but
>> >>> another error occured from linux_amd64_compiler2/jvmg/**test_gamma,
>> >>> which is
>> >>> even more confusing.
>> >>>
>> >>> cd linux_amd64_compiler2/jvmg && ./test_gamma
>> >>> java full version "1.6.0_22-b04"
>> >>> Using java runtime at: /home/Documents/tools/hotspot-**
>> >>> working-dir/java/jre
>> >>> Error occurred during initialization of VM
>> >>> java.lang.**NoSuchMethodException: java.lang.reflect.Method.**invoke
>> >>>
>> >>>
>> >>> Can someone shed some light please?
>> >>>
>> >>>
>> >>> On Sat, Jun 8, 2013 at 12:32 PM, Xiaoran Wang <xiaoran at x1a0ran.com>
>> >>> wrote:
>> >>>
>> >>> Hi all,
>> >>>>
>> >>>> I'm instrumenting the hotspot JVM for research purposes and one of
>> the
>> >>>> steps is to preload some classes during JVM startup time so that I
>> can
>> >>>> use
>> >>>> its KlassOop/KlassHandle later in the template Interpreter.
>> >>>>
>> >>>> I appended the new classes I wanted to load in systemDirectory.hpp,
>> e.g.
>> >>>>  *template(bar_klass,                foo_bar,             Pre) \*
>> >>>>
>> >>>> And its corresponding symbol in vmSymbols.hpp
>> >>>> *template(foo_bar, "foo/bar")\*
>> >>>>
>> >>>>
>> >>>> Then I put foo/bar.class into the corresponding rt.jar that will be
>> used
>> >>>> to build libjvm.so.
>> >>>>
>> >>>> However, when I built it, the "gamma" test always gives me an
>> >>>> NoClassDefFoundError.
>> >>>>
>> >>>> cd linux_amd64_compiler2/product && ./test_gamma
>> >>>> java full version "1.6.0_22-b04"
>> >>>> Using java runtime at: /home/Documents/tools/hotspot-**
>> >>>> working-dir/java/jre
>> >>>> Error occurred during initialization of VM
>> >>>> java/lang/**NoClassDefFoundError: foo/bar
>> >>>>
>> >>>>
>> >>>> So my question is where should I put my custom class so that it can
>> be
>> >>>> preloaded during JVM startup in
>> >>>> systemDirectory::initialize_**preloaded_classes?
>> >>>>
>> >>>> btw, I verified the rt.jar is the one JVM is loading because I tried
>> to
>> >>>> remove java/lang/Object from it and it complained about missing that
>> >>>> class
>> >>>> as well.
>> >>>>
>> >>>> Thank you
>> >>>> Xiaoran
>> >>>>
>> >>>>
>>
>>
>
>


More information about the hotspot-dev mailing list