serviceability agent : problems when using gcc LTO (link time optimization)
Volker Simonis
volker.simonis at gmail.com
Sat Jan 11 13:38:12 UTC 2020
SA pretends to know the exact types of objects in the JVM and for
polymorphic objects it wants to read their vtable from the shared library.
If LTO de-virtulizes methods and thus changes polymorphic to
non-polymorphic types, this won't work. But if LTO can de-virtulizes a
type, maybe you can do that manually (and update the corresponding
representation in the SA), because it doesn't seem to be needed.
Notice that other places in the VM may also rely on this. E.g. CDS stores
Metadata objects in the CDS archive and restores their vtable pointers when
they are loaded. On the other hand, if the CDS tests have passed, this
doesn't seem to be a problem.
Baesken, Matthias <matthias.baesken at sap.com> schrieb am Fr., 10. Jan. 2020,
11:03:
> Hello, I recently looked into the gcc lto optimization mode (see for
> some details https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html
> and
> http://hubicka.blogspot.com/2019/05/gcc-9-link-time-and-inter-procedural.html
> ).
> This mode can lead to more compact binaries (~10% smaller) , it also
> might bring small performance improvements but that wasn't my (main)
> goal .
>
> The changes for this are rather small , one needs to use a recent gcc ,
> add -flto to the compile flags , for example
>
> --- a/make/autoconf/flags-cflags.m4 Wed Jan 01 03:08:45 2020 +0100
> +++ b/make/autoconf/flags-cflags.m4 Wed Jan 08 17:39:10 2020 +0100
> @@ -530,8 +530,13 @@
> fi
> if test "x$TOOLCHAIN_TYPE" = xgcc; then
> - TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -fcheck-new
> -fstack-protector"
> - TOOLCHAIN_CFLAGS_JDK="-pipe -fstack-protector"
> + TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -fcheck-new
> -fstack-protector -flto"
> + TOOLCHAIN_CFLAGS_JDK="-pipe -fstack-protector -flto"
>
> .... and you have to make sure to use gcc-ar and gcc-nm instead
> of ar / nm .
> Build and test(s) work, however with one exception.
> The serviceability tests like serviceability/sa seems to rely
> heavily on the "normal" structure of libjvm.so (from what I
> understand e.g. in LinuxVtblAccess it is attempted to access internal
> symbols like _ZTV ).
>
> Errors in the sa tests look like :
>
>
> java.lang.InternalError: Metadata does not appear to be polymorphic
> at
> jdk.hotspot.agent/sun.jvm.hotspot.types.basic.BasicTypeDataBase.findDynamicTypeForAddress(BasicTypeDataBase.java:279)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.runtime.VirtualBaseConstructor.instantiateWrapperFor(VirtualBaseConstructor.java:102)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.oops.Metadata.instantiateWrapperFor(Metadata.java:74)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.memory.SystemDictionary.getClassLoaderKlass(SystemDictionary.java:96)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.tools.ClassLoaderStats.printClassLoaderStatistics(ClassLoaderStats.java:93)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.tools.ClassLoaderStats.run(ClassLoaderStats.java:78)
> at jdk.hotspot.agent/sun.jvm.hotspot.tools.JMap.run(JMap.java:115)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:262)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.start(Tool.java:225)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.tools.JMap.main(JMap.java:176)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.SALauncher.runJMAP(SALauncher.java:321)
> at
> jdk.hotspot.agent/sun.jvm.hotspot.SALauncher.main(SALauncher.java:406)
>
> Has anyone experimented with LTO optimization ?
>
> And to the serviceability agent experts - any idea how to make the
> jdk.hotspot.agent more independent from optimization settings ?
>
>
> Best regards, Matthias
>
More information about the hotspot-dev
mailing list