深入分析 Java I/O 的工作机制

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/61916185 深入分析 Java I/O 的工作机制总结:1 I/O接口分为字节型和字符型,通过inputstreamreader进行转换。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/61916185

深入分析 Java I/O 的工作机制



总结:

1 I/O接口分为字节型和字符型,通过inputstreamreader进行转换。

2I/O访问方式
2.1 磁盘I/O:标准访问文件方式:从 用户地址空间经过内核空间 物理磁盘 再到
2.2 直接I/O:不经过内核空间直接访问磁盘,但是不经过缓存,速度较慢。
2.3 内存映射方式访问,内存某一块区域与磁盘关联,数据共享

2.4 同步、异步、阻塞、非阻塞:
同步异步注重调用的方式,
同步在调用时会等待调用返回结果。

异步会直接返回,并等所调用的对象进行回调。
阻塞非阻塞注重结果的返回

阻塞会一直挂起等待返回值。
非阻塞可以在等待时做其他事,隔一段时间再来查看结果。

3、java序列化技术(java io):实现serializable接口。与cloneable接口的区别是浅拷贝和深拷贝的区别。
要点有:
3.1父类实现serializable接口,子类可序列化
3.2、子类实现serializable接口,父类没有,父类属性不能序列化
3.3、若序列化的对象持有其他对象引用,其他对象也要序列化。
3.4、反序列化时id若被修改则会失败。
3.5transient关键字指定某属性不被序列化。


4、网络I/O基于socket
4.1基础是tcp协议
4.2影响传输的因素:带宽、传输距离、tcp拥塞控制
4.3socket包含本地地址,远程地址,端口号。
4.4socket创建时,操作系统为其分配一个缓冲区,用于数据读取与写入。
sendq队列用于写入数据到outputstream,recvq队列用于读取数据到inputstream。
队列满时会阻塞,队列空时会等待,即生产消费者的阻塞队列模式。

5NIO:解决BIO的困境,采用非阻塞io,
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。可能引起内存泄漏。

6、IO调优
1磁盘优化
2tcp参数优化
3网络io优化:减少交互、减少数据返回、减少编码。

适配器和装饰者:
适配器把一个接口转接成另一个接口。
而装饰者只是扩展原接口功能。


原文链接:http://blog.csdn.net/a724888/article/details/61916885



相关文章
|
3天前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
50 15
常见java OOM异常分析排查思路分析
|
8天前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到 OutOfMemoryError(OOM)表示内存资源不足。常见OOM情况包括:1) **Java堆空间不足**:内存被大量对象占用且未及时回收,或内存泄漏;解决方法包括调整JVM堆内存大小、优化代码及修复内存泄漏。2) **线程栈空间不足**:单线程栈帧过大或频繁创建线程;可通过优化代码或调整-Xss参数解决。3) **方法区溢出**:运行时生成大量类导致方法区满载;需调整元空间大小或优化类加载机制。4) **本机内存不足**:JNI调用或内存泄漏引起;需检查并优化本机代码。5) **GC造成的内存不足**:频繁GC但效果不佳;需优化JVM参数、代码及垃圾回收器
常见java OOM异常分析排查思路分析
|
3天前
|
Java 程序员 数据库连接
Java中的异常处理机制:从基础到高级
【9月更文挑战第10天】在Java的世界,异常是程序运行过程中的不速之客。它们悄无声息地潜入,威胁着代码的健康执行。了解并掌握Java的异常处理机制,就如同为程序穿上了一件护身符,让这些意外的访客不再成为灾难。本文将引导你走进Java异常处理的大门,从简单的try-catch语句到自定义异常类的创建,再到finally块的使用和异常链的形成,让你的程序在面对异常时能优雅地起舞。
|
1天前
|
Java 程序员 开发者
探索Java中的异常处理机制
【9月更文挑战第12天】在Java编程世界中,异常处理是一块不可或缺的拼图。本文将带领读者深入理解Java的异常处理机制,从基本概念到高级用法,一探究竟。我们将通过实际代码示例,展示如何捕获和处理异常,以及如何自定义异常来增强程序的健壮性。无论你是Java新手还是资深开发者,这篇文章都将为你提供有价值的见解和技巧。
|
7天前
|
Java 开发者
深入理解Java中的异常处理机制
【9月更文挑战第6天】在Java编程的世界中,异常处理是一块不可或缺的拼图。就像我们在生活中遇到意外时需要冷静思考解决方案一样,Java程序也需要通过异常处理来应对运行时出现的问题。本文将引导你了解Java异常处理的核心概念,并教你如何巧妙地使用try-catch语句和finally块来捕获和处理异常。
14 2
|
15天前
|
消息中间件 算法 Java
深入浅出操作系统:进程管理的艺术掌握Java中的异常处理机制
【8月更文挑战第30天】在数字世界的舞台上,操作系统扮演着导演的角色,精心安排着每一个进程的表演。本文将揭开进程管理的神秘面纱,从进程的诞生到终结,探究它们如何在操作系统的指挥下和谐共舞。通过生动的比喻和直观的代码示例,我们将一同走进操作系统的核心,理解进程调度、同步与通信的内在机制,以及它们对计算生态的重要性。让我们跟随代码的节奏,一起感受操作系统的魅力吧!
|
15天前
|
Java 编译器 开发者
Java中的异常处理机制
【8月更文挑战第30天】在Java编程中,异常处理是不可或缺的一部分。本文将探讨Java的异常处理机制,包括异常的概念、分类以及如何处理异常。我们将通过实际代码示例来展示如何在Java程序中捕获和处理异常,确保程序的稳定性和可靠性。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解和应用Java的异常处理机制。
14 1
|
11天前
|
安全 Java API
Java线程池原理与锁机制分析
综上所述,Java线程池和锁机制是并发编程中极其重要的两个部分。线程池主要用于管理线程的生命周期和执行并发任务,而锁机制则用于保障线程安全和防止数据的并发错误。它们深入地结合在一起,成为Java高效并发编程实践中的关键要素。
8 0
|
13天前
|
Java 开发者
Java编程中的异常处理机制探究
【8月更文挑战第31天】在Java的世界中,异常处理是维护程序稳定性的重要工具。它像是一套精密的免疫系统,保护代码免受错误的侵袭,确保程序能够优雅地应对意外情况。本文将带你走进Java的异常处理机制,了解如何捕获和处理异常,以及自定义异常类的创建与应用,让你的代码更加健壮,运行更加顺畅。
|
14天前
|
开发者 C# 自然语言处理
WPF开发者必读:掌握多语言应用程序开发秘籍,带你玩转WPF国际化支持!
【8月更文挑战第31天】随着全球化的加速,开发多语言应用程序成为趋势。WPF作为一种强大的图形界面技术,提供了优秀的国际化支持,包括资源文件存储、本地化处理及用户界面元素本地化。本文将介绍WPF国际化的实现方法,通过示例代码展示如何创建和绑定资源文件,并设置应用程序语言环境,帮助开发者轻松实现多语言应用开发,满足不同地区用户的需求。
26 0