RFR (S) 8008217: CDS: Class data sharing limits the malloc heap on Solaris

Coleen Phillimore coleen.phillimore at oracle.com
Wed Mar 20 05:21:27 PDT 2013


Thanks, Dan.  I did test on both linux 32 and 64.  :)
Coleen

On 3/19/2013 11:43 PM, Daniel D. Daugherty wrote:
> On 3/19/13 7:38 PM, Coleen Phillimore wrote:
>> Summary: 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.
>>
>> open webrev at http://cr.openjdk.java.net/~coleenp/8008217_2/
>
> src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp
> src/os_cpu/bsd_zero/vm/globals_bsd_zero.hpp
> src/os_cpu/linux_sparc/vm/globals_linux_sparc.hpp
> src/os_cpu/linux_x86/vm/globals_linux_x86.hpp
> src/os_cpu/linux_zero/vm/globals_linux_zero.hpp
> src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp
> src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp
> src/os_cpu/windows_x86/vm/globals_windows_x86.hpp
> src/share/vm/memory/filemap.cpp
>     No comments on the above.
>
> src/share/vm/memory/metaspace.cpp
>     No comments.
>
> src/share/vm/runtime/globals.hpp
>     Like the new option name better.
>
>
>> bug link at http://bugs.sun.com/view_bug.do?bug_id=8008217_2
>>
>> Tjhis is a rereview based on Vladimir's comments.  On linux 32 the 
>> SharedBaseAddress is set to 2G.  The default address for dumping 
>> isn't available for restoring (for no good reason I can tell, linux 
>> just mmaps a different address).   2G seems to work for a default 
>> though.   If the heap is large (not default) and overlaps 2G, the CDS 
>> is turned off.   CDS is mapped after the Java heap is initialized.
>>
>> On Windows and Solaris 32 bit the default mmap address for 
>> -Xshare:dump is used.   This is usually successful to mmap for 
>> -Xshare:on with default heap size.
>>
>> On 64 bit 32G is used as a base address, which is generally above the 
>> Java heap.   This was tested on all platforms (again) but mostly on 
>> linux 32 bit.
> Presuming that the 64-bit 32G value was actually tested mostly on
> Linux-64 and not Linux-32. :-)
>
> Dan
>
>
>>
>> Thanks,
>> Coleen
>>
>>
>> On 3/18/2013 7:23 PM, Coleen Phillimore wrote:
>>> 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