Java的缓存与缓冲区

来源:互联网 发布:js获取另一个页面的id 编辑:程序博客网 时间:2024/05/19 04:54

编写高效的程序不止在于算法的精巧,还要尽可能贴合计算机的硬件,最大化硬件效益,最佳利用CPU微指令、缓存等。其中缓存的意义可见重要。

缓存的主要作用是暂时保存数据,供下次访问时使用。

出现背景

早期的存储层次只有三层,CPU寄存器、DRAM、磁盘存储。由于寄存器与主存之间的访问时间开销较大,于是就加入了L1缓存(2 ~ 4个时钟周期),后来L1与主存之间差距依旧很大,于是又加入L2和L3。

缓存要求

缓存内部是以组的形式存在和组织的,缓冲行是缓存中可以分配的最小存储单位,缓存行是缓存的最小操作单位。
缓存一致性问题:各个处理核心之间遵从一些协议,在运行时需要用这些协议保持数据一致性,这些协议包括:MSI、MESI、MOSI、Synapse、Firely、DragonProtocol等。

Java中最首当其冲的的缓存——持久层缓存

实现Java缓存最简单的方法应该就是static HashMap了,它是基于内存的缓存,一个Map可以被用来存储引用对象的缓存。为了区分缓存的数据,对象的有效性和生命周期是个非常重要的问题。如果该问题没有很好地解决,内存的使用就会非常不合理。对象的生命周期可以用弱引用、轻引用和虚引用来控制,这三种有别于强引用,是与JVM相关的,内存不足就会回收。

Java中最常见的缓存——对象池

对象池化是一种很重要的系统优化技术。其原理是:对于经常使用的对象,可以创建一个包含数个已经创建好的该类对象的集合,之后当需要这个对象时,直接从池中取一个,并且在用完时返回给这个池就可以了。典型的就是线程池和数据库连接池:线程的创建很耗资源,于是就创建了线程池;数据库连接池可能涉及网络连接,开销更大,池的存在更有意义(C3P0\Proxool)。

缓存也要注意应用场景,适合最好

缓存用的好当然会带来较大的性能提升,但用的不好,反而会降低性能。比如说Hibernate的性能理论上讲不如JDBC,但缓存机制用的较好,对象的有效性较高,缓存的命中率高,继而性能高。

推荐Java的缓存框架

  1. Ehcache——Java分布式缓存框架
  2. Cacheonix——高性能Java分布式缓存系统
  3. ASimpleCache——轻量级Android缓存
  4. JBossCache——基于事务的Java缓存框架
  5. Voldemort——基于键值的缓存框架

Java同步IO和NIO

1.同步IO:字节型IO,一般无缓冲区,阻塞式IO
2.异步IO:数据包型IO,有缓冲区来承载字节,满了发出

Java缓冲区的创建

1.静态方法:allocate(int size)
2.静态方法:wrap(byte[] array)
3.带缓冲区的流在执行最后必须需要刷新,否则数据不会写入硬盘。