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的缓存框架
- Ehcache——Java分布式缓存框架
- Cacheonix——高性能Java分布式缓存系统
- ASimpleCache——轻量级Android缓存
- JBossCache——基于事务的Java缓存框架
- Voldemort——基于键值的缓存框架
Java同步IO和NIO
1.同步IO:字节型IO,一般无缓冲区,阻塞式IO
2.异步IO:数据包型IO,有缓冲区来承载字节,满了发出
Java缓冲区的创建
1.静态方法:allocate(int size)
2.静态方法:wrap(byte[] array)
3.带缓冲区的流在执行最后必须需要刷新,否则数据不会写入硬盘。
- Java的缓存与缓冲区
- 关于磁盘缓存与磁盘缓冲区的理解与延伸
- Java输入输出流与缓冲区的使用
- Java输入输出流与缓冲区的使用
- java流与缓冲区
- 磁盘的缓存和磁盘的缓冲区
- 缓冲、缓冲区、缓存三者的区别
- LINUX使用的缓存,缓冲区高速缓存
- java 字节流与字符流的区别(缓冲区)
- Java NIO之 直接缓冲区与非直接缓冲区
- Java NIO直接缓冲区与非直接缓冲区区别
- Java NI/O 直接缓冲区与非直接缓冲区
- Java-NIO(三):直接缓冲区与非直接缓冲区
- Java里清空缓冲区的方法
- 数据库缓冲区缓存
- 2.5 SGA-缓冲区缓存
- Buffer cache(缓冲区缓存)
- Java新IO_缓冲区与Buffer
- 面向对象OOA、OOD、OOP
- SSL工作原理
- android7.0 开机后立刻恢复出厂设置,偶尔会失败
- 网页布局四之jQuery-easyUI的datagrid的基本应用
- iOS fmdb及工具MesaSQLite的使用
- Java的缓存与缓冲区
- sudo chown -R $(jianan) /usr/local
- 数据结构练习题5
- 判断定位服务是否开启(手机上位置信息按钮开关)
- mybatis的输入输出
- 从输入 URL 到页面展示,到底发生了什么
- NestedScrollView嵌套RecyclerView时滑动不流畅问题的解决办法
- easyUI数据网格 简写
- bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡