Giter VIP home page Giter VIP logo

awesomearticles's Introduction

AwesomeArticles

收集最好的技术文章

具体原则:

Note: 文章较多,没有生成目录,建议配合插件Smart TOC - Chrome 网上应用店使用

Dart

作者:deng-dev 时间:2018-01 来源:个人博客

从 Dart 的起源以及发展的历史做了简单的回顾,并对 Dart 的优势进行了分析,如果想要了解 Dart, 这篇文章一定有你想要的。


系列文章

作者:itscoder 时间:2017-2018 集体博客

一群技术爱好者的 WeeklyBlog,质量不错,可惜现在已经不更新了


作者:wingjay 时间:时间:2017-04/05 个人博客

原文:http://tutorials.jenkov.com/java-concurrency/index.html

文风不错,有深度,有思考


作者:胡凯 时间:2010-03-16 来源:个人博客

性能优化的方方面面,在这里大概都讲到了。


作者:GcsSloop 时间:2016-01-05 来源:个人博客

详细的自定义 View 教程,从0到1,带你了解自定义 View 的方方面面。


作者:Chuckiefan 时间:2017-06-07 来源:简书

把国外一个讲解 Architecture Components 系列的文章进行了翻译,其中涉及了 LiveData、Room 等新知识点的详细介绍,翻译的不错


作者:张坤等 时间:2013-10-07 并发编程网

原文:http://tutorials.jenkov.com/java-concurrency/index.html

Java 并发编程指南的一个翻译版本系列,很完整的一个系列


Java

作者:美团技术团队 2020-04-02

美团技术博客出品,流程图画的不错


作者:CSDN - 个人空间 2016-09-21

从 CPU、RAM 硬件模型到线程内存模型,从源头分析了多线程中的问题,对理解 volatile、synchronized 的核心原理非常有帮助


作者: 地铁程序员 2018-07-09

从汇编语言讲起,对理解 CPU 寄存器、高度缓存很有帮助。


作者:Maaz - Hacker Noon 时间:2017-06 来源:掘金翻译

很直白把 LogN 将明白了


作者:Se Hoon Park 时间:2017-05-30 来源:国外博客

非常详细的讲解了jvm的宏观概念,同时还把jvm内部的细节通过代码方式逐一做了详细的说明,文章有点长。


标签:JVM


作者:千年道士 时间:2017-12-03 来源:CSDN

你可能经常使用 HashMap,但是你未必了解 HashMap 一个重要的概念: map 中 key 对应的 hash 算法是干吗的,另外为什么 HashMap 的初始容量为 16,这里面有什么学问,以及认真分析了并发条件下,HashMap 可能会出现回路环的问题。

标签:HashMap


作者:海子 时间:2014-08-22 来源:ImportNew

作者围绕 volatile 关键字把 Java 内存模型以及 Java 运算中的原子性,可见性,有序性有非常深入的分析了一下,读完文章会让你对主内存、工作内存从硬件和软件层面都会有一个非常好的认识。


作者:李前 时间:2016-06-24 来源:公众号

见过对 HashMap 分析最透彻的一篇文章了,HashMap 作为面试高频考点,读这篇文章没错!


作者:李大辉 时间:2016 来源:极客学院

LinkedHashMap 讲的非常有条理,通俗易懂的好文章。


作者:WalkingInTheWind 时间:2012-04-21 来源:CSDN

文中对常见的链表面试问题都有相应的解答,代码是用 C 实现的,但重在思路。


作者:openpk 时间:2010-03-16 来源:CSDN

比较久的一篇文章了,但是对 Synchronize 关键字的解释非常到位,用上厕所的比喻来解释线程同步的概念,例子非常鲜活,好文章。


作者:Jark 时间:2014-08-28 来源:个人博客

对单例模式的异同点,为什么这样写都有很好的描述和解答,非常不错的文章。


Android

作者:OPPO 互联网技术 的个人主页 时间:2020-03-05 来源:掘金

对 OKHTTP 进行结构拆分,没有粘贴大量的代码。阅读体验不错。


作者:前行的乌龟 时间:2019-03-28 来源:简书

协程与线程的区别讲的很明白。


作者:甜菜波波 - 博客园

mark 标签:红黑树


作者:Instagram Engineering 来源 Instagram Engineering

简单直白的把 TextView 的性能问题做了分析并给出了解决方法 TextLayoutCache,另外简书一篇文章也不错 TextView性能瓶颈,渲染优化,以及StaticLayout的一些用处 - 简书


作者:Android 官方 来源 官网

官方文档永远是一手资料,Service 的文档写的尤其好。


作者:CPPAlien - 彭涛的博客 时间:2016.09.22 来源:简书

对 Android 混淆由浅入深的讲解,细致且全面,好评。


作者:凶残的程序员 时间:2017.11.17 来源:公众号

由 Handler 展开分析了不少,尤其对 Looper.loop() 分析摘录很棒,文中的链接也很有价值


作者:黑羽 时间:2019.08.29 来源:InfoQ

沉浸式说的很明白,尤其对不同版本的差异说的很清楚。


作者:anly_kun 时间:2016.07.31 来源:简书

对照官方文档按个验证了 Intent.Flag 的不同属性,尽信书则不如无书,官方文档一些描述确实需要更新了


作者:Allen 时间:2016-11-06 来源:个人博客

十分全面的讲解了 Android 中 .so 文件的相关内容。


作者:freddyyao 时间:2017-08-03 来源:腾讯 bugly 

对 Android 6,0之前的权限适配讲解很棒。


作者:黄宁源 时间:2016-10-27 来源:腾讯 bugly 

RecycleView 的缓存机制很重要,也是区别于 ListView 最大的地方,这篇文章图文并茂的讲解了两者的区别,值得反复阅读,同时如作者所言 结合源码食用更佳。,另外这篇可以跟 RecyclerView 必知必会 一起阅读,可能收获更多。


作者:腾讯 天天P图团队——damonxia(夏正冬),Android工程师 时间:2017-01-05 来源:腾讯 bugly 

从使用层面讲,这一篇几乎涵盖了 RecycleView 的方方面面,包括 LayoutManage、Divider 等知识的讲解,很细致。


作者:Weishu 时间:2016-01-12 来源:个人博客  

关于 Binder 的介绍很细致,值得反复阅读。


作者:zFxiang_ 时间:2016-10-29 来源:简书  

深入浅出 Dagger2 ,讲的非常棒!Dagger2 的诸多点都讲到了,而且关联的特别好!


作者:工匠若水 时间:2015-08-09 来源:CSDN  

对 Android 动画的使用做了详尽的介绍,文中没有关于动画的原理做介绍,但是对于整个 Android 动画的几种使用方式概括的非常全面,包括一些很小众的动画技巧也有提到,不过动画还是要靠不断的练习才能更上一层楼。


作者:ConnorLin 时间:2016-04-21 来源:简书  

条理清晰,对 notification 的使用做了方方面面的讲解,一篇好教程。


作者:GcsSloop 时间:2016-11-02 来源:个人博客

对 ACTION_CANCEL 和 ACTION_OUTSIDE 的讲解尤其精辟


作者:澳特慢 时间:2016-05-02 来源:简书

对 ContentProvider 的作用以及在 Android 中的地位描述很恰当,另外在使用说明也比较详细。个人平时使用 ContentProvider 还是做跨进程数据同步多一点,因为 SharePreference 在跨进程情景下不可靠,所以包装 ContentProvider 后会特别合适,具体的实现可以参看 tray


作者:absfree 时间:2016-11-07 来源:简书

Window PhoneWindow 概念描述的很清楚。


作者:shwenzhang 时间:2016-12-15 来源:公众号

尽管是15年的文章了,但是涵盖的内容还是非常全面的,尤其是微信对待问题的态度,还有处理内存问题的方式都很值得学习。从文章中可以学到他们他们对问题追踪的一些实践经验。


作者:张兴华 时间:2016-08-11 来源:公众号

如文章名字一样,一点都不标题档,文章很有条理。从进程优先级说起,然后讲了各种保活方式,更难能可贵的是对不同保活方式在不同 Android 版本上的表现也做了说明。


作者:尹star 时间:2016-05-31 来源:简书

讲的很透彻,读完后你会对 Activity 的启动模式,任务栈有更深的了解。


作者:Flyzend 时间:2017-05-22 来源:简书

文风诙谐,分析有理,喜欢这样的文章。


作者:Carson_Ho 时间:2016-01-06 来源:简书

图文并茂,非常有条理,了解事件分发,只此一篇文章即可,不用多找。另外作者的一些其他文章貌似也不错。


作者:Carson_Ho 时间:2016-04-30 来源:简书

Handler 的方方面面都说到了,描述很精准,深度好文。    


作者:YoKey 时间:2016-02-27 来源:简书

对 Fragment 中的各种 bug 做了解释,并提供了解决方案,良心作者。


网络

  作者:阮一峰 时间:2016-08-19 来源:个人博客  

Http 协议很庞大,但是作者从历史发展谈起,从简单到复杂,循序渐进,作为对 Http 协议的入门了解,这篇文章非常不错。


前端

  作者:阮一峰 时间:2015-07-10 来源:个人博客  

自己接触前端页面挺早,但是对前端的布局不感冒,跟客户端布局相比,总觉得前端布局比较麻烦,各种 CSS 属性,直到遇到了 Flex 布局,之前就看过阮老师的这篇文章,通俗易懂,非常不错。


后端

  作者:ScienJus 时间:2016-04-03 来源:个人博客  

作者应该是个后端工程师,文章列举了自己开发过程中总结出的 Restful API 最佳实践,很实用。


About

咕咚

你可以通过下面的方式联系到我,欢迎关注。

公众号 - 大侠咕咚

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垃圾回收不会回收应用的物理资源,只回收堆内存对象所占用的内存

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 虚拟机)。

主流 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很像”更合适。

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.