Class PossibleMemoryBloat

java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.PossibleMemoryBloat
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

@CustomUserValue public class PossibleMemoryBloat extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for classes that maintain collections or StringBuffer/StringBuilders in static member variables, and that do not appear to provide a way to clear or remove items from these members. Such class fields are likely causes of memory bloat.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private Map<edu.umd.cs.findbugs.ba.XField,edu.umd.cs.findbugs.FieldAnnotation>
     
    private Map<edu.umd.cs.findbugs.ba.XField,edu.umd.cs.findbugs.FieldAnnotation>
     
    private static final Set<String>
     
    private final edu.umd.cs.findbugs.BugReporter
     
    private static final Set<String>
     
    private static final Set<String>
     
    private boolean
     
    private Boolean
     
    private static final FQMethod
     
    private static final FQMethod
     
     
    private static final Set<String>
     
    private String
     
    private static final Set<String>
     
    private static final Set<String>
     
    private edu.umd.cs.findbugs.OpcodeStack
     
    private Set<edu.umd.cs.findbugs.FieldAnnotation>
     
    private Map<Integer,edu.umd.cs.findbugs.ba.XField>
     

    Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT

    Fields inherited from interface edu.umd.cs.findbugs.Priorities

    EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
  • Constructor Summary

    Constructors
    Constructor
    Description
    PossibleMemoryBloat(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a PMB detector given the reporter to report bugs on
  • Method Summary

    Modifier and Type
    Method
    Description
    protected void
    checkMethodAsDecreasingOrIncreasing(edu.umd.cs.findbugs.ba.XField field)
     
    private void
    parseFields(edu.umd.cs.findbugs.ba.ClassContext classContext)
     
    protected void
     
    private void
     
    private void
     
    void
    sawOpcode(int seen)
    implements the visitor to look for methods that empty a bloatable field if found, remove these fields from the current list
    private boolean
     
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    collects static fields that are likely bloatable objects and if found allows the visitor to proceed, at the end report all leftover fields
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor to reset the opcode stack
    void
    visitMethod(org.apache.bcel.classfile.Method obj)
    implements the visitor to collect the method name

    Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

    getClassContext, report, shouldVisitCode

    Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    afterOpcode, areOppositeBranches, atCatchBlock, beforeOpcode, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefConstantOperand, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, printOpCode, sawBranchTo, sawClass, sawDouble, sawField, sawFloat, sawIMethod, sawInt, sawLong, sawMethod, sawRegister, sawString, visit

    Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor

    getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation

    Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor

    amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntry

    Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor

    clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitSignature, visitSourceFile, visitSynthetic, visitUnknown

    Methods inherited from class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.apache.bcel.classfile.Visitor

    visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
  • Field Details

    • bloatableSigs

      private static final Set<String> bloatableSigs
    • nonBloatableSigs

      private static final Set<String> nonBloatableSigs
    • decreasingMethods

      private static final Set<String> decreasingMethods
    • increasingMethods

      private static final Set<String> increasingMethods
    • mapSubsets

      private static final Set<String> mapSubsets
    • javaxJaxbNewInstance

      private static final FQMethod javaxJaxbNewInstance
    • jakartaJaxbNewInstance

      private static final FQMethod jakartaJaxbNewInstance
    • specialAnnotations

      private static final Set<String> specialAnnotations
    • bugReporter

      private final edu.umd.cs.findbugs.BugReporter bugReporter
    • bloatableCandidates

      private Map<edu.umd.cs.findbugs.ba.XField,edu.umd.cs.findbugs.FieldAnnotation> bloatableCandidates
    • bloatableFields

      private Map<edu.umd.cs.findbugs.ba.XField,edu.umd.cs.findbugs.FieldAnnotation> bloatableFields
    • stack

      private edu.umd.cs.findbugs.OpcodeStack stack
    • methodName

      private String methodName
    • threadLocalNonStaticFields

      private Set<edu.umd.cs.findbugs.FieldAnnotation> threadLocalNonStaticFields
    • userValues

      private Map<Integer,edu.umd.cs.findbugs.ba.XField> userValues
    • jaxbContextRegs

      private Map<Integer,Integer> jaxbContextRegs
    • isPrivateMethod

      private boolean isPrivateMethod
    • isSpecialAnnotationMethod

      private Boolean isSpecialAnnotationMethod
  • Constructor Details

    • PossibleMemoryBloat

      public PossibleMemoryBloat(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a PMB detector given the reporter to report bugs on
      Parameters:
      bugReporter - the sync of bug reports
  • Method Details

    • visitClassContext

      public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
      collects static fields that are likely bloatable objects and if found allows the visitor to proceed, at the end report all leftover fields
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the class context object of the currently parsed java class
    • reportThreadLocalBugs

      private void reportThreadLocalBugs()
    • reportMemoryBloatBugs

      private void reportMemoryBloatBugs()
    • parseFields

      private void parseFields(edu.umd.cs.findbugs.ba.ClassContext classContext)
    • visitMethod

      public void visitMethod(org.apache.bcel.classfile.Method obj)
      implements the visitor to collect the method name
      Specified by:
      visitMethod in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitMethod in class edu.umd.cs.findbugs.visitclass.BetterVisitor
      Parameters:
      obj - the context object of the currently parsed method
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      implements the visitor to reset the opcode stack
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
      Parameters:
      obj - the context object of the currently parsed code block
    • sawOpcode

      public void sawOpcode(int seen)
      implements the visitor to look for methods that empty a bloatable field if found, remove these fields from the current list
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode of the currently parsed instruction
    • removeFieldsThatGetReturned

      protected void removeFieldsThatGetReturned()
    • checkMethodAsDecreasingOrIncreasing

      protected void checkMethodAsDecreasingOrIncreasing(edu.umd.cs.findbugs.ba.XField field)
    • specialAnnotationMethod

      private boolean specialAnnotationMethod()