Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.hpp @ 22977:33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
Summary: Allow use of large pages for auxiliary data structures in G1. Clean up existing interfaces.
Reviewed-by: jmasa, pliden, stefank
author | tschatzl |
---|---|
date | Tue, 07 Apr 2015 10:53:51 +0200 |
parents | ae52ee069062 |
children |
rev | line source |
---|---|
20337 | 1 /* |
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1PAGEBASEDVIRTUALSPACE_HPP | |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1PAGEBASEDVIRTUALSPACE_HPP | |
27 | |
28 #include "memory/allocation.hpp" | |
29 #include "memory/memRegion.hpp" | |
30 #include "runtime/virtualspace.hpp" | |
31 #include "utilities/bitMap.hpp" | |
32 | |
33 // Virtual space management helper for a virtual space with an OS page allocation | |
34 // granularity. | |
35 // (De-)Allocation requests are always OS page aligned by passing a page index | |
36 // and multiples of pages. | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
37 // For systems that only commits of memory in a given size (always greater than |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
38 // page size) the base address is required to be aligned to that page size. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
39 // The actual size requested need not be aligned to that page size, but the size |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
40 // of the reservation passed may be rounded up to this page size. Any fragment |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
41 // (less than the page size) of the actual size at the tail of the request will |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
42 // be committed using OS small pages. |
20337 | 43 // The implementation gives an error when trying to commit or uncommit pages that |
44 // have already been committed or uncommitted. | |
45 class G1PageBasedVirtualSpace VALUE_OBJ_CLASS_SPEC { | |
46 friend class VMStructs; | |
47 private: | |
48 // Reserved area addresses. | |
49 char* _low_boundary; | |
50 char* _high_boundary; | |
51 | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
52 // The size of the tail in bytes of the handled space that needs to be committed |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
53 // using small pages. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
54 size_t _tail_size; |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
55 |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
56 // The preferred page size used for commit/uncommit in bytes. |
20337 | 57 size_t _page_size; |
58 | |
59 // Bitmap used for verification of commit/uncommit operations. | |
60 BitMap _committed; | |
61 | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
62 // Bitmap used to keep track of which pages are dirty or not for _special |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
63 // spaces. This is needed because for those spaces the underlying memory |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
64 // will only be zero filled the first time it is committed. Calls to commit |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
65 // will use this bitmap and return whether or not the memory is zero filled. |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
66 BitMap _dirty; |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
67 |
20337 | 68 // Indicates that the entire space has been committed and pinned in memory, |
69 // os::commit_memory() or os::uncommit_memory() have no function. | |
70 bool _special; | |
71 | |
72 // Indicates whether the committed space should be executable. | |
73 bool _executable; | |
74 | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
75 // Helper function for committing memory. Commit the given memory range by using |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
76 // _page_size pages as much as possible and the remainder with small sized pages. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
77 void commit_internal(size_t start_page, size_t end_page); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
78 // Commit num_pages pages of _page_size size starting from start. All argument |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
79 // checking has been performed. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
80 void commit_preferred_pages(size_t start_page, size_t end_page); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
81 // Commit space at the high end of the space that needs to be committed with small |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
82 // sized pages. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
83 void commit_tail(); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
84 |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
85 // Uncommit the given memory range. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
86 void uncommit_internal(size_t start_page, size_t end_page); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
87 |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
88 // Pretouch the given memory range. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
89 void pretouch_internal(size_t start_page, size_t end_page); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
90 |
20337 | 91 // Returns the index of the page which contains the given address. |
92 uintptr_t addr_to_page_index(char* addr) const; | |
93 // Returns the address of the given page index. | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
94 char* page_start(size_t index) const; |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
95 |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
96 // Is the given page index the last page? |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
97 bool is_last_page(size_t index) const { return index == (_committed.size() - 1); } |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
98 // Is the given page index the first after last page? |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
99 bool is_after_last_page(size_t index) const; |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
100 // Is the last page only partially covered by this space? |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
101 bool is_last_page_partial() const { return !is_ptr_aligned(_high_boundary, _page_size); } |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
102 // Returns the end address of the given page bounded by the reserved space. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
103 char* bounded_end_addr(size_t end_page) const; |
20337 | 104 |
105 // Returns true if the entire area is backed by committed memory. | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
106 bool is_area_committed(size_t start_page, size_t size_in_pages) const; |
20337 | 107 // Returns true if the entire area is not backed by committed memory. |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
108 bool is_area_uncommitted(size_t start_page, size_t size_in_pages) const; |
20337 | 109 |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
110 void initialize_with_page_size(ReservedSpace rs, size_t used_size, size_t page_size); |
20337 | 111 public: |
112 | |
113 // Commit the given area of pages starting at start being size_in_pages large. | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20337
diff
changeset
|
114 // Returns true if the given area is zero filled upon completion. |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
115 bool commit(size_t start_page, size_t size_in_pages); |
20337 | 116 |
117 // Uncommit the given area of pages starting at start being size_in_pages large. | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
118 void uncommit(size_t start_page, size_t size_in_pages); |
20337 | 119 |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
120 // Initialize the given reserved space with the given base address and the size |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
121 // actually used. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
122 // Prefer to commit in page_size chunks. |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
20795
diff
changeset
|
123 G1PageBasedVirtualSpace(ReservedSpace rs, size_t used_size, size_t page_size); |
20337 | 124 |
125 // Destruction | |
126 ~G1PageBasedVirtualSpace(); | |
127 | |
128 // Amount of reserved memory. | |
129 size_t reserved_size() const; | |
130 // Memory used in this virtual space. | |
131 size_t committed_size() const; | |
132 // Memory left to use/expand in this virtual space. | |
133 size_t uncommitted_size() const; | |
134 | |
135 bool contains(const void* p) const; | |
136 | |
137 MemRegion reserved() { | |
138 MemRegion x((HeapWord*)_low_boundary, reserved_size() / HeapWordSize); | |
139 return x; | |
140 } | |
141 | |
142 void release(); | |
143 | |
144 void check_for_contiguity() PRODUCT_RETURN; | |
145 | |
146 // Debugging | |
147 void print_on(outputStream* out) PRODUCT_RETURN; | |
148 void print(); | |
149 }; | |
150 | |
151 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1PAGEBASEDVIRTUALSPACE_HPP |