< prev index next >

core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/ClassLeakingRule.java

Print this page




  84 // FIXME: This rule could perhaps be improved by doing a linear regression of the metaspace usage the higher k, the higher score.
  85 public final class ClassLeakingRule implements IRule {
  86         private static final String RESULT_ID = "ClassLeak"; //$NON-NLS-1$
  87         private static final String COUNT_AGGREGATOR_ID = "count"; //$NON-NLS-1$
  88 
  89         public static final TypedPreference<IQuantity> WARNING_LIMIT = new TypedPreference<>("classLeaking.warning.limit", //$NON-NLS-1$
  90                         Messages.getString(Messages.ClassLeakingRule_CONFIG_WARNING_LIMIT),
  91                         Messages.getString(Messages.ClassLeakingRule_CONFIG_WARNING_LIMIT_LONG), NUMBER, NUMBER_UNITY.quantity(25));
  92 
  93         public static final TypedPreference<IQuantity> MAX_NUMBER_OF_CLASSES_TO_REPORT = new TypedPreference<>(
  94                         "classLeaking.classesToReport.limit", //$NON-NLS-1$
  95                         Messages.getString(Messages.General_CONFIG_CLASS_LIMIT),
  96                         Messages.getString(Messages.General_CONFIG_CLASS_LIMIT_LONG), NUMBER, NUMBER_UNITY.quantity(5));
  97 
  98         private static final List<TypedPreference<?>> CONFIG_ATTRIBUTES = Arrays.<TypedPreference<?>> asList(WARNING_LIMIT,
  99                         MAX_NUMBER_OF_CLASSES_TO_REPORT);
 100 
 101         private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
 102                 EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JdkTypeIDs.CLASS_LOAD,
 103                                 JdkTypeIDs.CLASS_UNLOAD);
 104                 if (eventAvailability == EventAvailability.UNAVAILABLE || eventAvailability == EventAvailability.DISABLED) {
 105                         return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JdkTypeIDs.CLASS_LOAD,
 106                                         JdkTypeIDs.CLASS_UNLOAD);
 107                 }
 108                 int warningLimit = (int) valueProvider.getPreferenceValue(WARNING_LIMIT).longValue();
 109 
 110                 ItemQueryBuilder queryLoad = ItemQueryBuilder.fromWhere(JdkFilters.CLASS_LOAD);
 111                 queryLoad.groupBy(JdkAttributes.CLASS_LOADED);
 112                 queryLoad.select(JdkAttributes.CLASS_LOADED);
 113                 queryLoad.select(Aggregators.count(COUNT_AGGREGATOR_ID, "classesLoaded")); //$NON-NLS-1$
 114                 Map<String, ClassEntry> entriesLoad = extractClassEntriesFromQuery(items, queryLoad.build());
 115 
 116                 ItemQueryBuilder queryUnload = ItemQueryBuilder.fromWhere(ItemFilters.and(JdkFilters.CLASS_UNLOAD,
 117                                 createClassAttributeFilter(JdkAttributes.CLASS_UNLOADED, entriesLoad)));
 118                 queryUnload.groupBy(JdkAttributes.CLASS_UNLOADED);
 119                 queryUnload.select(JdkAttributes.CLASS_UNLOADED);
 120                 queryUnload.select(Aggregators.count(COUNT_AGGREGATOR_ID, "classesUnloaded")); //$NON-NLS-1$
 121                 Map<String, ClassEntry> entriesUnload = extractClassEntriesFromQuery(items, queryUnload.build());
 122                 Map<String, ClassEntry> diff = diff(entriesLoad, entriesUnload);
 123                 List<ClassEntry> entries = new ArrayList<>(diff.values());
 124 




  84 // FIXME: This rule could perhaps be improved by doing a linear regression of the metaspace usage the higher k, the higher score.
  85 public final class ClassLeakingRule implements IRule {
  86         private static final String RESULT_ID = "ClassLeak"; //$NON-NLS-1$
  87         private static final String COUNT_AGGREGATOR_ID = "count"; //$NON-NLS-1$
  88 
  89         public static final TypedPreference<IQuantity> WARNING_LIMIT = new TypedPreference<>("classLeaking.warning.limit", //$NON-NLS-1$
  90                         Messages.getString(Messages.ClassLeakingRule_CONFIG_WARNING_LIMIT),
  91                         Messages.getString(Messages.ClassLeakingRule_CONFIG_WARNING_LIMIT_LONG), NUMBER, NUMBER_UNITY.quantity(25));
  92 
  93         public static final TypedPreference<IQuantity> MAX_NUMBER_OF_CLASSES_TO_REPORT = new TypedPreference<>(
  94                         "classLeaking.classesToReport.limit", //$NON-NLS-1$
  95                         Messages.getString(Messages.General_CONFIG_CLASS_LIMIT),
  96                         Messages.getString(Messages.General_CONFIG_CLASS_LIMIT_LONG), NUMBER, NUMBER_UNITY.quantity(5));
  97 
  98         private static final List<TypedPreference<?>> CONFIG_ATTRIBUTES = Arrays.<TypedPreference<?>> asList(WARNING_LIMIT,
  99                         MAX_NUMBER_OF_CLASSES_TO_REPORT);
 100 
 101         private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
 102                 EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JdkTypeIDs.CLASS_LOAD,
 103                                 JdkTypeIDs.CLASS_UNLOAD);
 104                 if (eventAvailability == EventAvailability.UNKNOWN || eventAvailability == EventAvailability.DISABLED) {
 105                         return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JdkTypeIDs.CLASS_LOAD,
 106                                         JdkTypeIDs.CLASS_UNLOAD);
 107                 }
 108                 int warningLimit = (int) valueProvider.getPreferenceValue(WARNING_LIMIT).longValue();
 109 
 110                 ItemQueryBuilder queryLoad = ItemQueryBuilder.fromWhere(JdkFilters.CLASS_LOAD);
 111                 queryLoad.groupBy(JdkAttributes.CLASS_LOADED);
 112                 queryLoad.select(JdkAttributes.CLASS_LOADED);
 113                 queryLoad.select(Aggregators.count(COUNT_AGGREGATOR_ID, "classesLoaded")); //$NON-NLS-1$
 114                 Map<String, ClassEntry> entriesLoad = extractClassEntriesFromQuery(items, queryLoad.build());
 115 
 116                 ItemQueryBuilder queryUnload = ItemQueryBuilder.fromWhere(ItemFilters.and(JdkFilters.CLASS_UNLOAD,
 117                                 createClassAttributeFilter(JdkAttributes.CLASS_UNLOADED, entriesLoad)));
 118                 queryUnload.groupBy(JdkAttributes.CLASS_UNLOADED);
 119                 queryUnload.select(JdkAttributes.CLASS_UNLOADED);
 120                 queryUnload.select(Aggregators.count(COUNT_AGGREGATOR_ID, "classesUnloaded")); //$NON-NLS-1$
 121                 Map<String, ClassEntry> entriesUnload = extractClassEntriesFromQuery(items, queryUnload.build());
 122                 Map<String, ClassEntry> diff = diff(entriesLoad, entriesUnload);
 123                 List<ClassEntry> entries = new ArrayList<>(diff.values());
 124 


< prev index next >