hotspot/src/share/vm/memory/metaspace.hpp
changeset 17109 90e6c31bbbe4
parent 17101 3a82a58d9aa9
child 17628 481e0280aed3
equal deleted inserted replaced
17108:cf72dcf9a8f2 17109:90e6c31bbbe4
   109   SpaceManager* vsm() const { return _vsm; }
   109   SpaceManager* vsm() const { return _vsm; }
   110 
   110 
   111   SpaceManager* _class_vsm;
   111   SpaceManager* _class_vsm;
   112   SpaceManager* class_vsm() const { return _class_vsm; }
   112   SpaceManager* class_vsm() const { return _class_vsm; }
   113 
   113 
       
   114   // Allocate space for metadata of type mdtype. This is space
       
   115   // within a Metachunk and is used by
       
   116   //   allocate(ClassLoaderData*, size_t, bool, MetadataType, TRAPS)
       
   117   // which returns a Metablock.
   114   MetaWord* allocate(size_t word_size, MetadataType mdtype);
   118   MetaWord* allocate(size_t word_size, MetadataType mdtype);
   115 
   119 
   116   // Virtual Space lists for both classes and other metadata
   120   // Virtual Space lists for both classes and other metadata
   117   static VirtualSpaceList* _space_list;
   121   static VirtualSpaceList* _space_list;
   118   static VirtualSpaceList* _class_space_list;
   122   static VirtualSpaceList* _class_space_list;
   131 
   135 
   132   static size_t first_chunk_word_size() { return _first_chunk_word_size; }
   136   static size_t first_chunk_word_size() { return _first_chunk_word_size; }
   133   static size_t first_class_chunk_word_size() { return _first_class_chunk_word_size; }
   137   static size_t first_class_chunk_word_size() { return _first_class_chunk_word_size; }
   134 
   138 
   135   char*  bottom() const;
   139   char*  bottom() const;
   136   size_t used_words(MetadataType mdtype) const;
   140   size_t used_words_slow(MetadataType mdtype) const;
   137   size_t free_words(MetadataType mdtype) const;
   141   size_t free_words(MetadataType mdtype) const;
   138   size_t capacity_words(MetadataType mdtype) const;
   142   size_t capacity_words_slow(MetadataType mdtype) const;
   139   size_t waste_words(MetadataType mdtype) const;
   143   size_t waste_words(MetadataType mdtype) const;
       
   144 
       
   145   size_t used_bytes_slow(MetadataType mdtype) const;
       
   146   size_t capacity_bytes_slow(MetadataType mdtype) const;
   140 
   147 
   141   static Metablock* allocate(ClassLoaderData* loader_data, size_t size,
   148   static Metablock* allocate(ClassLoaderData* loader_data, size_t size,
   142                             bool read_only, MetadataType mdtype, TRAPS);
   149                             bool read_only, MetadataType mdtype, TRAPS);
   143   void deallocate(MetaWord* ptr, size_t byte_size, bool is_class);
   150   void deallocate(MetaWord* ptr, size_t byte_size, bool is_class);
   144 
   151 
   159 };
   166 };
   160 
   167 
   161 class MetaspaceAux : AllStatic {
   168 class MetaspaceAux : AllStatic {
   162 
   169 
   163   // Statistics for class space and data space in metaspace.
   170   // Statistics for class space and data space in metaspace.
   164   static size_t used_in_bytes(Metaspace::MetadataType mdtype);
   171 
       
   172   // These methods iterate over the classloader data graph
       
   173   // for the given Metaspace type.  These are slow.
       
   174   static size_t used_bytes_slow(Metaspace::MetadataType mdtype);
   165   static size_t free_in_bytes(Metaspace::MetadataType mdtype);
   175   static size_t free_in_bytes(Metaspace::MetadataType mdtype);
   166   static size_t capacity_in_bytes(Metaspace::MetadataType mdtype);
   176   static size_t capacity_bytes_slow(Metaspace::MetadataType mdtype);
       
   177 
       
   178   // Iterates over the virtual space list.
   167   static size_t reserved_in_bytes(Metaspace::MetadataType mdtype);
   179   static size_t reserved_in_bytes(Metaspace::MetadataType mdtype);
   168 
   180 
   169   static size_t free_chunks_total(Metaspace::MetadataType mdtype);
   181   static size_t free_chunks_total(Metaspace::MetadataType mdtype);
   170   static size_t free_chunks_total_in_bytes(Metaspace::MetadataType mdtype);
   182   static size_t free_chunks_total_in_bytes(Metaspace::MetadataType mdtype);
   171 
   183 
   172  public:
   184  public:
   173   // Total of space allocated to metadata in all Metaspaces
   185   // Running sum of space in all Metachunks that has been
   174   static size_t used_in_bytes() {
   186   // allocated to a Metaspace.  This is used instead of
   175     return used_in_bytes(Metaspace::ClassType) +
   187   // iterating over all the classloaders
   176            used_in_bytes(Metaspace::NonClassType);
   188   static size_t _allocated_capacity_words;
   177   }
   189   // Running sum of space in all Metachunks that have
   178 
   190   // are being used for metadata.
   179   // Total of available space in all Metaspaces
   191   static size_t _allocated_used_words;
   180   // Total of capacity allocated to all Metaspaces.  This includes
   192 
   181   // space in Metachunks not yet allocated and in the Metachunk
   193  public:
   182   // freelist.
   194   // Decrement and increment _allocated_capacity_words
   183   static size_t capacity_in_bytes() {
   195   static void dec_capacity(size_t words);
   184     return capacity_in_bytes(Metaspace::ClassType) +
   196   static void inc_capacity(size_t words);
   185            capacity_in_bytes(Metaspace::NonClassType);
   197 
       
   198   // Decrement and increment _allocated_used_words
       
   199   static void dec_used(size_t words);
       
   200   static void inc_used(size_t words);
       
   201 
       
   202   // Total of space allocated to metadata in all Metaspaces.
       
   203   // This sums the space used in each Metachunk by
       
   204   // iterating over the classloader data graph
       
   205   static size_t used_bytes_slow() {
       
   206     return used_bytes_slow(Metaspace::ClassType) +
       
   207            used_bytes_slow(Metaspace::NonClassType);
       
   208   }
       
   209 
       
   210   // Used by MetaspaceCounters
       
   211   static size_t free_chunks_total();
       
   212   static size_t free_chunks_total_in_bytes();
       
   213 
       
   214   static size_t allocated_capacity_words() {
       
   215     return _allocated_capacity_words;
       
   216   }
       
   217   static size_t allocated_capacity_bytes() {
       
   218     return _allocated_capacity_words * BytesPerWord;
       
   219   }
       
   220 
       
   221   static size_t allocated_used_words() {
       
   222     return _allocated_used_words;
       
   223   }
       
   224   static size_t allocated_used_bytes() {
       
   225     return _allocated_used_words * BytesPerWord;
       
   226   }
       
   227 
       
   228   static size_t free_bytes();
       
   229 
       
   230   // Total capacity in all Metaspaces
       
   231   static size_t capacity_bytes_slow() {
       
   232 #ifdef PRODUCT
       
   233     // Use allocated_capacity_bytes() in PRODUCT instead of this function.
       
   234     guarantee(false, "Should not call capacity_bytes_slow() in the PRODUCT");
       
   235 #endif
       
   236     size_t class_capacity = capacity_bytes_slow(Metaspace::ClassType);
       
   237     size_t non_class_capacity = capacity_bytes_slow(Metaspace::NonClassType);
       
   238     assert(allocated_capacity_bytes() == class_capacity + non_class_capacity,
       
   239            err_msg("bad accounting: allocated_capacity_bytes() " SIZE_FORMAT
       
   240              " class_capacity + non_class_capacity " SIZE_FORMAT
       
   241              " class_capacity " SIZE_FORMAT " non_class_capacity " SIZE_FORMAT,
       
   242              allocated_capacity_bytes(), class_capacity + non_class_capacity,
       
   243              class_capacity, non_class_capacity));
       
   244 
       
   245     return class_capacity + non_class_capacity;
   186   }
   246   }
   187 
   247 
   188   // Total space reserved in all Metaspaces
   248   // Total space reserved in all Metaspaces
   189   static size_t reserved_in_bytes() {
   249   static size_t reserved_in_bytes() {
   190     return reserved_in_bytes(Metaspace::ClassType) +
   250     return reserved_in_bytes(Metaspace::ClassType) +
   199   static void print_on(outputStream * out, Metaspace::MetadataType mdtype);
   259   static void print_on(outputStream * out, Metaspace::MetadataType mdtype);
   200 
   260 
   201   static void print_waste(outputStream* out);
   261   static void print_waste(outputStream* out);
   202   static void dump(outputStream* out);
   262   static void dump(outputStream* out);
   203   static void verify_free_chunks();
   263   static void verify_free_chunks();
       
   264   // Checks that the values returned by allocated_capacity_bytes() and
       
   265   // capacity_bytes_slow() are the same.
       
   266   static void verify_capacity();
       
   267   static void verify_used();
       
   268   static void verify_metrics();
   204 };
   269 };
   205 
   270 
   206 // Metaspace are deallocated when their class loader are GC'ed.
   271 // Metaspace are deallocated when their class loader are GC'ed.
   207 // This class implements a policy for inducing GC's to recover
   272 // This class implements a policy for inducing GC's to recover
   208 // Metaspaces.
   273 // Metaspaces.
   233   void set_shrink_factor(uint v) { _shrink_factor = v; }
   298   void set_shrink_factor(uint v) { _shrink_factor = v; }
   234 
   299 
   235  public:
   300  public:
   236 
   301 
   237   static size_t capacity_until_GC() { return _capacity_until_GC; }
   302   static size_t capacity_until_GC() { return _capacity_until_GC; }
   238   static size_t capacity_until_GC_in_bytes() { return _capacity_until_GC * BytesPerWord; }
       
   239   static void inc_capacity_until_GC(size_t v) { _capacity_until_GC += v; }
   303   static void inc_capacity_until_GC(size_t v) { _capacity_until_GC += v; }
   240   static void dec_capacity_until_GC(size_t v) {
   304   static void dec_capacity_until_GC(size_t v) {
   241     _capacity_until_GC = _capacity_until_GC > v ? _capacity_until_GC - v : 0;
   305     _capacity_until_GC = _capacity_until_GC > v ? _capacity_until_GC - v : 0;
   242   }
   306   }
   243   static bool expand_after_GC()           { return _expand_after_GC; }
   307   static bool expand_after_GC()           { return _expand_after_GC; }