【前言】
随着手机APP的升级,手机的内存也越来越大,在有限的内存空间里存放更多的数据,成为了对developer的挑战,接下来我会介绍一下内存中最常使用的几种算法,并剖析一下适合的使用场景。
由于鄙人知识浅薄,在这里仅分析ZRAM中使用的压缩算法,收集于大神,在这里做总结:
1. ZRAM是linux的一种内存优化技术,基本工作原理是:通过划定一片区域,
将压缩过后的硬盘数据放入该区域,以实现高速读取。
2.zram是把RAM划分一部分出来作为swap使用,zram是内存压缩,所有写入内
存的东西都会经过压缩,会少量增加CPU负担
3.swap是交换分区,类似于Windows的虚拟内存,就是当内存不足的时候,把
一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况,swap是把
flash划分一部分出来作为swap使用。
4. 利用zRAM并不是减小Android的内存占用,而是通过zRAM来提供交换空间,
从而在内存紧张时释放出更多的可用内存,同时又避免传统的交换到文件系统的开销。
5. ZRAM SWAP
【压缩算法】
查看手机目前收集中支持的ZRAM压缩算法:
cat sys/block/zram0/comp_algorithm
lzo [lzo-rle] lz4 zstd
压缩方案
- Bzip2
bzip2是Julian Seward开发并按照自由软件/开源软件协议发布的数据压缩算法及程序。Seward在1996年7月第一次公开发布了bzip2 0.15版,在随后几年中这个压缩工具稳定性得到改善并且日渐流行,Seward在2000年晚些时候发布了1.0版。bzip2比传统的gzip的压缩效率更高,但是它的压缩速度较慢。
- Deflater
DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法,DEFLATE压缩与解压的源代码可以在自由、通用的压缩库zlib上找到,zlib官网:http://www.zlib.net/ jdk中对zlib压缩库提供了支持,压缩类Deflater和解压类Inflater,Deflater和Inflater都提供了native方法。
- Gzip
gzip的实现算法还是deflate,只是在deflate格式上增加了文件头和文件尾,同样jdk也对gzip提供了支持,分别是GZIPOutputStream和GZIPInputStream类,同样可以发现GZIPOutputStream是继承于DeflaterOutputStream的,GZIPInputStream继承于InflaterInputStream,并且可以在源码中发现writeHeader和writeTrailer方法。
- Lz4
LZ4是一种无损数据压缩算法,着重于压缩和解压缩速度。
- Lzo
LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写,这个算法是无损算法。
- Snappy
Snappy(以前称Zippy)是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,并在2011年开源。它的目标并非最大压缩率或与其他压缩程序库的兼容性,而是非常高的速度和合理的压缩率。