< prev index next >

src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp

Print this page
rev 7854 : 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
Summary: Allow partial use of large pages for auxiliary data structures in G1.
Reviewed-by:
rev 7855 : imported patch 8058354-jon-fixes
rev 7856 : imported patch 8058354-fix-roundto-error


  55   }
  56   assert(_low_boundary == NULL, "VirtualSpace already initialized");
  57   assert(commit_size > 0, "Granularity must be non-zero.");
  58 
  59   guarantee(is_ptr_aligned(rs.base(), commit_size),
  60             err_msg("Reserved space base " PTR_FORMAT" is not aligned to requested page size " SIZE_FORMAT, p2i(rs.base()), commit_size));
  61   guarantee(is_size_aligned(actual_size, os::vm_page_size()),
  62             err_msg("Given actual reserved space size needs to be OS page size aligned (%d bytes) but is " SIZE_FORMAT, os::vm_page_size(), actual_size));
  63   guarantee(actual_size <= rs.size(),
  64             err_msg("Actual size of reserved space " SIZE_FORMAT" bytes is smaller than reservation at " SIZE_FORMAT" bytes", actual_size, rs.size()));
  65 
  66   _low_boundary  = rs.base();
  67   _high_boundary = _low_boundary + actual_size;
  68 
  69   _special = rs.special();
  70   _executable = rs.executable();
  71 
  72   _commit_size = commit_size;
  73 
  74   assert(_committed.size() == 0, "virtual space initialized more than once");
  75   BitMap::idx_t size_in_commit_pages = round_to(rs.size(), commit_size);
  76   _committed.resize(size_in_commit_pages, /* in_resource_area */ false);
  77   if (_special) {
  78     _dirty.resize(size_in_commit_pages, /* in_resource_area */ false);
  79   }
  80 
  81   return true;
  82 }
  83 
  84 G1PageBasedVirtualSpace::~G1PageBasedVirtualSpace() {
  85   release();
  86 }
  87 
  88 void G1PageBasedVirtualSpace::release() {
  89   // This does not release memory it never reserved.
  90   // Caller must release via rs.release();
  91   _low_boundary           = NULL;
  92   _high_boundary          = NULL;
  93   _special                = false;
  94   _executable             = false;
  95   _commit_size            = 0;




  55   }
  56   assert(_low_boundary == NULL, "VirtualSpace already initialized");
  57   assert(commit_size > 0, "Granularity must be non-zero.");
  58 
  59   guarantee(is_ptr_aligned(rs.base(), commit_size),
  60             err_msg("Reserved space base " PTR_FORMAT" is not aligned to requested page size " SIZE_FORMAT, p2i(rs.base()), commit_size));
  61   guarantee(is_size_aligned(actual_size, os::vm_page_size()),
  62             err_msg("Given actual reserved space size needs to be OS page size aligned (%d bytes) but is " SIZE_FORMAT, os::vm_page_size(), actual_size));
  63   guarantee(actual_size <= rs.size(),
  64             err_msg("Actual size of reserved space " SIZE_FORMAT" bytes is smaller than reservation at " SIZE_FORMAT" bytes", actual_size, rs.size()));
  65 
  66   _low_boundary  = rs.base();
  67   _high_boundary = _low_boundary + actual_size;
  68 
  69   _special = rs.special();
  70   _executable = rs.executable();
  71 
  72   _commit_size = commit_size;
  73 
  74   assert(_committed.size() == 0, "virtual space initialized more than once");
  75   BitMap::idx_t size_in_commit_pages = round_to(rs.size(), commit_size) / commit_size;
  76   _committed.resize(size_in_commit_pages, /* in_resource_area */ false);
  77   if (_special) {
  78     _dirty.resize(size_in_commit_pages, /* in_resource_area */ false);
  79   }
  80 
  81   return true;
  82 }
  83 
  84 G1PageBasedVirtualSpace::~G1PageBasedVirtualSpace() {
  85   release();
  86 }
  87 
  88 void G1PageBasedVirtualSpace::release() {
  89   // This does not release memory it never reserved.
  90   // Caller must release via rs.release();
  91   _low_boundary           = NULL;
  92   _high_boundary          = NULL;
  93   _special                = false;
  94   _executable             = false;
  95   _commit_size            = 0;


< prev index next >