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()) { |