RFR(S) 8243506 SharedBaseAddress is ignored by -Xshare:dump
Ioi Lam
ioi.lam at oracle.com
Wed May 6 08:14:00 UTC 2020
On 5/5/20 10:58 PM, Thomas Stüfe wrote:
> Hi Ioi,
>
> <snip>
>
>>
>
> Hi Thomas,
>
> Actually, the placement chosen by the OS under this circumstance
> may not be "proper".
>
> Let me first start explain why currently we always write the
> archive at 0x800000000.
>
> (The bug description should be more clear -- it's not a bug to
> always write to 0x800000000. That was intentional. The bug is now
> there's no way to specify an address other than 0x800000000 --
> unless you edit globals.hpp and rebuild the JDK).
>
> During JDK-8231610 (Relocate the CDS archive if it cannot be
> mapped to the requested), my biggest concern was this:
>
> When we build an official release build on Linux, perhaps once in
> a blue moon 0x800000000 is unavailable. But do we want to ship an
> official JDK with a default CDS archive whose base address
> happened to be picked randomly on the specific host that built the
> JDK? We have never tested against such an address. It's not a
> "proper" address as we don't know whether it will even work on the
> huge variety of hosts used by our users. So this is a black swan
> event -- it mostly likely won't happen, but it might. If it does
> happen, it has unknown negative impact (e.g., the default CDS
> archive may not work in half of the machines in the world). How do
> we handle it?
>
> We have tested with 0x800000000 millions of times, and it has
> worked for many JDK releases, so it seems safer to always release
> a JDK that uses this base address.
>
> We could detect the black swan event during the JDK build, and
> regenerate the archive until we get 0x800000000. But if the chance
> of this happening is very low, how do we test our Makefile logic,
> and what if the build keeps spinning and never gives us 0x800000000?
>
> So, the decision in JDK-8231610 was to always relocate the archive
> to 0x800000000 before writing it. (We test this functionality with
> "-Xshare:dump -XX:ArchiveRelocationMode=1" in our regression
> tests). This ensures that the black swan event never happens
> during the JDK build.
>
>
> Oh, I see. This is a valid concern.
>
> ===============
>
> I agree that your concerns below are valid. The question is -- do
> we need to provide a method to specify an address different than
> 0x800000000?
>
> If the answer is unclear, I think we can shelf this fix until
> someone actually complains :-)
>
>
> Sorry, that was not my intention. I still think the part of your patch
> which processes SharedBaseAddress at dump time is valuable. And then
> you could run the official builds always
> with SharedBaseAddress=0x800000000, right? I was only debating its use
> at runtime.
>
> I also had a more close look at the patch and I do not think it
> conflicts that much with the cds reservation rework, especially if we
> leave the runtime part out.
>
Sorry I wasn't clear: -XX:SharedBaseAddress takes effect only when
dumping the base archive with -Xshare:dump. In all other cases, the
value specified in the command-line is ignored. E.g.:
$ java -XX:SharedBaseAddress=0x900000000 -Xshare:dump
$ java -XX:SharedBaseAddress=0xa00000000 -Xshare:on -Xlog:cds=debug -version
<....>
[0.006s][info ][cds] Mapped static region #0 at base 0x0000000900000000
top 0x0000000900003000 (MiscCode)
[0.006s][info ][cds] Mapped static region #1 at base 0x0000000900003000
top 0x00000009003e5000 (ReadWrite)
[0.006s][info ][cds] Mapped static region #2 at base 0x00000009003e5000
top 0x0000000900b31000 (ReadOnly)
<....>
At run-time, the archive is mapped to 0x900000000, i.e., the value
specified at dump time.
Similarly, when dumping the dynamic archive, the -XX:SharedBaseAddress
in the command-line is ignored. The dynamic archive will always use the
same base address as the static archive.
$ java -XX:SharedBaseAddress=0x12345678 -XX:ArchiveClassesAtExit=foo.jsa
-Xlog:cds=debug com.sun.tools.javac.Main
<....>
[0.381s][debug ][cds] Shared file region (mc ) 0: 101736 bytes, addr
0x0000000900b31000 file offset 0x00001000 crc 0x35d9ce44
[0.383s][debug ][cds] Shared file region (rw ) 1: 1165992 bytes, addr
0x0000000900b4a000 file offset 0x0001a000 crc 0xb21138a0
[0.385s][debug ][cds] Shared file region (ro ) 2: 1806840 bytes, addr
0x0000000900c67000 file offset 0x00137000 crc 0xf9b26f24
[0.386s][debug ][cds] Shared file region (bm ) 3: 48072 bytes, addr
0x0000000000000000 file offset 0x002f1000 crc 0xb6f25c5e
> <snip>
>
>> N == 0
>>
>> At run time, the CDS archive will always be mapped to an
>> address
>> selected by the OS.
>>
>> This is useful for improved security -- on OSes that
>> support ASLR
>> (Address
>> Space Layout Randomization), the address of the archived
>> metaspace
>> objects
>> will be randomized on every run to make attacks more
>> difficult.
>>
>>
>> is this any different from -XX:ArchiveRelocationMode=1 ?
>> [edited]
>
> In practice there's not much difference, except that
> ArchiveRelocationMode is a diagnostic flag.
>
Actually, ArchiveRelocationMode is an option for the run time, so if
you want the random address mapping, you have to remember to use it
every time you launch a VM.
In contrast, if you build an archive with -XX:SharedBaseAddress=0 at
dump time, then at run-time, this archive will always map to an random
address without specifying any extra VM flags. So this makes things more
manageable.
Thanks
- Ioi
More information about the hotspot-runtime-dev
mailing list