comparison src/share/vm/classfile/classLoaderData.cpp @ 10405:f2110083203d

8005849: JEP 167: Event-Based JVM Tracing Reviewed-by: acorn, coleenp, sla Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>
author sla
date Mon, 10 Jun 2013 11:30:51 +0200
parents d58c62b7447d
children 190899198332
comparison
equal deleted inserted replaced
10404:d0add7016434 10405:f2110083203d
62 #include "runtime/safepoint.hpp" 62 #include "runtime/safepoint.hpp"
63 #include "runtime/synchronizer.hpp" 63 #include "runtime/synchronizer.hpp"
64 #include "utilities/growableArray.hpp" 64 #include "utilities/growableArray.hpp"
65 #include "utilities/ostream.hpp" 65 #include "utilities/ostream.hpp"
66 66
67 #if INCLUDE_TRACE
68 #include "trace/tracing.hpp"
69 #endif
70
71
67 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL; 72 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
68 73
69 ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) : 74 ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :
70 _class_loader(h_class_loader()), 75 _class_loader(h_class_loader()),
71 _is_anonymous(is_anonymous), _keep_alive(is_anonymous), // initially 76 _is_anonymous(is_anonymous), _keep_alive(is_anonymous), // initially
115 120
116 void ClassLoaderData::classes_do(KlassClosure* klass_closure) { 121 void ClassLoaderData::classes_do(KlassClosure* klass_closure) {
117 for (Klass* k = _klasses; k != NULL; k = k->next_link()) { 122 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
118 klass_closure->do_klass(k); 123 klass_closure->do_klass(k);
119 assert(k != k->next_link(), "no loops!"); 124 assert(k != k->next_link(), "no loops!");
125 }
126 }
127
128 void ClassLoaderData::classes_do(void f(Klass * const)) {
129 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
130 f(k);
120 } 131 }
121 } 132 }
122 133
123 void ClassLoaderData::classes_do(void f(InstanceKlass*)) { 134 void ClassLoaderData::classes_do(void f(InstanceKlass*)) {
124 for (Klass* k = _klasses; k != NULL; k = k->next_link()) { 135 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
578 } 589 }
579 590
580 void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) { 591 void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
581 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) { 592 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
582 cld->classes_do(klass_closure); 593 cld->classes_do(klass_closure);
594 }
595 }
596
597 void ClassLoaderDataGraph::classes_do(void f(Klass* const)) {
598 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
599 cld->classes_do(f);
600 }
601 }
602
603 void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) {
604 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
605 for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) {
606 cld->classes_do(f);
583 } 607 }
584 } 608 }
585 609
586 GrowableArray<ClassLoaderData*>* ClassLoaderDataGraph::new_clds() { 610 GrowableArray<ClassLoaderData*>* ClassLoaderDataGraph::new_clds() {
587 assert(_head == NULL || _saved_head != NULL, "remember_new_clds(true) not called?"); 611 assert(_head == NULL || _saved_head != NULL, "remember_new_clds(true) not called?");
685 _head = data; 709 _head = data;
686 } 710 }
687 dead->set_next(_unloading); 711 dead->set_next(_unloading);
688 _unloading = dead; 712 _unloading = dead;
689 } 713 }
714
715 if (seen_dead_loader) {
716 post_class_unload_events();
717 }
718
690 return seen_dead_loader; 719 return seen_dead_loader;
691 } 720 }
692 721
693 void ClassLoaderDataGraph::purge() { 722 void ClassLoaderDataGraph::purge() {
694 ClassLoaderData* list = _unloading; 723 ClassLoaderData* list = _unloading;
698 ClassLoaderData* purge_me = next; 727 ClassLoaderData* purge_me = next;
699 next = purge_me->next(); 728 next = purge_me->next();
700 delete purge_me; 729 delete purge_me;
701 } 730 }
702 Metaspace::purge(); 731 Metaspace::purge();
732 }
733
734 void ClassLoaderDataGraph::post_class_unload_events(void) {
735 #if INCLUDE_TRACE
736 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
737 if (Tracing::enabled()) {
738 if (Tracing::is_event_enabled(TraceClassUnloadEvent)) {
739 assert(_unloading != NULL, "need class loader data unload list!");
740 _class_unload_time = Tracing::time();
741 classes_unloading_do(&class_unload_event);
742 }
743 Tracing::on_unloading_classes();
744 }
745 #endif
703 } 746 }
704 747
705 // CDS support 748 // CDS support
706 749
707 // Global metaspaces for writing information to the shared archive. When 750 // Global metaspaces for writing information to the shared archive. When
767 } else { 810 } else {
768 out->print("class loader "PTR_FORMAT, this); 811 out->print("class loader "PTR_FORMAT, this);
769 class_loader()->print_value_on(out); 812 class_loader()->print_value_on(out);
770 } 813 }
771 } 814 }
815
816 #if INCLUDE_TRACE
817
818 TracingTime ClassLoaderDataGraph::_class_unload_time;
819
820 void ClassLoaderDataGraph::class_unload_event(Klass* const k) {
821
822 // post class unload event
823 EventClassUnload event(UNTIMED);
824 event.set_endtime(_class_unload_time);
825 event.set_unloadedClass(k);
826 oop defining_class_loader = k->class_loader();
827 event.set_definingClassLoader(defining_class_loader != NULL ?
828 defining_class_loader->klass() : (Klass*)NULL);
829 event.commit();
830 }
831
832 #endif /* INCLUDE_TRACE */