Shark

1.LeakNodeStatus 三个状态,没用到

internal enum class LeakNodeStatus {
  NOT_LEAKING,
  LEAKING,
  UNKNOWN;
}

2.HeapAnalysisException 封装throwable

class HeapAnalysisException(cause: Throwable) : RuntimeException(cause) {

  override fun toString(): String {
    val stringWriter = StringWriter()
    cause!!.printStackTrace(PrintWriter(stringWriter))
    return stringWriter.toString()
  }

  companion object {
    private const val serialVersionUID: Long = -2522323377375290608
  }
}

3.AppSingletonInspector App范围内的单例,标记为不泄漏

/**
 * Inspector that automatically marks instances of the provided class names as not leaking
 * because they're app wide singletons.
 * 检查器,自动将提供的类名的实例标记为不泄漏,因为它们是应用程序范围的单例。
 *
 */
class AppSingletonInspector(private vararg val singletonClasses: String) : ObjectInspector {

    //检查
    override fun inspect(
            reporter: ObjectReporter//todo ObjectReporter是干哈的
    ) {
        if (reporter.heapObject is HeapInstance) {
            reporter.heapObject.instanceClass
                    .classHierarchy//他自己的类+父类
                    .forEach { heapClass ->
                        if (heapClass.name in singletonClasses) {
                            reporter.notLeakingReasons += "${heapClass.name} is an app singleton"
                        }
                    }
        }
    }
}

4.MetadataExtractor 元数据提取器接口

/**
 * Extracts metadata from a hprof to be reported in [HeapAnalysisSuccess.metadata].
 *
 * This is a functional interface with which you can create a [MetadataExtractor] from a lambda.
 * 从 [HeapAnalysisSuccess.metadata] 分析成功的 hprof 中提取元数据。
 * 这是一个功能接口,您可以使用它从 lambda 创建 [MetadataExtractor]。
 */
fun interface MetadataExtractor {
  fun extractMetadata(graph: HeapGraph): Map<String, String>

  companion object {

    /**
     * A no-op [MetadataExtractor]
     */
    val NO_OP = MetadataExtractor { emptyMap() }

    /**
     * Utility function to create a [MetadataExtractor] from the passed in [block] lambda instead of
     * using the anonymous `object : MetadataExtractor` syntax.
     *
     * Usage:
     *
     * ```kotlin
     * val inspector = MetadataExtractor { graph ->
     *
     * }
     * ```
     */
    inline operator fun invoke(crossinline block: (HeapGraph) -> Map<String, String>): MetadataExtractor =
      object : MetadataExtractor {
        override fun extractMetadata(graph: HeapGraph): Map<String, String> = block(graph)
      }
  }
}

5.LeakingObjectFinder查找泄漏的对象id们

/**
 * Finds the objects that are leaking, for which Shark will compute
 * leak traces.
 *
 * This is a functional interface with which you can create a [LeakingObjectFinder] from a lambda.
 * 查找泄漏的对象,Shark 将为其计算泄漏跟踪。 
 * 这是一个函数式接口,您可以使用它从 lambda 创建 [LeakingObjectFinder]。
 */
fun interface LeakingObjectFinder {

  /**
   * For a given heap graph, returns a set of object ids for the objects that are leaking.
   * 对于给定的堆图,返回一组泄漏对象的对象 ID。
   */
  fun findLeakingObjectIds(graph: HeapGraph): Set<Long>

  companion object {
    /**
     * Utility function to create a [LeakingObjectFinder] from the passed in [block] lambda
     * instead of using the anonymous `object : LeakingObjectFinder` syntax.
     *
     * Usage:
     *
     * ```kotlin
     * val listener = LeakingObjectFinder {
     *
     * }
     * ```
     */
    inline operator fun invoke(crossinline block: (HeapGraph) -> Set<Long>): LeakingObjectFinder =
      object : LeakingObjectFinder {
        override fun findLeakingObjectIds(graph: HeapGraph): Set<Long> = block(graph)
      }
  }
}

6.FilteringLeakingObjectFinder通过扫描堆转储中的所有对象并将决策委托给[FilteringLeakingObjectFinder.LeakingObjectFilter]列表来查找泄漏的对象

/**
 * Finds the objects that are leaking by scanning all objects in the heap dump
 * and delegating the decision to a list of [FilteringLeakingObjectFinder.LeakingObjectFilter]
 * 通过扫描堆转储中的所有对象并将决策委托给[FilteringLeakingObjectFinder.LeakingObjectFilter]列表来查找泄漏的对象
 */
class FilteringLeakingObjectFinder(private val filters: List<LeakingObjectFilter>) :
  LeakingObjectFinder {

  /**
   * Filter to be passed to the [FilteringLeakingObjectFinder] constructor.
   * 要传递给[FilteringLeakingObjectFinder]构造函数的筛选器。
   */
  interface LeakingObjectFilter {
    /**
     * Returns whether the passed in [heapObject] is leaking. This should only return true
     * when we're 100% sure the passed in [heapObject] should not be in memory anymore.
     * 返回传入的[heapObject]是否泄漏。只有当我们100%确定传入的[heapObject]不应再在内存中时,才会返回true。
     */
    fun isLeakingObject(heapObject: HeapObject): Boolean
  }

  override fun findLeakingObjectIds(graph: HeapGraph): Set<Long> {
    return graph.objects
      .filter { heapObject ->
        filters.any { filter ->//any表示至少有一个
          filter.isLeakingObject(heapObject)
        }
      }
      .map { it.objectId }
      .toSet()
  }
}

7.ObjectInspector为 LeakCanary 提供 堆中对象(类、实例和数组)更多的信息。

/**
 * Provides LeakCanary with insights about objects (classes, instances and arrays) found in the
 * heap. [inspect] will be called for each object that LeakCanary wants to know more about.
 * The implementation can then use the provided [ObjectReporter] to provide insights for that
 * object.
 *
 * 为 LeakCanary 提供 堆中对象(类、实例和数组)更多的信息。
 * LeakCanary可以调用[inspect]方法,了解对象更多的信息。
 * 实现类可以使用提供的 [ObjectReporter] 来提供该对象的信息。
 *
 * This is a functional interface with which you can create a [ObjectInspector] from a lambda.
 */
fun interface ObjectInspector {

  /**
   * @see [ObjectInspector]
   */
  fun inspect(reporter: ObjectReporter)//todo ObjectReporter干哈的

  companion object {
    /**
     * Utility function to create a [ObjectInspector] from the passed in [block] lambda instead of
     * using the anonymous `object : OnHeapAnalyzedListener` syntax.
     *
     * Usage:
     *
     * ```kotlin
     * val inspector = ObjectInspector { reporter ->
     *
     * }
     * ```
     */
    inline operator fun invoke(crossinline block: (ObjectReporter) -> Unit): ObjectInspector =
      object : ObjectInspector {
        override fun inspect(
          reporter: ObjectReporter
        ) {
          block(reporter)
        }
      }
  }
}

上一篇:TensorFlow基础概念之模型Graph


下一篇:Intel TBB 开发指南 6 Graph Application Categories