< prev index next >
src/share/vm/memory/metaspace.cpp
Print this page
@@ -2980,10 +2980,106 @@
if (Metaspace::using_class_space()) {
print_class_waste(out);
}
}
+
+class PrintCLDMetaspaceInfoClosure : public CLDClosure {
+private:
+ outputStream* _out;
+ size_t _total_capacity;
+ size_t _total_used;
+ size_t _total_waste;
+ size_t _anonymous_count;
+ size_t _anonymous_total;
+ size_t _anonymous_waste;
+
+public:
+ PrintCLDMetaspaceInfoClosure(outputStream* out)
+ : _out(out), _total_capacity(0), _total_used(0),
+ _total_waste(0), _anonymous_count(0),
+ _anonymous_total(0), _anonymous_waste(0) { }
+
+ ~PrintCLDMetaspaceInfoClosure() {
+ size_t waste = _total_waste;
+ _out->print_cr("");
+ _out->print_cr("Total: capacity: " SIZE_FORMAT "KB used: " SIZE_FORMAT "KB waste: "
+ SIZE_FORMAT "KB (%2.2f%%)",
+ _total_capacity / K, _total_used / K, waste / K,
+ ((float)waste * 100) / _total_capacity);
+ _out->print_cr("Anonymous class loaders: " SIZE_FORMAT " total: " SIZE_FORMAT "KB waste: "
+ SIZE_FORMAT "KB (%2.2f%%)",
+ _anonymous_count, _anonymous_total / K, _anonymous_waste / K,
+ ((float)_anonymous_waste * 100) / _anonymous_total);
+ }
+
+ void do_cld(ClassLoaderData* cld) {
+ if (cld->is_unloading()) return;
+ if (cld->is_anonymous()) {
+ _anonymous_count ++;
+ _out->print_cr("ClassLoader: for anonymous class");
+ } else {
+ ResourceMark rm;
+ _out->print_cr("ClassLoader: %s", cld->loader_name());
+ }
+
+ Metaspace* msp = cld->metaspace_or_null();
+ if (msp != NULL) {
+ print_metaspace(msp, cld->is_anonymous());
+ }
+ _out->print_cr("");
+ }
+
+private:
+ void print_metaspace(Metaspace* msp, bool anonymous) {
+ assert(msp != NULL, "Sanity");
+ SpaceManager* vsm = msp->vsm();
+
+
+ _total_capacity += vsm->sum_capacity_in_chunks_in_use() * BytesPerWord;
+ _total_used += vsm->sum_used_in_chunks_in_use() * BytesPerWord;
+ _total_waste += vsm->sum_waste_in_chunks_in_use() * BytesPerWord;
+ if (anonymous) {
+ _total_waste += vsm->sum_free_in_chunks_in_use() * BytesPerWord;
+ _anonymous_waste += (vsm->sum_free_in_chunks_in_use() + vsm->sum_waste_in_chunks_in_use()) * BytesPerWord;
+ _anonymous_total += vsm->sum_capacity_in_chunks_in_use() * BytesPerWord;
+ }
+
+ _out->print_cr(" Metadata:");
+ _out->print_cr(" capacity: %8.2fKB used: %8.2fKB free: %8.2fKB waste: %.2fKB",
+ ((float)vsm->sum_capacity_in_chunks_in_use() * BytesPerWord) / K,
+ ((float)vsm->sum_used_in_chunks_in_use() * BytesPerWord) / K,
+ ((float)vsm->sum_free_in_chunks_in_use() * BytesPerWord) / K,
+ ((float)vsm->sum_waste_in_chunks_in_use() *BytesPerWord) / K);
+
+ if (Metaspace::using_class_space()) {
+ _out->print_cr(" Class data:");
+ vsm = msp->class_vsm();
+ _total_capacity += vsm->sum_capacity_in_chunks_in_use() * BytesPerWord;
+ _total_used += vsm->sum_used_in_chunks_in_use() * BytesPerWord;
+ _total_waste += vsm->sum_waste_in_chunks_in_use() * BytesPerWord;
+ if (anonymous) {
+ _total_waste += vsm->sum_free_in_chunks_in_use() * BytesPerWord;
+ _anonymous_waste += (vsm->sum_free_in_chunks_in_use() + vsm->sum_waste_in_chunks_in_use()) * BytesPerWord;
+ _anonymous_total += vsm->sum_capacity_in_chunks_in_use() * BytesPerWord;
+ }
+ _out->print_cr(" capacity: %8.2fKB used: %8.2fKB free: %8.2fKB waste: %.2fKB",
+ ((float)vsm->sum_capacity_in_chunks_in_use() * BytesPerWord) / K,
+ ((float)vsm->sum_used_in_chunks_in_use() * BytesPerWord) / K,
+ ((float)vsm->sum_free_in_chunks_in_use() * BytesPerWord) / K,
+ ((float)vsm->sum_waste_in_chunks_in_use() * BytesPerWord) / K);
+ }
+ }
+};
+
+
+void MetaspaceAux::print_cld_metadata(outputStream* out) {
+ PrintCLDMetaspaceInfoClosure cl(out);
+ ClassLoaderDataGraph::cld_do(&cl);
+}
+
+
// Dump global metaspace things from the end of ClassLoaderDataGraph
void MetaspaceAux::dump(outputStream* out) {
out->print_cr("All Metaspace:");
out->print("data space: "); print_on(out, Metaspace::NonClassType);
out->print("class space: "); print_on(out, Metaspace::ClassType);
< prev index next >