Giter Site home page Giter Site logo

awesomearticles's People

Contributors

maoruibin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

awesomearticles's Issues

垃圾回收

  • JAVA垃圾回收不会回收应用的物理资源,只回收堆内存对象所占用的内存

主流 JAVA 虚拟机

主流 JAVA 虚拟机

  • HotSpot VM
  • J9 VM
  • Zing VM

HotSpot

HotSpot VM是绝对的主流。Oracle JDK、 Sun JDK、OpenJDK的各种变种(例如IcedTea、Zulu),用的都是相同核心的HotSpot VM。

这里如果你对 JDK 和 VM 区分不是很清楚的话,移步到 JDK 与 JVM 以及 JRE 的关系 #2

J9

J9是IBM开发的一个高度模块化的JVM。
在许多平台上,IBM J9 VM都只能跟IBM产品一起使用。这不是技术限制,而是许可证限制。

Zing

Zing VM是一个从Sun HotSpot VM fork出来的一个高性能JVM,可以运行在Linux/x86-64平台上。Azul为它重新写了一套GC,也修改了VM内的许多实现细节,所以从我们自己的角度看,与其说它是HotSpot VM的一个变种,还不如把它看作“一个全新的JVM、只是凑巧与HotSpot VM很像”更合适。

Android 内存泄漏检测工具 LeakCanary 原理分析

LeakCanary 在 Application 中安装完成后,它会注册对应用内所有 Activity 生命周期的监听,具体监听的原理在于 Application 的 registerActivityLifecycleCallbacks 方法,该方法可以对应用内所有 Activity 的生命周期做监听。追踪 LeakCanary 的 install 方法就可以找到具体的设置地方,最终发现对应的监听设置代码在 ActivityRefWatcher 类的 watchActivities 方法中,如下所示:

  public void watchActivities() {
    // Make sure you don't get installed twice.
    stopWatchingActivities();
    //注册 Activity 生命周期监听
    application.registerActivityLifecycleCallbacks(lifecycleCallbacks);
  }

这里的 lifecycleCallbacks 是一个监听的简单实现,但是这个实现只对 Activity 的销毁回调做了监听处理,如下所示

  private final Application.ActivityLifecycleCallbacks lifecycleCallbacks =
      new Application.ActivityLifecycleCallbacks() {
        @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        }

        @Override public void onActivityStarted(Activity activity) {
        }

        @Override public void onActivityResumed(Activity activity) {
        }

        @Override public void onActivityPaused(Activity activity) {
        }

        @Override public void onActivityStopped(Activity activity) {
        }

        @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        }

        @Override public void onActivityDestroyed(Activity activity) {
          ActivityRefWatcher.this.onActivityDestroyed(activity);
        }
      };

从上已经可以知道,LeakCanary 是如何无侵入的监听每一个 Acitivity 的死亡回调的,接着继续看 onActivityDestroyed 方法:

void onActivityDestroyed(Activity activity) {
    refWatcher.watch(activity);
}
public void watch(Object watchedReference) {
    watch(watchedReference, "");
}
public void watch(Object watchedReference, String referenceName) {
    if (this == DISABLED) {
      return;
    }
    checkNotNull(watchedReference, "watchedReference");
    checkNotNull(referenceName, "referenceName");
    final long watchStartNanoTime = System.nanoTime();
    String key = UUID.randomUUID().toString();
    retainedKeys.add(key);
    final KeyedWeakReference reference =
        new KeyedWeakReference(watchedReference, key, referenceName, queue);

    ensureGoneAsync(watchStartNanoTime, reference);
}

这时 ActivityRefWatcher 会把对应的 activity 实例关联包装为一个自定义的弱引用(KeyedWeakReference),但是这里在指定弱引用时,LeakCanary 同时还为这个弱引用指定了一个 ReferenceQuery 队列,具体精简代码如下所示

// 队列
ReferenceQueue queue = new ReferenceQueue<>();
// KeyedWeakReference 为 LeakCanary 自定义的软引用( 就是简单继承了 WeakReference )
// watchedReference 就是 Activity 
KeyedWeakReference reference = new KeyedWeakReference(watchedReference, queue);

这个队列很重要,它是 WeakReference 的第二个构造参数,可能平时我们都没有关心它,它用于存放一些将来要做可达性分析的对象。下面是 ReferenceQuery 的文档介绍

Reference queues, to which registered reference objects are appended by the garbage collector after the appropriate reachability changes are detected.

分析到这里,LeakCanary 的原理就很简单了,会在检测到 Activity 的 onDestory 时主动GC,触发WeakReference 被GC,同时检测 GC 前后,ReferenceQueue 是否包含被监听对象;如果不包含,则说明该对象没有被GC,一定存在到 GC Roots 的强引用链,也就是发生了泄漏。

接着 LeakCanary 会使用 Square 开源库 haha 来分析Android heap dump文件,并把最终结果通过通知的方式显示在通知栏。

这就是 LeakCanary 工作的大致原理。

JDK 与 JVM 以及 JRE 的关系

JDK 与 JVM 以及 JRE 的关系

在说 JDK 与 JVM 的关系前,先说说 JDK 与 JRE 之间的关系。
JDK 是 Java 开发工具包,如果你要开发 Java 程序,总得使用 Java 提供的 API 进行开发吧,JDK 就是我们开发 Java 程序的工具。

JDK 包含 JRE。JRE 是 Java 程序的运行时环境,也就是说,他是运行 Java 程序的一个环境。

我们都知道,Java 字节码的运行需要在 JVM 中完成,所以 JRE 必定包含一个 JVM(Java 虚拟机)。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.