Java — 关于垃圾收集灵魂拷问三连(二)

前言

在上一篇,我们着重介绍了收集算法,这一篇是本系列的第二篇,着重讲新老年代的划分,然后顺势就介绍多个垃圾收集器。如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。我们还是按照《深入理解Java虚拟机》里面使用的例子,同时我再参考一些优秀的博文来更好的阐述垃圾收集器。参考的博文会放在最后,希望我们大家都尊重原创,感谢各位的无私奉献。

再多说几句,在上一篇中,我们说到现在商业虚拟机的垃圾回收都是采用分代收集算法,而分代说的就是新生代和老年代。说到这,我们就要讲讲堆内存的分配区域。

emmmm,上次忘说了,圣诞快乐!

more >>


Java — 垃圾收集灵魂拷问三连(一)

前言

说到GC,一直没有系统的看过。但是,很显然,是一个非常经典的知识点。毫不夸张的说,面试的时候问道GC而你一无所知的话,基本上是凉了。

今天拜读了JVM经典书《深入理解Java虚拟机》,对于GC讲的很详细。书中在第三章讲的是垃圾收集器与内存分配策略,我准备分三篇文章来记录这章的读书笔记,本篇介绍一下垃圾回收流程,第二篇介绍垃圾收集器,第三篇介绍新老生代的划分以及内存分配策略。本篇更偏向于理论和算法思想,所以看起来还是很有趣的。值得注意的是,我们只有在程序处于运行期间才知道创建了哪些对象,这部分内存的分配和回收是动态的,垃圾收集关注的也是这部分内存。学习GC通俗来说也就三个问题:

  1. 哪些内存需要回收?
  2. 什么时候回收?
  3. 如何回收

下面,我们也根据这三个问题来逐步了解GC。

more >>


Android — BufferKnife的使用

简介

又是JakeWharton的另一杰作 — ButterKnife ,是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。目前使用很广,而且,几乎对应用性能无消耗,使用也很简单。注入解放双手,谁用谁知道!

官网:https://github.com/JakeWharton/butterknife

AS插件

Android ButterKnife Zelezny 搜搜就有了,搭配插件使用更佳。

详细参考

https://www.jianshu.com/p/2967d0342d80

最后

我想把平时学习过程中的一些知识点以及用到的第三方类库、框架做成一个思维导图,放在了https://github.com/Omooo/MindMap


Bitmap的加载和Cache(二)— 缓存策略

前言

ImageLoader系列第二篇,也是实现一个ImageLoader的核心。总体思想如下:当程序第一次从网上加载图片后,就将其缓存到设备上,这样下次使用这张图片的时候就不用从网络上重新下载,这样就为用户节省了流量。很多时候为了提高应用的用户体验,往往还会在内存中缓存一份,这样当应用打算显示一张图片,首先会从内存中获取,如果内存中没有就从存储设备获取,存储设备没有,就从网上获取。这是因为从内存中加载图片比从存储设备上加载图片要快,这样不仅提高了程序的效率又为用户节省了不必要的流量开支。

缓存策略包含缓存的添加、获取和删除。添加和获取很好理解,删除是因为缓存的大小是有限制的,当缓存容量满时,程序又要添加缓存,这个时候就要删除已有的缓存。如何定义缓存的新旧就是一种策略,不同的策略对应不同的缓存算法。目前比较常用的缓存算法是LRU(Least Recently Used),即近期最少使用算法。采用LRU算法的缓存有两种:LruCache和DiskLruCache。LruCache用于实现内存缓存,而DiskLruCache用于实现磁盘缓存。

下面就开始慢慢享受精神食粮。

more >>


Bitmap的加载和Cache(一)— Bitmap的高效加载

前言

准备写一个系列,来逐步实现一个ImageLoader。图片加载一直都是Android知识体系的重点,因为内存的限制,我们要对图片进行压缩,防止OOM。又因为网络的限制,我们需要对图片进行缓存,避免无所谓的流量消耗。图片的显示实际上都是bitmap实现的,所以本篇文章主要讲解怎么高效加载一个Bitmap。

一般加载

在介绍Bitmap的高效加载之前,我们先说一下如何加载一个Bitmap。Bitmap在Android中指的是一张图片,可以是png也可以是jpg等其他图片格式。那么如何加载一张图片呢?BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream、decodeArray。分别支持从文件系统、资源、输入流和字节数组加载出一个Bitmap对象,其中decodeFile和decodeResource又是间接调用了decodeStream方法,这四类方法最终是在Android底层实现的。

高效加载

那么如何高效的加载图片呢?核心思想也很简单,那就是采用BitmapFactory.Options来加载所需尺寸的图片。这里假设通过ImageView来显示图片,很多时候ImageView并没有图片的原始尺寸那么大,这个时候把原图直接加载进来显然有点多余,因为ImageView并没有办法显示原始照片。这时候可以通过BitmapFactory.Options就可以按一定采样率来加载缩小后的图片,将压缩后的图片设置给ImageView,这样就会降低内存占用从而在一定程度上避免OOM,提高了BItmap加载时的性能。BitmapFactory提供的加载图片的四种方法都支持BitmapFactory.Option参数,通过它就可以很方便的对一张图片进行采样缩放。

通过BitmapFactory.Options来缩放图片,主要是用到了它的inSampleSize参数,即采样率。当inSampleSize为1时,采样后的图片为图片的原始大小;当inSampleSize为2时,那么采样后的图片其宽和高均为原图大小的1/2,而像素数为原图的1/4,其占用内存也为原图的1/4。拿一张1024 1024像素的图片来说,假定采用ARGB8888格式存储,那么它占用的内存为 1024 1024 * 4,即4M,如果inSampleSize为2,那么采样后的的图片占用内存只有1M。可以看出,只有当inSampleSize大于1才会有缩放效果。有一种特殊情况,当inSampleSize小于1时,其作用相当于1,即无缩放效果。inSampleSize的取值应该总是2的指数,比如1、2、4、8、16等等。如果外界传递inSampleSize的值不是2的指数,那么系统会向下取整并选择一个最接近2的指数来替代。

more >>

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?