Mercurial > hg > truffle
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); |