hotspot/src/share/vm/memory/metaspaceShared.cpp
changeset 24424 2658d7834c6e
parent 23540 06f7d6e1f654
child 25468 5331df506290
equal deleted inserted replaced
24358:8528b67f6562 24424:2658d7834c6e
     1 /*
     1 /*
     2  * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    38 #include "runtime/signature.hpp"
    38 #include "runtime/signature.hpp"
    39 #include "runtime/vm_operations.hpp"
    39 #include "runtime/vm_operations.hpp"
    40 #include "runtime/vmThread.hpp"
    40 #include "runtime/vmThread.hpp"
    41 #include "utilities/hashtable.inline.hpp"
    41 #include "utilities/hashtable.inline.hpp"
    42 
    42 
       
    43 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
    43 
    44 
    44 int MetaspaceShared::_max_alignment = 0;
    45 int MetaspaceShared::_max_alignment = 0;
    45 
    46 
    46 ReservedSpace* MetaspaceShared::_shared_rs = NULL;
    47 ReservedSpace* MetaspaceShared::_shared_rs = NULL;
    47 
    48 
   335   int all_ro_count = 0;
   336   int all_ro_count = 0;
   336   int all_ro_bytes = 0;
   337   int all_ro_bytes = 0;
   337   int all_rw_count = 0;
   338   int all_rw_count = 0;
   338   int all_rw_bytes = 0;
   339   int all_rw_bytes = 0;
   339 
   340 
   340   const char *fmt = "%-20s: %8d %10d %5.1f | %8d %10d %5.1f | %8d %10d %5.1f";
   341 // To make fmt_stats be a syntactic constant (for format warnings), use #define.
       
   342 #define fmt_stats "%-20s: %8d %10d %5.1f | %8d %10d %5.1f | %8d %10d %5.1f"
   341   const char *sep = "--------------------+---------------------------+---------------------------+--------------------------";
   343   const char *sep = "--------------------+---------------------------+---------------------------+--------------------------";
   342   const char *hdr = "                        ro_cnt   ro_bytes     % |   rw_cnt   rw_bytes     % |  all_cnt  all_bytes     %";
   344   const char *hdr = "                        ro_cnt   ro_bytes     % |   rw_cnt   rw_bytes     % |  all_cnt  all_bytes     %";
   343 
   345 
   344   tty->print_cr("Detailed metadata info (rw includes md and mc):");
   346   tty->print_cr("Detailed metadata info (rw includes md and mc):");
   345   tty->print_cr(hdr);
   347   tty->print_cr("%s", hdr);
   346   tty->print_cr(sep);
   348   tty->print_cr("%s", sep);
   347   for (int type = 0; type < int(_number_of_types); type ++) {
   349   for (int type = 0; type < int(_number_of_types); type ++) {
   348     const char *name = type_name((Type)type);
   350     const char *name = type_name((Type)type);
   349     int ro_count = _counts[RO][type];
   351     int ro_count = _counts[RO][type];
   350     int ro_bytes = _bytes [RO][type];
   352     int ro_bytes = _bytes [RO][type];
   351     int rw_count = _counts[RW][type];
   353     int rw_count = _counts[RW][type];
   355 
   357 
   356     double ro_perc = 100.0 * double(ro_bytes) / double(ro_all);
   358     double ro_perc = 100.0 * double(ro_bytes) / double(ro_all);
   357     double rw_perc = 100.0 * double(rw_bytes) / double(rw_all);
   359     double rw_perc = 100.0 * double(rw_bytes) / double(rw_all);
   358     double perc    = 100.0 * double(bytes)    / double(ro_all + rw_all);
   360     double perc    = 100.0 * double(bytes)    / double(ro_all + rw_all);
   359 
   361 
   360     tty->print_cr(fmt, name,
   362     tty->print_cr(fmt_stats, name,
   361                   ro_count, ro_bytes, ro_perc,
   363                   ro_count, ro_bytes, ro_perc,
   362                   rw_count, rw_bytes, rw_perc,
   364                   rw_count, rw_bytes, rw_perc,
   363                   count, bytes, perc);
   365                   count, bytes, perc);
   364 
   366 
   365     all_ro_count += ro_count;
   367     all_ro_count += ro_count;
   373 
   375 
   374   double all_ro_perc = 100.0 * double(all_ro_bytes) / double(ro_all);
   376   double all_ro_perc = 100.0 * double(all_ro_bytes) / double(ro_all);
   375   double all_rw_perc = 100.0 * double(all_rw_bytes) / double(rw_all);
   377   double all_rw_perc = 100.0 * double(all_rw_bytes) / double(rw_all);
   376   double all_perc    = 100.0 * double(all_bytes)    / double(ro_all + rw_all);
   378   double all_perc    = 100.0 * double(all_bytes)    / double(ro_all + rw_all);
   377 
   379 
   378   tty->print_cr(sep);
   380   tty->print_cr("%s", sep);
   379   tty->print_cr(fmt, "Total",
   381   tty->print_cr(fmt_stats, "Total",
   380                 all_ro_count, all_ro_bytes, all_ro_perc,
   382                 all_ro_count, all_ro_bytes, all_ro_perc,
   381                 all_rw_count, all_rw_bytes, all_rw_perc,
   383                 all_rw_count, all_rw_bytes, all_rw_perc,
   382                 all_count, all_bytes, all_perc);
   384                 all_count, all_bytes, all_perc);
   383 
   385 
   384   assert(all_ro_bytes == ro_all, "everything should have been counted");
   386   assert(all_ro_bytes == ro_all, "everything should have been counted");
   385   assert(all_rw_bytes == rw_all, "everything should have been counted");
   387   assert(all_rw_bytes == rw_all, "everything should have been counted");
       
   388 #undef fmt_stats
   386 }
   389 }
   387 
   390 
   388 // Populate the shared space.
   391 // Populate the shared space.
   389 
   392 
   390 class VM_PopulateDumpSharedSpace: public VM_Operation {
   393 class VM_PopulateDumpSharedSpace: public VM_Operation {
   512   WriteClosure wc(md_top, md_end);
   515   WriteClosure wc(md_top, md_end);
   513   MetaspaceShared::serialize(&wc);
   516   MetaspaceShared::serialize(&wc);
   514   md_top = wc.get_top();
   517   md_top = wc.get_top();
   515 
   518 
   516   // Print shared spaces all the time
   519   // Print shared spaces all the time
   517   const char* fmt = "%s space: %9d [ %4.1f%% of total] out of %9d bytes [%4.1f%% used] at " PTR_FORMAT;
   520 // To make fmt_space be a syntactic constant (for format warnings), use #define.
       
   521 #define fmt_space "%s space: %9d [ %4.1f%% of total] out of %9d bytes [%4.1f%% used] at " INTPTR_FORMAT
   518   Metaspace* ro_space = _loader_data->ro_metaspace();
   522   Metaspace* ro_space = _loader_data->ro_metaspace();
   519   Metaspace* rw_space = _loader_data->rw_metaspace();
   523   Metaspace* rw_space = _loader_data->rw_metaspace();
   520 
   524 
   521   // Allocated size of each space (may not be all occupied)
   525   // Allocated size of each space (may not be all occupied)
   522   const size_t ro_alloced = ro_space->capacity_bytes_slow(Metaspace::NonClassType);
   526   const size_t ro_alloced = ro_space->capacity_bytes_slow(Metaspace::NonClassType);
   543   const double rw_u_perc = rw_bytes / double(rw_alloced) * 100.0;
   547   const double rw_u_perc = rw_bytes / double(rw_alloced) * 100.0;
   544   const double md_u_perc = md_bytes / double(md_alloced) * 100.0;
   548   const double md_u_perc = md_bytes / double(md_alloced) * 100.0;
   545   const double mc_u_perc = mc_bytes / double(mc_alloced) * 100.0;
   549   const double mc_u_perc = mc_bytes / double(mc_alloced) * 100.0;
   546   const double total_u_perc = total_bytes / double(total_alloced) * 100.0;
   550   const double total_u_perc = total_bytes / double(total_alloced) * 100.0;
   547 
   551 
   548   tty->print_cr(fmt, "ro", ro_bytes, ro_t_perc, ro_alloced, ro_u_perc, ro_space->bottom());
   552   tty->print_cr(fmt_space, "ro", ro_bytes, ro_t_perc, ro_alloced, ro_u_perc, ro_space->bottom());
   549   tty->print_cr(fmt, "rw", rw_bytes, rw_t_perc, rw_alloced, rw_u_perc, rw_space->bottom());
   553   tty->print_cr(fmt_space, "rw", rw_bytes, rw_t_perc, rw_alloced, rw_u_perc, rw_space->bottom());
   550   tty->print_cr(fmt, "md", md_bytes, md_t_perc, md_alloced, md_u_perc, md_low);
   554   tty->print_cr(fmt_space, "md", md_bytes, md_t_perc, md_alloced, md_u_perc, md_low);
   551   tty->print_cr(fmt, "mc", mc_bytes, mc_t_perc, mc_alloced, mc_u_perc, mc_low);
   555   tty->print_cr(fmt_space, "mc", mc_bytes, mc_t_perc, mc_alloced, mc_u_perc, mc_low);
   552   tty->print_cr("total   : %9d [100.0%% of total] out of %9d bytes [%4.1f%% used]",
   556   tty->print_cr("total   : %9d [100.0%% of total] out of %9d bytes [%4.1f%% used]",
   553                  total_bytes, total_alloced, total_u_perc);
   557                  total_bytes, total_alloced, total_u_perc);
   554 
   558 
   555   // Update the vtable pointers in all of the Klass objects in the
   559   // Update the vtable pointers in all of the Klass objects in the
   556   // heap. They should point to newly generated vtable.
   560   // heap. They should point to newly generated vtable.
   601     dac.iterate_metaspace(_loader_data->ro_metaspace(), DumpAllocClosure::RO);
   605     dac.iterate_metaspace(_loader_data->ro_metaspace(), DumpAllocClosure::RO);
   602     dac.iterate_metaspace(_loader_data->rw_metaspace(), DumpAllocClosure::RW);
   606     dac.iterate_metaspace(_loader_data->rw_metaspace(), DumpAllocClosure::RW);
   603 
   607 
   604     dac.dump_stats(int(ro_bytes), int(rw_bytes), int(md_bytes), int(mc_bytes));
   608     dac.dump_stats(int(ro_bytes), int(rw_bytes), int(md_bytes), int(mc_bytes));
   605   }
   609   }
       
   610 #undef fmt_space
   606 }
   611 }
   607 
   612 
   608 static void link_shared_classes(Klass* obj, TRAPS) {
   613 static void link_shared_classes(Klass* obj, TRAPS) {
   609   Klass* k = obj;
   614   Klass* k = obj;
   610   if (k->oop_is_instance()) {
   615   if (k->oop_is_instance()) {