RFR (S) 8008217: CDS: Class data sharing limits the malloc heap on Solaris
Coleen Phillimore
coleen.phillimore at oracle.com
Mon Mar 18 16:23:14 PDT 2013
On 3/18/2013 7:00 PM, Vladimir Kozlov wrote:
> On 3/18/13 3:30 PM, Coleen Phillimore wrote:
>> On 3/18/2013 1:32 PM, Vladimir Kozlov wrote:
>>> Coleen,
>>>
>>> First, your description is not accurate. Should be something like this:
>>>
>>> "In 64bit VM move CDS archive address to 32G on all platforms using
>>> new flag SharedBaseAddress.
>>> In 32bit VM set CDS archive address to 2Gb on Linux and let other OSs
>>> pick the address."
>>
>> Yes, that sounds better than what I wrote.
>>
>>>
>>> I think you need to always set SharedBaseAddress to 32G with the flag
>>> description that it is default for 64-bit VM. Special flag setting for
>>> Linux in 32bit VM could be done in VirtualSpaceNode() or in
>>> arguments.cpp (where CDS values are set) under #ifdef if the value is
>>> default.
>>
>> I don't understand this comment. Does it mean make it 32G and 2G in
>> globals.hpp rather than in the globals_os_cpu.hpp files? I don't have
>> good experiences with special case code in arguments.cpp and the
>> complexity we keep adding to it, and want to avoid that.
>
> If you had different values on different Linux flavors then setting in
> globals_os_cpu.hpp is good. But you have the same value. If you need
> to change 2G value later you will need to change again all these files.
This is true. You convinced me. I'd rather code in the declaration
than these #ifdefs in arguments.cpp. There are too many #ifdefs in
arguments.cpp:
product(uintx, SharedBaseAddress, NOT_LP64(SOLARIS_ONLY(0)
NOT_SOLARIS(3*G))\
LP64_ONLY(32*G), \
"Address to allocate shared memory if OS default doesn't
work") \
\
On my Linux 32 bit machine 3G doesn't work (java -version doesn't get
back the address). If I let Linux 32 bit default, it picks an address
close to 3G, and Java -version does work.
Maybe it's better that Linux and Windows pick an address, which is the
way they used to work (or not) before I happened to test them with
NPG. I'd have to retest Windows with this because I don't remember
what the results there were. What do you think?
thanks,
Coleen
>
> There is Arguments::set_shared_spaces_flags() method where you can do
> it (at the end of the method):
>
> #ifndef _LP64
> if (UseSharedSpaces && FLAG_IS_DEFAULT(SharedBaseAddress)) {
> #ifdef LINUX
> // set CDS archive address to 2Gb on Linux in 32bit VM
> FLAG_SET_DEFAULT(SharedBaseAddress, 2*G);
> #else
> // let other OSs pick the address
> FLAG_SET_DEFAULT(SharedBaseAddress, 0);
> #endif
> }
> #endif
>
>>
>>>
>>> Also setting in 32bit VM the CDS address on Linux to 2G may limit
>>> ability to specify large java heap size since 2G is in the middle of
>>> virtual space. Can it be somewhere at the top of virtual space (4G -
>>> cds_size)? Or at the bottom? Did you look on heap mapping in that
>>> case? Note, HeapBaseMinAddress was never used in 32bit VM before NPG.
>>>
>>
>> I was wondering what a better address than 2G would be for Linux. Which
>> is why I put the settings in the different os_cpu files. If I let Linux
>> default, it picks a high address for -Xshare:dump but then cannot get
>> this higher address when ute tests are run. 2G is sort of in the
>> middle which always seems to work, and with 32 bit, the Java heap
>> shouldn't be that large anyway because otherwise people would be using
>> 64 bits. Maybe 3G might be better, or 3.5G.
>> I didn't dare try to use lower addresses because some other application
>> specific data would be more likely to want these addresses. So, that's
>> another reason I made it an option and split their settings out.
>
> I think you should go as high as possible to leave more space for java
> heap. It would be nice to determine the address dynamically if
> possible. I think the problem with UTE is testing is done in Virtual
> Machines and not on hardware.
>
> I am concern about escalations from customers later that they can't
> specify big heap any more with 32bit VM. I would suggest to ask our
> embedded group to look on this.
>
> Thanks,
> Vladimir
>
>>
>> Thanks,
>> Coleen
>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 3/18/13 7:51 AM, Coleen Phillimore wrote:
>>>>
>>>> Adding in some more potential reviewers... please review!
>>>> Thanks,
>>>> Coleen
>>>>
>>>> On 03/15/2013 02:25 PM, Coleen Phillimore wrote:
>>>>> Summary: Don't use HeapBaseMinAddress on solaris, let the OS pick the
>>>>> CDS archive address on solaris. Move all CDS archive addresses up to
>>>>> 32G on 64 bit.
>>>>>
>>>>> On Linux, this still uses 2*G address because running ute, we can't
>>>>> seem get the same address that -Xshare:dump choses. Solaris chooses a
>>>>> higher address which seems to work fine.
>>>>>
>>>>> open webrev at http://cr.openjdk.java.net/~coleenp/8008217/
>>>>> bug link at http://bugs.sun.com/view_bug.do?bug_id=8008217
>>>>>
>>>>> Tested manually with gc/gctests/ManyObjects on all platforms. To add
>>>>> a jtreg test, we'd have to introduce a new flag to change the
>>>>> location
>>>>> of the shared archive because we don't have write access to JAVA_HOME
>>>>> while testing. Do people think this is worth doing?
>>>>>
>>>>> Thanks,
>>>>> Coleen
>>>>
>>
More information about the hotspot-runtime-dev
mailing list