9、读写缓冲区:
1、public byte get():顺序读取缓冲区的一个字节,position会加一
2、public Buffer get(byte[]dst):将缓冲区中的数据读入到数组dst中,并适当的移动position
3、public byte get(int index):得到第index个字节,但不移动posoiion
4、public ByteBuffer put(byte b):将字节b放入到缓冲区中,并移动position
5、public ByteBuffer put(int index,byte b):将字节b放到缓冲区的index位位置
6、pubglic final ByteBuffer(byte[]src):将字节数组src放到缓冲区中。
10、标志缓冲区:类似于一个书签的功能,在数据的处理过程中,可随时记录当前位置。然后在任意时刻,回到这个位置。Mark用于记录当前位置,reset用于恢复到mark所在的位置、
11、复制缓冲区:使用Buffer的duplicate方法可以复制一个缓冲区,副本缓冲区和原缓冲区共享一份空间但是有有着独立的position、capacity和limit值。
20、缓冲区分片:缓冲区分片使用slice方法实现。它将在现有的缓冲区中,创建的子缓冲区。子缓冲区和父缓冲区共享数据。这个方法有助于将系统模块化。缓冲区切片可以将一个大缓冲区进行分割处理,得到的子缓冲区都具有缓冲的缓冲区模型结构;因此。这个操作有助于系统的模块化。
12、只读缓冲区:只读缓冲区可以保证核心数据的安全,如果不希望数据被随意篡改,返回一个只读缓冲区是很有帮助的。
13、文件映射到内存:NIO提供了一种将文件映射到内存的方法进行IO操作,这种方法比基于流IO快很多。这个操作主要由FileChanne.map()操作。使用文件内存的方式,将文本通过FileChannel映射到内存中。然后从内存中读取数据。同时,通过修改Buffer,将对内存中数据的修改写到对应的硬盘文件中。
14、处理结构化数据:散射和聚集。散射就是将数据读入到一组bytebuffer中,而聚集正好相反。通过ScatteringByteChannel和GatheringByteChannel可以简化对结构数据的操作。
15、直接内存访问:DirectBuffer直接分配在物理内存中,并不占用对空间,因此也不受对空间限制。DirectBuffer的读写操作比普通Buffer块,因为DirectBuffer直接操纵的就是内核缓冲区。
16、引用类型:强、软、若、虚四种引用类型。
WeakHashMap:是弱引用的一中典型应用,它使用弱引用作为内部数据的存储方案。可以作为简单的缓存表解决方案。
如果在系统中,需要一张很大的Map表,Map中的表项作为缓存之用。这也意味着即使没能从该Map中取得相应地数据,系统也可以通过选项方案获取这些数据,虽然这样会消耗更多的时间,但是不影响系统的正常运行。这个时候,使用WeakHashMap是最合适的。因为WeakHashMap会在系统内存范围内,保存所有表项,而一旦内存不够,在GC时,没有被引用的又会很快被清除掉,避免系统内存溢出。
17、有助于改善系统性能的技巧:
1、慎用异常:for循环中使用try-catch会大大降低系统性能
2、使用局部变量:局部变量的访问速度远远高于类的静态变量的访问速度,因为类的 变量是存在在堆空间中的。
3、位运算代替乘除法:右移代表除以二、左移代表乘以二。
4、有的时候考虑是否可以使用数组代替位运算。
5、一维数组代替二维数组。
6、提取表达式:尽可能让程序少做重复的计算,尤其要关注在循环体的代码,从循环提中提取重复的代码可以有效的提升系统性能。
参考书籍:
Java程序性能优化-让你的Java程序更块、更稳定 葛一鸣
Effctive java 第二版