Skip to content

Commit e93789c

Browse files
authored
Merge pull request #133 from kgibm/issue132
[Fix #132] Add JVM option to hide classloaders of leak suspects
2 parents dbee703 + 842c426 commit e93789c

File tree

3 files changed

+63
-21
lines changed

3 files changed

+63
-21
lines changed

plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/LeakHunterQuery.java

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@
9999
@HelpUrl("/org.eclipse.mat.ui.help/tasks/runningleaksuspectreport.html")
100100
public class LeakHunterQuery implements IQuery
101101
{
102-
102+
private final static boolean HIDECL = Boolean.getBoolean("org.eclipse.mat.inspections.leakhunter.hidecl");
103103
static final String SYSTEM_CLASSLOADER = Messages.LeakHunterQuery_SystemClassLoader;
104104

105105
// Use per-instance formatters to avoid thread safety problems
@@ -351,7 +351,8 @@ else if (snapshot.isClass(suspectId))
351351

352352
String classloaderName = getClassLoaderName(suspectClassloader, keywords);
353353

354-
overview.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_Class, //
354+
overview.append(MessageUtil.format(
355+
HIDECL ? Messages.LeakHunterQuery_Msg_ClassNoCL : Messages.LeakHunterQuery_Msg_Class, //
355356
HTMLUtils.escapeText(className), classloaderName,
356357
formatRetainedHeap(suspect.getSuspectRetained(), totalHeap), retainedHeapTopConsumers));
357358
}
@@ -367,7 +368,8 @@ else if (snapshot.isClass(suspectId))
367368

368369
String classloaderName = getClassLoaderName(suspectClassloader, keywords);
369370

370-
overview.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_Instance, //
371+
overview.append(MessageUtil.format(
372+
HIDECL ? Messages.LeakHunterQuery_Msg_InstanceNoCL : Messages.LeakHunterQuery_Msg_Instance, //
371373
HTMLUtils.escapeText(className), classloaderName,
372374
formatRetainedHeap(suspect.getSuspectRetained(), totalHeap), retainedHeapTopConsumers));
373375

@@ -398,8 +400,10 @@ else if (snapshot.isClass(referrerId))
398400
// involvedClassloaders.add(suspectClassloader);
399401
objectsForTroubleTicketInfo.add(referrer);
400402
String referrerClassloaderName = getClassLoaderName(referrerClassloader, keywords);
401-
overview.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_ReferencedByClass, HTMLUtils.escapeText(className),
402-
referrerClassloaderName));
403+
overview.append(MessageUtil.format(
404+
HIDECL ? Messages.LeakHunterQuery_Msg_ReferencedByClassNoCL
405+
: Messages.LeakHunterQuery_Msg_ReferencedByClass,
406+
HTMLUtils.escapeText(className), referrerClassloaderName));
403407
}
404408
else
405409
{
@@ -421,8 +425,10 @@ else if (snapshot.isClass(referrerId))
421425
// involvedClassloaders.add(suspectClassloader);
422426
objectsForTroubleTicketInfo.add(referrer);
423427
String referrerClassloaderName = getClassLoaderName(referrerClassloader, keywords);
424-
overview.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_ReferencedByInstance, HTMLUtils.escapeText(referrer
425-
.getDisplayName()), referrerClassloaderName));
428+
overview.append(MessageUtil.format(
429+
HIDECL ? Messages.LeakHunterQuery_Msg_ReferencedByInstanceNoCL
430+
: Messages.LeakHunterQuery_Msg_ReferencedByInstance,
431+
HTMLUtils.escapeText(referrer.getDisplayName()), referrerClassloaderName));
426432
if (isThreadRelated)
427433
{
428434
overview.append("<p>"); //$NON-NLS-1$
@@ -462,8 +468,11 @@ else if (snapshot.isClass(accumulationPointId))
462468

463469
String classloaderName = getClassLoaderName(accPointClassloader, keywords);
464470

465-
overview.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_AccumulatedByLoadedBy, HTMLUtils.escapeText(clazz.getName()),
466-
classloaderName, formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
471+
overview.append(MessageUtil.format(
472+
HIDECL ? Messages.LeakHunterQuery_Msg_AccumulatedByLoadedByNoCL
473+
: Messages.LeakHunterQuery_Msg_AccumulatedByLoadedBy,
474+
HTMLUtils.escapeText(clazz.getName()), classloaderName,
475+
formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
467476
}
468477
else
469478
{
@@ -476,8 +485,11 @@ else if (snapshot.isClass(accumulationPointId))
476485
objectsForTroubleTicketInfo.add(accumulationObject);
477486

478487
String classloaderName = getClassLoaderName(accPointClassloader, keywords);
479-
overview.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_AccumulatedByInstance, HTMLUtils.escapeText(className),
480-
classloaderName, formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
488+
overview.append(MessageUtil.format(
489+
HIDECL ? Messages.LeakHunterQuery_Msg_AccumulatedByInstanceNoCL
490+
: Messages.LeakHunterQuery_Msg_AccumulatedByInstance,
491+
HTMLUtils.escapeText(className), classloaderName,
492+
formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
481493
}
482494
}
483495

@@ -743,8 +755,10 @@ private CompositeResult getLeakDescriptionGroupOfObjects(SuspectRecordGroupOfObj
743755
String retainedHeapTopConsumers = getRetainedHeapTopConsumersDescription(suspectInstances, listener,
744756
top_min_retained_set_consumers);
745757

746-
builder.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_InstancesOccupy, numberOfInstances,
747-
HTMLUtils.escapeText(className), classloaderName,
758+
builder.append(MessageUtil.format(
759+
HIDECL ? Messages.LeakHunterQuery_Msg_InstancesOccupyNoCL
760+
: Messages.LeakHunterQuery_Msg_InstancesOccupy,
761+
numberOfInstances, HTMLUtils.escapeText(className), classloaderName,
748762
formatRetainedHeap(suspect.getSuspectRetained(), totalHeap), retainedHeapTopConsumers));
749763

750764
List<IObject> bigSuspectInstances = new ArrayList<IObject>();
@@ -796,8 +810,11 @@ else if (snapshot.isClass(accumulationPointId))
796810
objectsForTroubleTicketInfo.add(suspect.getAccumulationPoint().getObject());
797811
classloaderName = getClassLoaderName(accPointClassloader, keywords);
798812

799-
builder.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_ReferencedFromClass, HTMLUtils.escapeText(className),
800-
classloaderName, formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
813+
builder.append(MessageUtil.format(
814+
HIDECL ? Messages.LeakHunterQuery_Msg_ReferencedFromClassNoCL
815+
: Messages.LeakHunterQuery_Msg_ReferencedFromClass,
816+
HTMLUtils.escapeText(className), classloaderName,
817+
formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
801818
}
802819
else
803820
{
@@ -811,8 +828,11 @@ else if (snapshot.isClass(accumulationPointId))
811828

812829
classloaderName = getClassLoaderName(accPointClassloader, keywords);
813830

814-
builder.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_ReferencedFromInstance, HTMLUtils.escapeText(className),
815-
classloaderName, formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
831+
builder.append(MessageUtil.format(
832+
HIDECL ? Messages.LeakHunterQuery_Msg_ReferencedFromInstanceNoCL
833+
: Messages.LeakHunterQuery_Msg_ReferencedFromInstance,
834+
HTMLUtils.escapeText(className), classloaderName,
835+
formatRetainedHeap(suspect.getAccumulationPoint().getRetainedHeapSize(), totalHeap)));
816836

817837
boolean isThreadRelated = isThread(suspect.getAccumulationPoint().getObject().getObjectId());
818838
/*
@@ -842,8 +862,10 @@ else if (snapshot.isClass(referrerId))
842862
// involvedClassloaders.add(referrerClassloader);
843863
objectsForTroubleTicketInfo.add(referrer);
844864
String referrerClassloaderName = getClassLoaderName(referrerClassloader, keywords);
845-
builder.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_ReferencedByClass, HTMLUtils.escapeText(className),
846-
referrerClassloaderName));
865+
builder.append(MessageUtil.format(
866+
HIDECL ? Messages.LeakHunterQuery_Msg_ReferencedByClassNoCL
867+
: Messages.LeakHunterQuery_Msg_ReferencedByClass,
868+
HTMLUtils.escapeText(className), referrerClassloaderName));
847869
}
848870
else
849871
{
@@ -864,8 +886,10 @@ else if (snapshot.isClass(referrerId))
864886
// involvedClassloaders.add(suspectClassloader);
865887
objectsForTroubleTicketInfo.add(referrer);
866888
String referrerClassloaderName = getClassLoaderName(referrerClassloader, keywords);
867-
builder.append(MessageUtil.format(Messages.LeakHunterQuery_Msg_ReferencedByInstance, HTMLUtils.escapeText(referrer
868-
.getDisplayName()), referrerClassloaderName));
889+
builder.append(MessageUtil.format(
890+
HIDECL ? Messages.LeakHunterQuery_Msg_ReferencedByInstanceNoCL
891+
: Messages.LeakHunterQuery_Msg_ReferencedByInstance,
892+
HTMLUtils.escapeText(referrer.getDisplayName()), referrerClassloaderName));
869893
if (isThreadRelated)
870894
{
871895
builder.append("<p>"); //$NON-NLS-1$

plugins/org.eclipse.mat.api/src/org/eclipse/mat/internal/Messages.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,18 +458,27 @@ public class Messages extends NLS
458458
public static String LeakHunterQuery_LeakHunter;
459459
public static String LeakHunterQuery_Msg_AccumulatedBy;
460460
public static String LeakHunterQuery_Msg_AccumulatedByInstance;
461+
public static String LeakHunterQuery_Msg_AccumulatedByInstanceNoCL;
461462
public static String LeakHunterQuery_Msg_AccumulatedByLoadedBy;
463+
public static String LeakHunterQuery_Msg_AccumulatedByLoadedByNoCL;
462464
public static String LeakHunterQuery_Msg_Bytes;
463465
public static String LeakHunterQuery_Msg_Class;
466+
public static String LeakHunterQuery_Msg_ClassNoCL;
464467
public static String LeakHunterQuery_Msg_ClassLoader;
465468
public static String LeakHunterQuery_Msg_Instance;
469+
public static String LeakHunterQuery_Msg_InstanceNoCL;
466470
public static String LeakHunterQuery_Msg_InstancesOccupy;
471+
public static String LeakHunterQuery_Msg_InstancesOccupyNoCL;
467472
public static String LeakHunterQuery_Msg_ReferencedBy;
468473
public static String LeakHunterQuery_Msg_ReferencedByClass;
474+
public static String LeakHunterQuery_Msg_ReferencedByClassNoCL;
469475
public static String LeakHunterQuery_Msg_ReferencedByInstance;
476+
public static String LeakHunterQuery_Msg_ReferencedByInstanceNoCL;
470477
public static String LeakHunterQuery_Msg_ReferencedFromClass;
478+
public static String LeakHunterQuery_Msg_ReferencedFromClassNoCL;
471479
public static String LeakHunterQuery_Msg_ReferencedFromClassLoader;
472480
public static String LeakHunterQuery_Msg_ReferencedFromInstance;
481+
public static String LeakHunterQuery_Msg_ReferencedFromInstanceNoCL;
473482
public static String LeakHunterQuery_Msg_SuspectsRelated;
474483
public static String LeakHunterQuery_Msg_Thread;
475484
public static String LeakHunterQuery_NothingFound;

plugins/org.eclipse.mat.api/src/org/eclipse/mat/internal/messages.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,27 @@ LeakHunterQuery_Keywords=Keywords
412412
LeakHunterQuery_LeakHunter=Leak Hunter
413413
LeakHunterQuery_Msg_AccumulatedBy=The memory is accumulated in classloader/component <strong><q>{0}</q></strong> which occupies <strong>{1}</strong> bytes.
414414
LeakHunterQuery_Msg_AccumulatedByInstance=The memory is accumulated in one instance of <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>, which occupies <strong>{2}</strong> bytes.
415+
LeakHunterQuery_Msg_AccumulatedByInstanceNoCL=The memory is accumulated in one instance of <strong><q>{0}</q></strong> which occupies <strong>{2}</strong> bytes.
415416
LeakHunterQuery_Msg_AccumulatedByLoadedBy=The memory is accumulated in class <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>, which occupies <strong>{2}</strong> bytes.
417+
LeakHunterQuery_Msg_AccumulatedByLoadedByNoCL=The memory is accumulated in class <strong><q>{0}</q></strong> which occupies <strong>{2}</strong> bytes.
416418
LeakHunterQuery_Msg_Bytes={0} bytes.
417419
LeakHunterQuery_Msg_Class=The class <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>, occupies <strong>{2}</strong> bytes. The top consumers of its minimum retained heap are {3}.
420+
LeakHunterQuery_Msg_ClassNoCL=The class <strong><q>{0}</q></strong> occupies <strong>{2}</strong> bytes. The top consumers of its minimum retained heap are {3}.
418421
LeakHunterQuery_Msg_ClassLoader=The classloader/component <strong><q>{0}</q></strong> occupies <strong>{1}</strong> bytes. The top consumers of its minimum retained heap are {2}.
419422
LeakHunterQuery_Msg_Instance=One instance of <strong><q>{0}</q></strong> loaded by <strong><q>{1}</q></strong> occupies <strong>{2}</strong> bytes. The top consumers of its minimum retained heap are {3}.
423+
LeakHunterQuery_Msg_InstanceNoCL=One instance of <strong><q>{0}</q></strong> occupies <strong>{2}</strong> bytes. The top consumers of its minimum retained heap are {3}.
420424
LeakHunterQuery_Msg_InstancesOccupy={0} instances of <strong><q>{1}</q></strong>, loaded by <strong><q>{2}</q></strong> occupy <strong>{3}</strong> bytes. The top consumers of their minimum retained heap are {4}.
425+
LeakHunterQuery_Msg_InstancesOccupyNoCL={0} instances of <strong><q>{1}</q></strong> occupy <strong>{3}</strong> bytes. The top consumers of their minimum retained heap are {4}.
421426
LeakHunterQuery_Msg_ReferencedBy=The instance is referenced by classloader/component <strong><q>{0}</q></strong>.
422427
LeakHunterQuery_Msg_ReferencedByClass=The instance is referenced by class <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>.
428+
LeakHunterQuery_Msg_ReferencedByClassNoCL=The instance is referenced by class <strong><q>{0}</q></strong>.
423429
LeakHunterQuery_Msg_ReferencedByInstance=The instance is referenced by <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>.
430+
LeakHunterQuery_Msg_ReferencedByInstanceNoCL=The instance is referenced by <strong><q>{0}</q></strong>.
424431
LeakHunterQuery_Msg_ReferencedFromClass=Most of these instances are referenced from the class <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>, which occupies <strong>{2}</strong> bytes.
432+
LeakHunterQuery_Msg_ReferencedFromClassNoCL=Most of these instances are referenced from the class <strong><q>{0}</q></strong> which occupies <strong>{2}</strong> bytes.
425433
LeakHunterQuery_Msg_ReferencedFromClassLoader=Most of these instances are referenced from classloader/component <strong><q>{0}</q></strong> which occupies <strong>{1}</strong> bytes.
426434
LeakHunterQuery_Msg_ReferencedFromInstance=Most of these instances are referenced from one instance of <strong><q>{0}</q></strong>, loaded by <strong><q>{1}</q></strong>, which occupies <strong>{2}</strong> bytes.
435+
LeakHunterQuery_Msg_ReferencedFromInstanceNoCL=Most of these instances are referenced from one instance of <strong><q>{0}</q></strong> which occupies <strong>{2}</strong> bytes.
427436
LeakHunterQuery_Msg_SuspectsRelated=The problem suspects {0} and {1} may be related, because the reference chains to them have a common beginning.
428437
LeakHunterQuery_Msg_Thread=The thread <strong>{0}</strong> keeps local variables with total size <strong>{1}</strong> bytes. The top consumers of its minimum retained heap are {2}.
429438
LeakHunterQuery_NothingFound=No leak suspect was found

0 commit comments

Comments
 (0)