一、IO 模型
BIO :同步阻塞io,单线程 内存上下文切换开销大、性能差
NIO :同步非阻塞 提高系统并发能力,减少等待时间, 用户线程需要不断轮询io状态,占cpu资源
AIO :异步非阻塞 允许应用程序在等待io操作完成时继续执行其他任务,高并发下减少线程或进程的数量,降低资源消耗
二、什么是网络IO
网络IO操作通常包括两个阶段:
1、等待数据准备就绪(如等待数据从网络到达套接字接收缓冲区)
2、将数据从内核拷贝到用户进程
不同的网络IO模型适用于不同的应用场景。例如,对于连接数不多的应用场景,可以使用阻塞IO模型;对于需要处理大量连接的应用场景,则可以考虑使用非阻塞IO、多路复用IO或异步IO模型。在选择网络IO模型时,需要根据应用的具体需求和性能要求来综合考虑。
三、什么是零拷贝
通过减少数据拷贝次数和上下文切换次数,从而显著提高数据传输和存储的效率
零拷贝并不是指数据在传输过程中没有进行任何拷贝,而是指尽量减少用户态与内核态之间的数据拷贝次数,以及减少CPU的参与,从而提高数据传输的效率
Kafka在生产者 和消费者 之间传输数据时,通过利用操作系统的零拷贝特性
网络服务器:Nginx采用了零拷贝技术来优化数据传输
文件传输系统中,如scp(安全复制)和rsync(远程同步),零拷贝技术也被广泛应用
四、多路复用
多路复用 :异步进行资源操作的手段,
1、selector 消耗性能
2、pool 会发生链式扫描 效率慢
3、epool 消息驱动的控制机制,只关心文件有没有变化 效率快
应用: redis io多路复用 :Netty 使用 Java NIO 提供的 Selector 来实现 I/O 多路复用,netty 通过Selector能够同时监视多个Channel(通道),当Channel有I/O事件发生时(如可读、可写、连接等)
五、java程序、mysql JDBC connection关系
Java程序和MySQL数据库之间的JDBC连接关系是通过JDBC API建立的。它允许Java应用通过SQL语句与MySQL数据库交互,并执行查询、更新、插入和删除等操作。这个连接过程是基于标准的JDBC API实现的,具有跨数据库平台的通用性。
六、connection怎么操作事务
- 开启事务,将Connection对象的自动提交模式设置为false。
- 通过调用setAutoCommit(boolean autoCommit)方法实现,
- 其中autoCommit参数设置为false。
- 执行sql
- 提交事务
- 回滚事务
七 、java里面的池化技术
重用对象来减少创建和销毁对象的开销,从而提高应用程序的性能和响应速度
数据库连接池(Connection Pool):数据库连接池是管理数据库连接的缓存池技术。它可以预先创建一定数量的数据库连接,并将这些连接放置在连接池中
线程池(Thread Pool):线程池用于管理一组工作线程,这些线程可以执行提交给线程池的任务,使用线程池可以避免频繁地创建和销毁线程
对象池(Object Pool):对象池是一种用于管理可重用对象的池化技术。当应用程序需要创建大量相同类型的对象时,可以使用对象池来重用这些对象,而不是每次都创建新的对象
缓存(Cache):虽然缓存本身并不直接属于池化技术,但它也涉及到资源的重用,因此可以看作是池化思想的一种应用
八、线程池7个核心参数
corePoolSize:核心线程数:线程池的基本大小,即线程池中会一直保持的线程数量
maximumPoolSize(最大线程数)定义:线程池中允许的最大线程数量
keepAliveTime(空闲线程存活时间)定义:当线程数量超过corePoolSize时,空闲线程在终止前等待新任务的最长时间。
unit(空闲时间单位)定义:keepAliveTime的时间单位,如秒、毫秒等。
workQueue(工作队列)定义:用于存放待执行任务的阻塞队列。
threadFactory(线程工厂)定义:用于创建新线程的工厂。
handler(拒绝策略)定义:当线程池无法处理新任务时(即线程数量达到maximumPoolSize,且工作队列已满),所采取的拒绝策略。
九、线程的状态
- new 线程创建好还没有调用start
- runnable 这个状态有可能正运行、可能等待就绪
- blocked 处于锁等待
- waiting 条件等待状态 触发条件唤醒 notify /wait
- timed_wait 和waiting 状态相同 多了一个超时条件触发
- terminated 线程执行结束
十、线程怎么创建
- Thread
- Runnable
- Callable
Thread是个类 只能单一继承 ,runnable是接口可以支撑多继承
Runnable表示一个线程的顶级接口,Thread类是实现Runnable
Runnable是一个任务 thread才是真正处理的线程,前者去定义任务,后者去处理
(松耦合)
Thread真正意义上的线程实现 Runnable表示要求执行的一个任务