八股原理笔记

149 阅读6分钟

1.怎么理解CPU密集型和I/O密集型

2.谈谈对IO多路复用的select机制的理解

100%弄明白5种IO模型
大白话详解5种网络IO模型

  • 阻塞io 每次io 进程就阻塞在recvfrom()方法上,在高并发场景下 如果客户端同时发起的请求过多,则服务端需要同时开启很多线程,但服务器的线程是有限的,若超过了最大负载,那后来的请求将得不到处理;服务器也会有因为线程数过多而崩溃的风险,线程会有两次阻塞,且一个连接对应一个线程。适用于连接数比较少的场景。(线程阻塞后,会让出cpu,但不会释放内存,等待回调函数唤醒,线程状态的切换会浪费性能)

  • 非阻塞io,非阻塞IO在用户数据报还没准备好的时候,recvfrom系统调用不会阻塞,接着会继续进行下一轮的recvfrom系统调用看数据报有无准备好,周而复始,进程(线程)不断轮训。线程会有一次阻塞,且依然一个连接对应一个线程。但是进程(线程)不断轮训 这是非常耗费CPU的。这种模型不是很常用,适合用在某台CPU专为某些功能准备的场合。

  • io多路复用-而不用像阻塞IO模型或非阻塞IO模型那样,一次recvfrom系统调用中一个线程就只能选择一个文件描述符,IO多路复用模型的思路就是系统提供了一种函数可以同时监控多个fd的操作,应用线程通过调用该函数就可以同时监控多个fd,监控的fd中只要有任何一个数据状态准备就绪了,该函数就会返回可读状态(可读fd的数量),这时询问线程再去遍历fd_set 查找数据就绪的fd,然后对应线程此时再发起recvfrom请求去读取数据。解决了NIO cpu空转问题。适用于高并发场景,当select函数管理的连接数比较少时,这种模型将变成阻塞io模型,多路复用无需采用线程池的方式 也不用去轮询,只需要阻塞在select函数上即可,select函数同时管理多个连接,并且不断的查看各个连接的请求。

3.挂起和阻塞的区别

挂起和阻塞的区别2

4.jvm分析

如果整个Java项目运行缓慢,你该如何解决?

避免堆内存的伸缩空间进行操作,将初始化内存空间与整体堆内存空间大小设置为一一样,使用“-Xms”、“-Xmx”

5.Redis6系列1-线程模型(单线程OR多线程)

6.redis的延迟双删策略总结

7.如果整个Java项目运行缓慢,可以考虑以下几个方面来解决问题:

  1. 性能分析和优化:使用性能分析工具(如Java Profiler、VisualVM等)来确定项目中的性能瓶颈。分析哪些方法、代码块或资源消耗大,找出耗时操作并进行优化。
  2. 数据库优化:如果项目与数据库交互频繁,可以优化数据库查询语句、添加索引、调整数据库连接池的配置等来提高数据库访问性能。
  3. 缓存优化:通过使用缓存来减少对数据库或其他资源的访问,提高数据的读取速度。可以使用内存缓存(如Redis、Memcached)或应用程序级缓存(如Ehcache)。
  4. 多线程优化:利用多线程来提高项目的并发处理能力,将耗时的操作异步执行或并行执行,避免阻塞主线程。
  5. 代码优化:检查项目中的代码,查找可能存在的性能问题,如重复计算、不必要的循环、频繁的对象创建等,并进行优化。
  6. 服务器和网络优化:确保服务器硬件配置足够强大,网络带宽足够,避免服务器过载和网络延迟导致的性能问题。
  7. 第三方库和依赖项的版本更新:检查项目中使用的第三方库和依赖项的版本,并确保使用的是最新稳定版本,以获得性能改进和 bug 修复。
  8. 并发控制和资源管理:确保正确处理并发访问共享资源的情况,避免竞态条件和死锁问题。
  9. 日志和异常处理:检查项目中的日志和异常处理机制,确保不会因为频繁的日志记录和异常抛出而导致性能下降。
  10. 代码审查和重构:进行代码审查,寻找代码中的冗余、复杂度高的部分,并进行重构,以提高代码的可读性和性能。

8.在Java项目中,以下问题可能会导致CPU使用率飙升、内存使用率飙升和响应时间变长:

  1. CPU使用率飙升:

    • 无限循环或大量重复计算:代码中存在无限循环或大量重复计算的情况,使得CPU不断执行相同的操作,导致CPU使用率飙升。
    • 频繁的线程切换:线程的频繁切换也会导致CPU使用率升高,例如线程间的竞争、锁争用等问题。
    • 死循环:代码中存在死循环,导致CPU一直在执行循环,无法完成其他任务。
  2. 内存使用率飙升:

    • 内存泄漏:当对象无法被垃圾回收器回收,或者存在大量未及时释放的资源,会导致内存占用逐渐增加,最终导致内存使用率飙升。
    • 内存溢出:当应用程序需要的内存超过了可用内存时,会发生内存溢出,导致内存使用率飙升。
    • 大对象或大数据集:创建大对象或处理大数据集时,会占用大量内存,导致内存使用率增加。
  3. 响应时间变长:

    • 阻塞操作:当代码中存在阻塞操作,如长时间的IO操作、数据库查询或网络请求,会导致响应时间变长。
    • 锁竞争:多线程环境下,当多个线程同时竞争同一把锁时,可能会导致线程阻塞等待锁资源,从而增加响应时间。
    • 不合理的算法或数据结构:使用低效的算法或不合理的数据结构可能导致处理时间增加,从而影响响应时间。

要解决这些问题,可以使用性能分析工具来确定性能瓶颈所在,并对代码进行优化。优化的方式包括改进算法、减少资源消耗、合理使用线程、进行内存管理等。同时,进行代码审查和性能测试也是识别和解决这些问题的关键步骤。