Mercurial > hg > graal-compiler
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 */ |