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

核心问题: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一条物理链路最大传输比特数
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优化:减少网络交互次数(合并访问请求)、减少网络传输数据量大小(数据压缩)、减少编码(尽量以字节形式发送)。
交互方式比较
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值