1 | /* |
2 | * Copyright (c) 2011, 2019, 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 | #ifndef SHARE_MEMORY_METASPACE_HPP |
25 | #define SHARE_MEMORY_METASPACE_HPP |
26 | |
27 | #include "memory/allocation.hpp" |
28 | #include "memory/memRegion.hpp" |
29 | #include "memory/metaspaceChunkFreeListSummary.hpp" |
30 | #include "memory/virtualspace.hpp" |
31 | #include "utilities/exceptions.hpp" |
32 | |
33 | // Metaspace |
34 | // |
35 | // Metaspaces are Arenas for the VM's metadata. |
36 | // They are allocated one per class loader object, and one for the null |
37 | // bootstrap class loader |
38 | // |
39 | // block X ---+ +-------------------+ |
40 | // | | Virtualspace | |
41 | // | | | |
42 | // | | | |
43 | // | |-------------------| |
44 | // | || Chunk | |
45 | // | || | |
46 | // | ||---------- | |
47 | // +------>||| block 0 | | |
48 | // ||---------- | |
49 | // ||| block 1 | | |
50 | // ||---------- | |
51 | // || | |
52 | // |-------------------| |
53 | // | | |
54 | // | | |
55 | // +-------------------+ |
56 | // |
57 | |
58 | class ClassLoaderData; |
59 | class MetaspaceTracer; |
60 | class Mutex; |
61 | class outputStream; |
62 | |
63 | class CollectedHeap; |
64 | |
65 | namespace metaspace { |
66 | class ChunkManager; |
67 | class ClassLoaderMetaspaceStatistics; |
68 | class Metablock; |
69 | class Metachunk; |
70 | class PrintCLDMetaspaceInfoClosure; |
71 | class SpaceManager; |
72 | class VirtualSpaceList; |
73 | class VirtualSpaceNode; |
74 | } |
75 | |
76 | // Metaspaces each have a SpaceManager and allocations |
77 | // are done by the SpaceManager. Allocations are done |
78 | // out of the current Metachunk. When the current Metachunk |
79 | // is exhausted, the SpaceManager gets a new one from |
80 | // the current VirtualSpace. When the VirtualSpace is exhausted |
81 | // the SpaceManager gets a new one. The SpaceManager |
82 | // also manages freelists of available Chunks. |
83 | // |
84 | // Currently the space manager maintains the list of |
85 | // virtual spaces and the list of chunks in use. Its |
86 | // allocate() method returns a block for use as a |
87 | // quantum of metadata. |
88 | |
89 | // Namespace for important central static functions |
90 | // (auxiliary stuff goes into MetaspaceUtils) |
91 | class Metaspace : public AllStatic { |
92 | |
93 | friend class MetaspaceShared; |
94 | |
95 | public: |
96 | enum MetadataType { |
97 | ClassType, |
98 | NonClassType, |
99 | MetadataTypeCount |
100 | }; |
101 | enum MetaspaceType { |
102 | ZeroMetaspaceType = 0, |
103 | StandardMetaspaceType = ZeroMetaspaceType, |
104 | BootMetaspaceType = StandardMetaspaceType + 1, |
105 | UnsafeAnonymousMetaspaceType = BootMetaspaceType + 1, |
106 | ReflectionMetaspaceType = UnsafeAnonymousMetaspaceType + 1, |
107 | MetaspaceTypeCount |
108 | }; |
109 | |
110 | private: |
111 | |
112 | // Align up the word size to the allocation word size |
113 | static size_t align_word_size_up(size_t); |
114 | |
115 | // Aligned size of the metaspace. |
116 | static size_t _compressed_class_space_size; |
117 | |
118 | static size_t compressed_class_space_size() { |
119 | return _compressed_class_space_size; |
120 | } |
121 | |
122 | static void set_compressed_class_space_size(size_t size) { |
123 | _compressed_class_space_size = size; |
124 | } |
125 | |
126 | static size_t _first_chunk_word_size; |
127 | static size_t _first_class_chunk_word_size; |
128 | |
129 | static size_t _commit_alignment; |
130 | static size_t _reserve_alignment; |
131 | DEBUG_ONLY(static bool _frozen;) |
132 | |
133 | // Virtual Space lists for both classes and other metadata |
134 | static metaspace::VirtualSpaceList* _space_list; |
135 | static metaspace::VirtualSpaceList* _class_space_list; |
136 | |
137 | static metaspace::ChunkManager* _chunk_manager_metadata; |
138 | static metaspace::ChunkManager* _chunk_manager_class; |
139 | |
140 | static const MetaspaceTracer* _tracer; |
141 | |
142 | public: |
143 | static metaspace::VirtualSpaceList* space_list() { return _space_list; } |
144 | static metaspace::VirtualSpaceList* class_space_list() { return _class_space_list; } |
145 | static metaspace::VirtualSpaceList* get_space_list(MetadataType mdtype) { |
146 | assert(mdtype != MetadataTypeCount, "MetadaTypeCount can't be used as mdtype" ); |
147 | return mdtype == ClassType ? class_space_list() : space_list(); |
148 | } |
149 | |
150 | static metaspace::ChunkManager* chunk_manager_metadata() { return _chunk_manager_metadata; } |
151 | static metaspace::ChunkManager* chunk_manager_class() { return _chunk_manager_class; } |
152 | static metaspace::ChunkManager* get_chunk_manager(MetadataType mdtype) { |
153 | assert(mdtype != MetadataTypeCount, "MetadaTypeCount can't be used as mdtype" ); |
154 | return mdtype == ClassType ? chunk_manager_class() : chunk_manager_metadata(); |
155 | } |
156 | |
157 | // convenience function |
158 | static metaspace::ChunkManager* get_chunk_manager(bool is_class) { |
159 | return is_class ? chunk_manager_class() : chunk_manager_metadata(); |
160 | } |
161 | |
162 | static const MetaspaceTracer* tracer() { return _tracer; } |
163 | static void freeze() { |
164 | assert(DumpSharedSpaces, "sanity" ); |
165 | DEBUG_ONLY(_frozen = true;) |
166 | } |
167 | static void assert_not_frozen() { |
168 | assert(!_frozen, "sanity" ); |
169 | } |
170 | #ifdef _LP64 |
171 | static void allocate_metaspace_compressed_klass_ptrs(char* requested_addr, address cds_base); |
172 | #endif |
173 | |
174 | private: |
175 | |
176 | #ifdef _LP64 |
177 | static void set_narrow_klass_base_and_shift(address metaspace_base, address cds_base); |
178 | |
179 | // Returns true if can use CDS with metaspace allocated as specified address. |
180 | static bool can_use_cds_with_metaspace_addr(char* metaspace_base, address cds_base); |
181 | |
182 | static void initialize_class_space(ReservedSpace rs); |
183 | #endif |
184 | |
185 | public: |
186 | |
187 | static void ergo_initialize(); |
188 | static void global_initialize(); |
189 | static void post_initialize(); |
190 | |
191 | static void verify_global_initialization(); |
192 | |
193 | static size_t first_chunk_word_size() { return _first_chunk_word_size; } |
194 | static size_t first_class_chunk_word_size() { return _first_class_chunk_word_size; } |
195 | |
196 | static size_t reserve_alignment() { return _reserve_alignment; } |
197 | static size_t reserve_alignment_words() { return _reserve_alignment / BytesPerWord; } |
198 | static size_t commit_alignment() { return _commit_alignment; } |
199 | static size_t commit_alignment_words() { return _commit_alignment / BytesPerWord; } |
200 | |
201 | static MetaWord* allocate(ClassLoaderData* loader_data, size_t word_size, |
202 | MetaspaceObj::Type type, TRAPS); |
203 | |
204 | static bool contains(const void* ptr); |
205 | static bool contains_non_shared(const void* ptr); |
206 | |
207 | // Free empty virtualspaces |
208 | static void purge(MetadataType mdtype); |
209 | static void purge(); |
210 | |
211 | static void report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, |
212 | MetaspaceObj::Type type, MetadataType mdtype, TRAPS); |
213 | |
214 | static const char* metadata_type_name(Metaspace::MetadataType mdtype); |
215 | |
216 | static void print_compressed_class_space(outputStream* st, const char* requested_addr = 0) NOT_LP64({}); |
217 | |
218 | // Return TRUE only if UseCompressedClassPointers is True. |
219 | static bool using_class_space() { |
220 | return NOT_LP64(false) LP64_ONLY(UseCompressedClassPointers); |
221 | } |
222 | |
223 | static bool is_class_space_allocation(MetadataType mdType) { |
224 | return mdType == ClassType && using_class_space(); |
225 | } |
226 | |
227 | }; |
228 | |
229 | // Manages the metaspace portion belonging to a class loader |
230 | class ClassLoaderMetaspace : public CHeapObj<mtClass> { |
231 | friend class CollectedHeap; // For expand_and_allocate() |
232 | friend class ZCollectedHeap; // For expand_and_allocate() |
233 | friend class ShenandoahHeap; // For expand_and_allocate() |
234 | friend class Metaspace; |
235 | friend class MetaspaceUtils; |
236 | friend class metaspace::PrintCLDMetaspaceInfoClosure; |
237 | friend class VM_CollectForMetadataAllocation; // For expand_and_allocate() |
238 | |
239 | private: |
240 | |
241 | void initialize(Mutex* lock, Metaspace::MetaspaceType type); |
242 | |
243 | // Initialize the first chunk for a Metaspace. Used for |
244 | // special cases such as the boot class loader, reflection |
245 | // class loader and anonymous class loader. |
246 | void initialize_first_chunk(Metaspace::MetaspaceType type, Metaspace::MetadataType mdtype); |
247 | metaspace::Metachunk* get_initialization_chunk(Metaspace::MetaspaceType type, Metaspace::MetadataType mdtype); |
248 | |
249 | const Metaspace::MetaspaceType _space_type; |
250 | Mutex* const _lock; |
251 | metaspace::SpaceManager* _vsm; |
252 | metaspace::SpaceManager* _class_vsm; |
253 | |
254 | metaspace::SpaceManager* vsm() const { return _vsm; } |
255 | metaspace::SpaceManager* class_vsm() const { return _class_vsm; } |
256 | metaspace::SpaceManager* get_space_manager(Metaspace::MetadataType mdtype) { |
257 | assert(mdtype != Metaspace::MetadataTypeCount, "MetadaTypeCount can't be used as mdtype" ); |
258 | return mdtype == Metaspace::ClassType ? class_vsm() : vsm(); |
259 | } |
260 | |
261 | Mutex* lock() const { return _lock; } |
262 | |
263 | MetaWord* expand_and_allocate(size_t size, Metaspace::MetadataType mdtype); |
264 | |
265 | size_t class_chunk_size(size_t word_size); |
266 | |
267 | // Adds to the given statistic object. Must be locked with CLD metaspace lock. |
268 | void add_to_statistics_locked(metaspace::ClassLoaderMetaspaceStatistics* out) const; |
269 | |
270 | Metaspace::MetaspaceType space_type() const { return _space_type; } |
271 | |
272 | public: |
273 | |
274 | ClassLoaderMetaspace(Mutex* lock, Metaspace::MetaspaceType type); |
275 | ~ClassLoaderMetaspace(); |
276 | |
277 | // Allocate space for metadata of type mdtype. This is space |
278 | // within a Metachunk and is used by |
279 | // allocate(ClassLoaderData*, size_t, bool, MetadataType, TRAPS) |
280 | MetaWord* allocate(size_t word_size, Metaspace::MetadataType mdtype); |
281 | |
282 | size_t allocated_blocks_bytes() const; |
283 | size_t allocated_chunks_bytes() const; |
284 | |
285 | void deallocate(MetaWord* ptr, size_t byte_size, bool is_class); |
286 | |
287 | void print_on(outputStream* st) const; |
288 | // Debugging support |
289 | void verify(); |
290 | |
291 | // Adds to the given statistic object. Will lock with CLD metaspace lock. |
292 | void add_to_statistics(metaspace::ClassLoaderMetaspaceStatistics* out) const; |
293 | |
294 | }; // ClassLoaderMetaspace |
295 | |
296 | class MetaspaceUtils : AllStatic { |
297 | |
298 | // Spacemanager updates running counters. |
299 | friend class metaspace::SpaceManager; |
300 | |
301 | // Special access for error reporting (checks without locks). |
302 | friend class oopDesc; |
303 | friend class Klass; |
304 | |
305 | // Running counters for statistics concerning in-use chunks. |
306 | // Note: capacity = used + free + waste + overhead. Note that we do not |
307 | // count free and waste. Their sum can be deduces from the three other values. |
308 | // For more details, one should call print_report() from within a safe point. |
309 | static size_t _capacity_words [Metaspace:: MetadataTypeCount]; |
310 | static size_t _overhead_words [Metaspace:: MetadataTypeCount]; |
311 | static volatile size_t _used_words [Metaspace:: MetadataTypeCount]; |
312 | |
313 | // Atomically decrement or increment in-use statistic counters |
314 | static void dec_capacity(Metaspace::MetadataType mdtype, size_t words); |
315 | static void inc_capacity(Metaspace::MetadataType mdtype, size_t words); |
316 | static void dec_used(Metaspace::MetadataType mdtype, size_t words); |
317 | static void inc_used(Metaspace::MetadataType mdtype, size_t words); |
318 | static void dec_overhead(Metaspace::MetadataType mdtype, size_t words); |
319 | static void inc_overhead(Metaspace::MetadataType mdtype, size_t words); |
320 | |
321 | |
322 | // Getters for the in-use counters. |
323 | static size_t capacity_words(Metaspace::MetadataType mdtype) { return _capacity_words[mdtype]; } |
324 | static size_t used_words(Metaspace::MetadataType mdtype) { return _used_words[mdtype]; } |
325 | static size_t overhead_words(Metaspace::MetadataType mdtype) { return _overhead_words[mdtype]; } |
326 | |
327 | static size_t free_chunks_total_words(Metaspace::MetadataType mdtype); |
328 | |
329 | // Helper for print_xx_report. |
330 | static void print_vs(outputStream* out, size_t scale); |
331 | |
332 | public: |
333 | |
334 | // Collect used metaspace statistics. This involves walking the CLDG. The resulting |
335 | // output will be the accumulated values for all live metaspaces. |
336 | // Note: method does not do any locking. |
337 | static void collect_statistics(metaspace::ClassLoaderMetaspaceStatistics* out); |
338 | |
339 | // Used by MetaspaceCounters |
340 | static size_t free_chunks_total_words(); |
341 | static size_t free_chunks_total_bytes(); |
342 | static size_t free_chunks_total_bytes(Metaspace::MetadataType mdtype); |
343 | |
344 | static size_t capacity_words() { |
345 | return capacity_words(Metaspace::NonClassType) + |
346 | capacity_words(Metaspace::ClassType); |
347 | } |
348 | static size_t capacity_bytes(Metaspace::MetadataType mdtype) { |
349 | return capacity_words(mdtype) * BytesPerWord; |
350 | } |
351 | static size_t capacity_bytes() { |
352 | return capacity_words() * BytesPerWord; |
353 | } |
354 | |
355 | static size_t used_words() { |
356 | return used_words(Metaspace::NonClassType) + |
357 | used_words(Metaspace::ClassType); |
358 | } |
359 | static size_t used_bytes(Metaspace::MetadataType mdtype) { |
360 | return used_words(mdtype) * BytesPerWord; |
361 | } |
362 | static size_t used_bytes() { |
363 | return used_words() * BytesPerWord; |
364 | } |
365 | |
366 | // Space committed but yet unclaimed by any class loader. |
367 | static size_t free_in_vs_bytes(); |
368 | static size_t free_in_vs_bytes(Metaspace::MetadataType mdtype); |
369 | |
370 | static size_t reserved_bytes(Metaspace::MetadataType mdtype); |
371 | static size_t reserved_bytes() { |
372 | return reserved_bytes(Metaspace::ClassType) + |
373 | reserved_bytes(Metaspace::NonClassType); |
374 | } |
375 | |
376 | static size_t committed_bytes(Metaspace::MetadataType mdtype); |
377 | static size_t committed_bytes() { |
378 | return committed_bytes(Metaspace::ClassType) + |
379 | committed_bytes(Metaspace::NonClassType); |
380 | } |
381 | |
382 | static size_t min_chunk_size_words(); |
383 | |
384 | // Flags for print_report(). |
385 | enum ReportFlag { |
386 | // Show usage by class loader. |
387 | rf_show_loaders = (1 << 0), |
388 | // Breaks report down by chunk type (small, medium, ...). |
389 | rf_break_down_by_chunktype = (1 << 1), |
390 | // Breaks report down by space type (anonymous, reflection, ...). |
391 | rf_break_down_by_spacetype = (1 << 2), |
392 | // Print details about the underlying virtual spaces. |
393 | rf_show_vslist = (1 << 3), |
394 | // Print metaspace map. |
395 | rf_show_vsmap = (1 << 4), |
396 | // If show_loaders: show loaded classes for each loader. |
397 | rf_show_classes = (1 << 5) |
398 | }; |
399 | |
400 | // This will print out a basic metaspace usage report but |
401 | // unlike print_report() is guaranteed not to lock or to walk the CLDG. |
402 | static void print_basic_report(outputStream* st, size_t scale); |
403 | |
404 | // Prints a report about the current metaspace state. |
405 | // Optional parts can be enabled via flags. |
406 | // Function will walk the CLDG and will lock the expand lock; if that is not |
407 | // convenient, use print_basic_report() instead. |
408 | static void print_report(outputStream* out, size_t scale = 0, int flags = 0); |
409 | |
410 | static bool has_chunk_free_list(Metaspace::MetadataType mdtype); |
411 | static MetaspaceChunkFreeListSummary chunk_free_list_summary(Metaspace::MetadataType mdtype); |
412 | |
413 | // Print change in used metadata. |
414 | static void print_metaspace_change(size_t prev_metadata_used); |
415 | static void print_on(outputStream * out); |
416 | |
417 | // Prints an ASCII representation of the given space. |
418 | static void print_metaspace_map(outputStream* out, Metaspace::MetadataType mdtype); |
419 | |
420 | static void dump(outputStream* out); |
421 | static void verify_free_chunks(); |
422 | // Check internal counters (capacity, used). |
423 | static void verify_metrics(); |
424 | }; |
425 | |
426 | // Metaspace are deallocated when their class loader are GC'ed. |
427 | // This class implements a policy for inducing GC's to recover |
428 | // Metaspaces. |
429 | |
430 | class MetaspaceGC : AllStatic { |
431 | |
432 | // The current high-water-mark for inducing a GC. |
433 | // When committed memory of all metaspaces reaches this value, |
434 | // a GC is induced and the value is increased. Size is in bytes. |
435 | static volatile size_t _capacity_until_GC; |
436 | |
437 | // For a CMS collection, signal that a concurrent collection should |
438 | // be started. |
439 | static bool _should_concurrent_collect; |
440 | |
441 | static uint _shrink_factor; |
442 | |
443 | static size_t shrink_factor() { return _shrink_factor; } |
444 | void set_shrink_factor(uint v) { _shrink_factor = v; } |
445 | |
446 | public: |
447 | |
448 | static void initialize(); |
449 | static void post_initialize(); |
450 | |
451 | static size_t capacity_until_GC(); |
452 | static bool inc_capacity_until_GC(size_t v, |
453 | size_t* new_cap_until_GC = NULL, |
454 | size_t* old_cap_until_GC = NULL, |
455 | bool* can_retry = NULL); |
456 | static size_t dec_capacity_until_GC(size_t v); |
457 | |
458 | static bool should_concurrent_collect() { return _should_concurrent_collect; } |
459 | static void set_should_concurrent_collect(bool v) { |
460 | _should_concurrent_collect = v; |
461 | } |
462 | |
463 | // The amount to increase the high-water-mark (_capacity_until_GC) |
464 | static size_t delta_capacity_until_GC(size_t bytes); |
465 | |
466 | // Tells if we have can expand metaspace without hitting set limits. |
467 | static bool can_expand(size_t words, bool is_class); |
468 | |
469 | // Returns amount that we can expand without hitting a GC, |
470 | // measured in words. |
471 | static size_t allowed_expansion(); |
472 | |
473 | // Calculate the new high-water mark at which to induce |
474 | // a GC. |
475 | static void compute_new_size(); |
476 | }; |
477 | |
478 | #endif // SHARE_MEMORY_METASPACE_HPP |
479 | |