您的位置:首页 > 编程语言 > Java开发

《深入分析JavaWeb技术内幕》读书笔记(二)深入分析Java I/O 工作机制

2017-08-19 14:27 316 查看
核心问题:1.数据格式影响I/O操作

2.传输方式影响I/O操作

磁盘I/O工作机制

一、访问文件的几种方式

1.标准访问文件



2.直接I/O

直接访问磁盘数据,不经过操作系统内核缓冲区(减少一次从内核缓冲去到用户程序缓冲的数据复制),常与异步I/O结合使用。



3.同步访问文件

数据的读取和写入都是同步操作。只有当数据成功写到磁盘才返回成功标志给应用程序。

性能较差,应用于数据安全性要求较高的场景.

4.异步访问文件

5.内存映射

将操作系统内存的某一区域与磁盘文件关联



Java读取文件流程



Java序列化技术

Java序列化实现serializable接口。与cloneable接口的区别是浅拷贝和深拷贝的区别。

总结:

1.当父类继承Serializable接口,子类可被序列化。

2.子类实现Serializable接口,弗雷没有,父类属性不能序列化。

3.序列化的属性为对象,该对象也须实现Serializable接口

4.反序列化时,如对象属性有修改/删减,修改部分将丢失,但不报错

5.反序列化时,如serialVerisonUID被修改,反序列化将失败。

6.transient关键字指定某属性不被序列化。

什么是深拷贝和浅拷贝?(引用:http://www.cnblogs.com/shuaiwhu/archive/2010/12/14/2065088.html

网络I/O工作机制(基于socket)

1.如何建立和关闭一个TCP连接



2.影响网络传输的因素

2.1.网络带宽(1s一条物理链路最大传输比特数[/b])

2.2传输距离

2.3TCP拥塞控制

JavaSocket工作机制

建立通信链路(TCP协议)+数据传输

socket包含本地地址,远程地址,端口号。

socket创建时,操作系统为其分配两个缓冲区,用于数据读取与写入。

SendQ队列用于写入数据到outputstream,RecvQ队列用于读取数据到inputstream。

队列满时会阻塞,队列空时会等待,即生产消费者的阻塞队列模式。

NIO工作方式

解决BIO(阻塞I/O)的困境,采用非阻塞I/O,关键类:Channel和Selector

Channel:交通工具 Selector:车站 Buffer:座位

1使用selector静态工厂创建一个选择器。

2创建一个服务端的channel绑定到一个socket对象,把他注册到选择器上,selector可以监听channel中所有通信信道的事件。

3将通信信道设为非阻塞,使线程可以在信道之间切换。

4通过selectedkey来检查已注册选择器上的信道是否有事件发生,如果有事件发生,返回所有selectedkey,通过channel方法得到通信信道对象,通过buffer进行数据读取。

5、tomcat和jetty使用一个线程监听客户端请求,是阻塞的,另一个线程负责处理请求,是非阻塞的。

6、线程在得知事件发生后,找到对应的buffer进行数据交互,并且可以与多个buffer交互,是非阻塞的。

7、buffer的数据访问方式:经过socket缓冲再复制到buffer,或者直接操作系统缓冲区(通过directbuffer操作非jvm堆内存)每次创建或释放需要调用一次system.gc。可能引起内存泄漏。



I/O调优

1.磁盘优化

1.1性能检测(压力测试应用程序/iostat(Linux系统) 关键参数:wait、IOPS)

1.2.提升I/O性能

增加缓存

优化磁盘管理系统

设计合理磁盘存储数据块,及访问策略(例:异步加非阻塞)

RAID

2.TCP参数优化

3.网络I/O优化:减少网络交互次数(合并访问请求)、减少网络传输数据量大小(数据压缩)、减少编码(尽量以字节形式发送)。

交互方式比较

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: