comparison src/share/vm/memory/metaspace.cpp @ 8804:91bf0bdae37b

8008217: CDS: Class data sharing limits the malloc heap on Solaris 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 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
author coleenp
date Wed, 20 Mar 2013 08:04:54 -0400
parents 82ab039b9680
children 6574f999e0cf
comparison
equal deleted inserted replaced
8803:a649f6511c04 8804:91bf0bdae37b
335 // byte_size is the size of the associated virtualspace. 335 // byte_size is the size of the associated virtualspace.
336 VirtualSpaceNode::VirtualSpaceNode(size_t byte_size) : _top(NULL), _next(NULL), _rs(0) { 336 VirtualSpaceNode::VirtualSpaceNode(size_t byte_size) : _top(NULL), _next(NULL), _rs(0) {
337 // align up to vm allocation granularity 337 // align up to vm allocation granularity
338 byte_size = align_size_up(byte_size, os::vm_allocation_granularity()); 338 byte_size = align_size_up(byte_size, os::vm_allocation_granularity());
339 339
340 // This allocates memory with mmap. For DumpSharedspaces, allocate the 340 // This allocates memory with mmap. For DumpSharedspaces, try to reserve
341 // space at low memory so that other shared images don't conflict. 341 // configurable address, generally at the top of the Java heap so other
342 // This is the same address as memory needed for UseCompressedOops but 342 // memory addresses don't conflict.
343 // compressed oops don't work with CDS (offsets in metadata are wrong), so
344 // borrow the same address.
345 if (DumpSharedSpaces) { 343 if (DumpSharedSpaces) {
346 char* shared_base = (char*)HeapBaseMinAddress; 344 char* shared_base = (char*)SharedBaseAddress;
347 _rs = ReservedSpace(byte_size, 0, false, shared_base, 0); 345 _rs = ReservedSpace(byte_size, 0, false, shared_base, 0);
348 if (_rs.is_reserved()) { 346 if (_rs.is_reserved()) {
349 assert(_rs.base() == shared_base, "should match"); 347 assert(shared_base == 0 || _rs.base() == shared_base, "should match");
350 } else { 348 } else {
351 // If we are dumping the heap, then allocate a wasted block of address 349 // Get a mmap region anywhere if the SharedBaseAddress fails.
352 // space in order to push the heap to a lower address. This extra
353 // address range allows for other (or larger) libraries to be loaded
354 // without them occupying the space required for the shared spaces.
355 uintx reserved = 0;
356 uintx block_size = 64*1024*1024;
357 while (reserved < SharedDummyBlockSize) {
358 char* dummy = os::reserve_memory(block_size);
359 reserved += block_size;
360 }
361 _rs = ReservedSpace(byte_size); 350 _rs = ReservedSpace(byte_size);
362 } 351 }
363 MetaspaceShared::set_shared_rs(&_rs); 352 MetaspaceShared::set_shared_rs(&_rs);
364 } else { 353 } else {
365 _rs = ReservedSpace(byte_size); 354 _rs = ReservedSpace(byte_size);