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
|