Using hard links for debug builds
Erik Joelsson
erik.joelsson at oracle.com
Tue Jan 10 08:56:45 UTC 2017
Hello,
I recently did work to reduce the number of copies. While doing that I
did investigate using softlinks, but that didn't work for .so files. I
did not consider hard links. All other files in the exploded image are
however softlinked when possible. For all the copies in images, any kind
of linking won't work because those are generated with jlink, not cp.
This means you would only be able to eliminate 2 copies by linking out
of the below 8.
I did put in more detailed top level targets to make it possible for an
active user to get fewer copies. For example, instead of building
"images", you can build just "jdk-image" and you will skip 2 of the
copies (jre and serverjre). If you don't need a real jdk image, you can
build just "exploded-image" and you skip 2 more (jdk and
support/interim-image). I have tried to optimize the "test*" targets to
only depend on the appropriate images as well.
If you don't care for the gtest binaries, you can configure
--disable-hotspot-gtest to get rid of those.
Doing all of this and you are down to 2 copies, which your trick takes
down to one.
The gtest version of libjvm.so contains all the objects of the normal
libjvm.so + the gtest unit tests. This is used to run the gtest unit tests.
In general, --with-native-debug-symbols=external is easier on disk usage
since the debug symbols aren't copied everywhere like the libraries are.
Also note that even if you do =zipped (the default), there will be a
link to an unzipped copy available in the exploded image.
/Erik
On 2017-01-09 21:40, Ioi Lam wrote:
> Hi,
>
> libjvm.so gets copied a few times during the build. I usually build
> slowdebug builds with --with-native-debug-symbols=internal (to make it
> easier with gdb). This gives me 8 libjvm.so files:
>
> ./support/interim-image/lib/server/libjvm.so
> ./support/modules_libs/java.base/server/libjvm.so
> ./hotspot/variant-server/libjvm/gtest/libjvm.so
> ./images/test/hotspot/gtest/server/libjvm.so
> ./images/serverjre/lib/server/libjvm.so
> ./images/jdk/lib/server/libjvm.so
> ./images/jre/lib/server/libjvm.so
> ./jdk/lib/server/libjvm.so
>
> Each of them is 320+MB. Even though I have a fast SSD, it's
> overwhelmed by the large churn and my machine becomes unresponsive for
> a long time.
>
> The 8 libjvm.so files have 2 variants -- the gtest version (2 of them)
> vs the normal version (6 of them). Would it make sense to change the
> 'cp' to hard links instead?
>
> For now, I am doing a hack by patching this in the generated spec.gmk
> file:
>
> CP:=/bin/cp
>
> to point to my script, which uses 'ln' instead of /bin/cp when dealing
> with libjvm.so ....
>
> BTW, what's the use for the 'gtest' versions of libjvm.so?
>
> Thanks
> - Ioi
More information about the build-dev
mailing list