JAVA后端面经总结


JAVA后端开发知识总结(持续更新…)


JAVA后端面经总结


文章目录

  • JAVA后端面经总结
    • 一、JAVA基础
  • 一.1、设计模式
    • 二、MySQL
    • 三、多线程
    • 五、Redis
    • 六(1)、计算机网络
    • 六(2)、OS
    • 七、框架
    • 八、项目
    • 九、JVM
    • 十一、消息队列
    • 十二、分布式
    • 十三、Netty


一、JAVA基础

  1. java里string为什么不可继承,那为什么要用final关键字修饰呢 ?

private final char value[];:final(只是引用地址不可变);private;
String是不可变的关键都在底层的实现,而不是一个final;
安全

  1. string和stringbuffer和stringbuilder底层实现,讲讲stringbuffer和stringbuilder的区别 ?

final stringbuilder:char[] value;不能被继承
final stringbuffer:transient char[];,StringBuffer中大部分方法由synchronized关键字修饰,在必要时可对方法进行同步

  1. 类的生命周期

JVM:加载、连接、初始化、使用、和卸载

  1. 内存对齐,char,short,int ?

v

  1. float a = 1.4f;float b = 1.1f a-b多少

(默认是double,类型最后输出是0.29999995)

  1. JAVA后端面经总结_第1张图片
  • 精度丢失:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。
  • 使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。
  1. object类中有哪些方法

讲到在jvm的存储

  1. static修饰的作用
  1. 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。
  2. 被static 声明的成员变量属于静态成员变量,静态变量存放在 Java 内存区域的方法区
  3. static修饰类的话只能修饰内部类
  4. 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。
  5. 静态内部类没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建;2. 它不能使用任何外围类的非static成员变量和方法。
  1. Hash的几种方法

开放定址法(线性探测/平方再散列);再哈希法、链地址法

  1. BIO NIO AIO 的区别
  1. java里面的反射原理。

类加载三步,运行时处理

  1. java对象的创建方法?

new
反射:newInstance
String s = “a”
反序列化
clone

  1. Java进程和mysql进程如何通讯
  1. 常见设计模式,jdk里面哪些类用到了什么设计模式
  • 单例(饿汉式):Runtime
  • 简单工厂:Calendar
  • 装饰者模式:IO流
  • 策略模式:Arrays
  1. 介绍泛型
  • JAVA的泛型化:直接让当前已有类型原地泛型化。
  • 类型擦除:编译后的字节码文件中类型泛型化实例被替换为了裸类型(共同父类型);也就是在运行期间两个不同的泛型其实没区别。
  • 裸类型的实现:直接就把ArrayList< Integer >还原为ArrayList,只在修改、元素访问时自动插入强制类型转换
  • 运行期无法取得泛型类型信息。
  • 限定类型替换类型参数。
  • 桥方法用来保持多态。
    解决重载:通过对方法添加不同的返回值类型。
  • 擦除是擦除的属性表中的Code元数据中依然保留有泛型信息,可通过反射获得。
  1. Arrays.asList()
  1. 将数组转换为集合后,底层其实还是数组
  2. Arrays.asList()是泛型方法,传入的对象必须是对象数组,即Integer而非int。
  3. 使用集合的修改方法:add()、remove()、clear()会抛出异常,因为Arrays.asList() 是 java.util.Arrays 的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。
  1. Arrays.sort 的底层中,为何一部分用快排而不用堆排序,工业界中为啥用快排多于堆排
  • 一般情况下,快速排序效率要高于堆排序,因为堆排序的常数项较大(不过也是1~2之间)。
  • 快速排序的平均时间复杂度是O(1.39nlogn),一般来说,除非有需要绝对保证不能出现O(n^2)的要求,不使用堆排。
  • 堆排序数据访问的方式没有快速排序友好,不是像快速排序那样局部顺序访问,所以对CPU缓存不友好。
  1. Java进程怎么创建
  1. Runtime.exec()
  2. ProcessBuilder的start方法
  1. JDK有一个东西可以自动实现CPU密集型的任务的多线程调度优化

Stream;parallelStream? 《这里》

  1. BigDemical的实现原理
  • 十进制的小数在转化成二进制浮点数时会产生精度问题。
  • 十进制整数在转化成二进制数时不会有精度问题,那么把十进制小数扩大N倍让它在整数的维度上进行计算,并保留相应的精度信息。
  1. 1.6,1.7,1.8版本对switch对string的支持
  • 在jdk1.6及之前switch语句只能支持byte、char、short、int和枚举型,不支持String类型。
  • jdk1.7及之后加入了对String类型的支持。
  • 不支持long、float、double、boolean四种基本类型。
  1. 常见的运行时异常(非受检异常)都有哪些?
  1. NullPointerException
  2. ArrayIndexOutOfBoundsException
  3. NoSuchMethodError
  4. IndexOutOfBoundsException
  5. NumberFormatException
  6. OutOfMemoryException
  1. 运行时异常和非运行时异常(受检异常)
  • 不需要try-catch
  • 不需要显式捕捉
  • 非受检异常是通过继承 RuntimeException 来实现的
  • 需要try-catch
  • 需要显式捕捉
  • IOException,SQLException,1/0 问题,FileNotFoundException、ClassNotFoundException
  • 受检异常是通过继承 Exception 来实现的
  1. 序列化和反序列化
  1. Java对象的序列化(Serialization)和反序列化详解
  2. Java的序列化可以帮助实现持久化
  3. 对象序列化机制是java语言内建的一种对象持久化方式,对象的序列化可以很容易地在JVM中的活动对象字节数组(流) 之间进行转换。
  4. 广泛应用到RMI(远程方法调用)及网络传输中。
  1. 序列化对象到文件中: ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“template”));
  2. 反序列化:ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
  1. 序列化反序列化的原则和注意事项?
  1. 实现Serializable接口。
  2. 序列化保存的是对象的状态,静态变量属于类的状态,因此序列化并不保存静态变量
  3. 如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存,这是能用序列化解决深拷贝的重要原因。
  4. 当序列化之后,不能修改对象的类中的成员,否则也出异常;解决的方案:保证对象类的序列号不改变即可。
  1. 如果自己实现序列化该如何操作,假如有一个int类型,如何序列化为字节流?
  1. Integer
  2. 字节数组
  3. 例如借助Netty中的channelBuffer来实现
  1. 序列化如何支持跨平台?JAVA序列化将对象转为字节码(byte),为什么不可以直接转为位(bit)?

《彻底理解从二进制到序列化、跨平台》

  1. CPU处理器与操作系统的整体叫平台编译器负责把Java程序转成class文件(字节码),方便JVM来读取它。
  2. JVM是java虚拟机,它是解释器,把class文件中的命令转成某种平台的命令,比如把java命令转成Windows下的命令,字节码文件提供了跨平台运行的特性,class字节码对于任何操作系统都是一样的。
  1. 双亲委派机制?有什么好处?自定义一个类然后再main方法中get当前类的classloader,获取的是哪个类加载器?它的父类加载器是什么?获取ext的父类启动类加载器也就是顶级类加载器时能获取到吗?
  • AppClassLoader
  • ExtClassLoader
  • null
public class stream1 {
    public static void main(String[] args) {
        stream1 user = new stream1();
        Class<? extends stream1> userClass = user.getClass();
        System.out.println(userClass.getClassLoader());
        System.out.println(userClass.getClassLoader().getParent());
        System.out.println(userClass.getClassLoader().getParent().getParent());
    }
}
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@7ba4f24f
null
  1. 子类与父类

《java中创建子类对象时会不会创建父类对象》
《Java中子类继承了父类的私有属性及方法吗?》

  • 创建子类对象时不会创建父类对象,只是创建了父类空间,并进行了初始化
  • 如果说创建子类的时候就会创建它的父类,那内存空间中就都是Object类的对象了。
  • 主要涉及到java对象的内存布局,当new一个对象时,其实jvm已经把对象的整个空间已经分配好,并且整个对象的实例域布局已经确定下来了。
  • 实例化方法< init > 就是将对象实例域的值设置到相应空间中。< init >方法以调用父类的< init >方法开始,以自身构造方法作为结束。
  1. 集合和数组
  • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象,而且对象的类型可以不一致。
  • 集合中传入基本类型可以实现自动装箱、,并将具体类型传入集合。
  • 不指定List类型,存入数据,再次取出时,默认是Object类型
  1. 类型转换

两个数值进行二元操作时,会有如下的转换操作:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型。
否则,两个操作数都转换为int类型。

  1. UML

类图最适合于描述系统的静态结构、类、对象及它们之间的关系。
状态、序列、协作和活动图则适合于描述系统的动态行为,即描述系统中的对象在执行期间不同的时间点是如何动态交互的。

  1. Policy文件

《使用Policy文件来设置Java的安全策略》

  1. 泛型的继承

《JAVA泛型-泛型类的继承》
《JAVA泛型及继承问题》

  1. 泛型的协变/逆变(PECS)

《Java泛型的协变和逆变》

  1. Class.forName():new与newInstance的区别

《Class.forName()用法详解》

33.stream流

  • 《stream流详解》
  • 数据源可以是集合,数组或IO资源。

一.1、设计模式

  1. 工厂模式都有哪几种?怎么实现?
  • 静态(简单)工厂模式、工厂方法模式、抽象工厂模式。
  • 对象的创建和调用分离。
  • 《这篇》
  1. 介绍下单例模式,都怎么实现?以及它们的区别?
  1. 策略模式说一下,使用场景?
  • 避免大量if…else,将复杂的逻辑判断分成一个个单独的类
  • 凡是可以枚举的业务,往往都需要使用设计模式才能更好解决

二、MySQL

  1. 连接池,一些参数的含义(详细探讨了一下 removeAbandonedTimeout细节)
  1. 给你一个1-10,用b+树,最少查询几次?
  1. MySQL索引

v

  1. 唯一索引和普通索引 ?

v

  1. 索引的类型?

普通索引:最基本的索引,没有任何约束限制。
唯一索引:和普通索引类似,但是具有唯一性约束,可以有 null。
主键索引:特殊的唯一索引,不允许有 null,一张表最多一个主键索引。
组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并。
全文索引:对文本的内容进行分词、搜索。
覆盖索引:查询列要被所建的索引覆盖,不必读取数据行。

  1. 二级索引回表的过程 ?

v

  1. 覆盖索引是什么 ?

v

  1. MVCC是什么,实现了什么隔离级别 ?

v

  1. 在什么情况下不适合加索引

频繁改动和删除的数据、数据量小、区分度小的字段
中到大数据量表适合使用索引
小数据量表,大部分情况全表扫描效率更高
特大数据量表,建立和使用索引的代价会随之增大,适合使用分区或分库

  1. MySQL的一条sql语句执行流程

v

  1. MySQL是如何解决幻读的

(next-key锁和MVCC)

  1. 为什么要选择InnoDB,有哪些特性

v

  1. MySQL事务和隔离级别

v

  1. MySQL死锁解决策略

v

  1. SQL如何调优

Explain、慢日志查询

  1. change buffer和redo log区别

v

  1. mysql什么时候会选错索引
  • 索引统计的更新机制:采样统计优化器存在选错索引的可能性。
  • 对于由于索引统计信息不准确导致的问题,可以用 analyze table 来解决。
  • 而对于其它优化器误判的情况,可以在应用端用 force index 来强行指定索引,也可以通过修改语句来引导优化器,还可以通过增加或者删除索引来绕过这个问题。
  1. 什么情况下适合建立索引,什么情况不合适

v

  1. B+树的增加和重新平衡的过程

这里

  1. 自增id的优/劣势

v
自增主键的优缺点
索引树分裂

  1. select * from user where id >= 多少 order by phone 这个sql有什么问题可以优化?
  • select *问题
  • 对于排序语句,必须加过滤条件(LIMIT也行)才能生效
  • WHERE条件索引失效同样会导致ORDER BY后面的索引失效
  1. 为什么MySQL单表数据量超过2000(500)万性能急剧下降?
  1. MySQL 为了提高性能,会将表的索引装载到内存中;
  2. 当单表数据库到达某个量级的上限时,导致内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降。
  3. 与实际记录的条数无关。
  1. B+树叶子结点存储的数据是一整条数据还是某个字段?

主键KEY或者具体数据

  1. 常见Mysql的慢查询优化方式
  1. 《参考文章》
  1. 数据库中设置SQL慢查询: slow_query_log=On long_query_time=2
  1. 利用explain关键字可以模拟优化器执行SQL查询语句,来分析sql慢查询语句。
  1. 索引没起作用的情况
  2. 优化数据库结构:将字段很多的表分解成多个表;增加中间表
  3. 分解关联(join)查询
  4. 优化 LIMIT + offset 分页:尽可能使用索引覆盖扫描,而不是查询所有的列;
    select id,title from collect limit 90000,10;:该语句存在的最大问题在于limit M,N中偏移量M太大
  5. 上述SQL的改进:先查询出主键id;建立复合索引
  1. select * from a where id in (select id from b );:mysql会把in子查询转换成exists相关子查询,所以它实际等同于这条sql语句:select * from a where exists(select * from b where b.id=a.id );
  2. exists相关子查询的执行原理是:循环取出a表的每一条记录与b表进行比较,比较的条件是a.id=b.id,看a表的每条记录的id是否在b表存在,如果存在就行返回a表的这条记录,顺序是固定的
  3. 但是由于顺序固定,a表(外表)使用不了索引,必须全表扫描,建索引只能在b表的id字段建。
  4. 采用 inner join不让顺序固定,让数据库自己去处理,此时就可以A、B表都建索引
  1. MySQL查询优化器
  • MySQL采用了基于开销的优化器,以确定处理查询的最优化解方式。也就是说执行查询之前,都会先选择一条自以为最优的方案,然后执行这个方案来获取结果。
  • 一个主要的目标是尽量用索引,而且使用条件最严格的索引来尽可能多、尽可能快地排除那些不符合索引条件的数据行。
  1. 默认情况下,开启一个事务,然后执行一次查询,然后执行更新操作,然后再执行一次查询,更新前后的查询,结果一样吗?
  1. 在同一个事务中先执行update 再执行select,select 的数据是update之后的结果,此时事务还没有提交;直接查询数据库,数据库的数据还没有发生变更。
  2. 在数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,这是一种机制,用以维护数据库的完整性。
  1. MySql执行计划
  1. 执行计划就是sql的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数。
  2. 即 Explain
  1. DataSource三种实现类

《3种DataSource实现及主要的数据源》
《JDBC、驱动管理器与DataSource》

  1. 驱动注册

《对JDBC驱动注册–DriverManager.registerDriver和 Class.forName()的理解》

三、多线程

  1. AQS源码看过吗?能说一下么?

v

  1. synchronized底层原理?

v

  1. Java并发包下的原子工具类,能说一下么?源码看过吗?

反射+CAS来实现

  1. 为什么使用CAS就能保证并发?

乐观锁,提到了ABA问题及解决办法

  1. 改了以后别的线程没有看到修改怎么办呢?

volatile关键字,可见性+有序性,这里主要是可见性

  1. 讲一下可重入锁,轻量级锁和重量级锁的可重入?
  1. 锁升级的过程?

无锁-> 偏向锁-> 轻量级锁-> 重量级锁

  1. 多个线程开启,设置随机时间,如何安全地让所有线程停止?

CountDownLatch、CycleBarrier

  1. await底层实现原理?

v

  1. 如果想让时间最短的停止之后,安全地通知其他线程停止呢,同时主线程也要安全停止?

shutdown…

  1. fork的时候子进程还拥有父进程的文件描述符吗 ?

子进程会获得父进程的几乎所有资源,包括文件描述符,所以是拥有的。

  1. volitle关键字什么作用,一般什么时候用,用了就线程安全嘛

v

  1. Java并发,线程创建,多线程的四种实现

v

  1. 子线程要往父线程抛异常应该怎么做?
  1. 线程出现异常,如果当前线程有异常处理器(默认没有),则优先使用该线程的异常处理器。
  2. 否则,如果当前线程所属的线程组存在异常处理器,则使用线程组的异常处理器。
  3. 否则,使用全局默认的DefaultUncaughtExceptionHandler。
  4. 如果都没有的话,子线程就会退出。
  1. 为线程设置异常处理器,具体做法有以下两种:
    (1)Thread.setUncaughtExceptionHandler:设置当前线程的异常处理器。
    (2)Thread.setDefaultUncaughtExceptionHandler:为整个程序设置默认的异常处理器。
  2. 使用线程池提交一个能获取到返回信息的方法,即Future,通过get()方法获取异常信息。
  1. 线程池怎么设置合理的参数?
  • ThreadPoolExecutor
  • 自定义线程池需要配置最大线程数maximumPoolSize,为了高效的并发运行,需要看业务是IO密集型还是CPU密集型。
  • CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),CPU密集型任务配置尽可能少的线程数量,以保证每个CPU高效的运行一个线程。CPU密集型:corePoolSize = CPU核数 + 1
  • I0密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行I0密集型的任务会导致浪费大量的CPU运算能力浪费在等待。I0密集型时,大部分线程都阻塞,故需要多配置线程数。IO密集型:corePoolSize = CPU核数 * 2
  1. 线程池如何保证线程的复用?
  1. execute 方法中的的核心方法为 addWorker()Worker为 thread 运行的任务,如果添加 Worker 成功,就会调用 start 方法启动线程。
  2. 线程池的线程复用就是通过取 Worker 的 firstTask 或者通过 getTask 方法从 workQueue 中不停地取任务,并直接调用 Runnable 的 run 方法来执行任务。
  3. 这样就保证了每个线程都始终在一个循环中,反复获取任务,然后执行任务,从而实现了线程的复用。
  1. threadlocal 同一个线程 多个threadlocal对象,怎么找到自己的threadlocal对应的数据?

threadlocalmap:Entry[] ??

  1. 指令重排是什么?
  1. 一条指令的执行可以分为很多步骤,汇编指令不是一步就可以执行完毕的,在CPU实际工作时,它需要分为多个步骤依次执行。当然,每个步骤所涉及的硬件也可能不同
  2. 因此,CPU编译器为了提升程序执行的效率,采用了流水线技术来执行指令,但流水线总是害怕被中断的。流水线满载时性能确实不错,但一旦中断,所有的硬件设备都会进入一个停顿期。
  3. 指令重排就是为了尽量少地中断流水线,指令重排可以保证串行语义一致,但是没有义务保证多进程间的语义也一致。
  • Happen-Before原则
  1. 线程池异常捕获

《Java多线程——线程池异常捕获》:try/catch

五、Redis

  1. Redis底层如何存储缓存数据

  1. Redis的网络模型?

事件

  1. 缓存更新机制

双写模式;失效模式
一开始是先删除再更新,这种情况会有读写并发脏数据的问题。吹了一波牛逼,说怎么排查到这种错误的,排查后使用先删除再更新再删除的策略。第一次的删除可以避免 Redis 宕机导致脏数据的问题,后面先更新再删除可以避免读写并发脏数据的问题。

  1. Redis如何选举

Sentinel

  1. Redis如何主从复制

RDB

  1. redis有哪些应用

(缓存和分布式锁(Redisson框架))

  1. CAP理论和base定理

v

  1. Redis的zset数据结构

v

  1. Redis的rehash过程

v

  1. 一致性哈希
  • 《白话解析:一致性哈希算法 consistent hashing》
  1. 分布式缓存中对服务器取模的问题:当服务器数量发生改变时,所有缓存在一定时间内是失效的。
  2. 一致性哈希:对2^32取模—》hash(服务器A的IP地址) % 2^32,算出的这个整数,代表服务器A;
  3. 同样,将需要缓存的对象映射到hash环上—》hash(图片名称) % 2^32,此时,沿顺时针方向遇到的第一个服务器就是将会被缓存到的服务器;
  4. 使用一致性哈希算法时,服务器的数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效
  5. 虚拟节点解决hash环偏斜问题。
  1. redis 的跳表底层实现复杂度等等

O(logN)

  1. zset底层,为什么用压缩列表
  • ? 避免内存碎片:连续内存块
  • 节约内存
  1. Redis的脑裂问题

这里

  • 网络分区情况,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。
  • 如果客户端还在基于原来的master节点继续写入数据,那么新的master节点将无法同步这些数据,当网络问题解决之后,sentinel集群将原先的master节点降为slave节点,此时再从新的master中同步数据,将会造成大量的数据丢失
  • redis的配置文件中,存在两个参数
    min-slaves-to-write 3:第一个参数表示连接到master的最少slave数量
    min-slaves-max-lag 10:第二个参数表示slave连接到master的最大延迟时间
  • 如果连接到master的slave数量小于第一个参数,且ping的延迟时间小于等于第二个参数,那么master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。
  1. redis为何用跳表而不用红黑树
  • redis——为什么选择了跳表而不是红黑树?
  1. 范围查找时,平衡树比skiplist操作要复杂。在平衡树上,找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。而在skiplist上进行范围查找就非常简单,只需要在找到小值之后,对第1层链表进行若干步的遍历就可以实现。
  2. 平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。
  3. 内存占用上来说,skiplist比平衡树更灵活一些。
  4. 从算法实现难度上来比较,skiplist比平衡树要简单得多。
  1. redis的incr
  1. Redis所有单个命令的执行都是原子性的,这与它的单线程机制有关。
  2. Redis命令的原子性使得不用考虑并发问题,可以方便地利用原子性自增操作。
  3. 服务即使是多机器多进程的,incr也能保证每次返回的结果不会出现相同的值。
  4. 计数器是 Redis 的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向 Redis 发送一个 INCR 命令。
  5. 限流:和expire / setex配合使用。
  6. incr性能不行,大概500左右qps。
  1. Redis为什么快
  1. IO多路复用
  2. 运行在内存中
  1. Redis为什么是单线程的?

Redis的瓶颈不是cpu的运行速度,而往往是网络带宽机器的内存大小

  1. Redis集群通信及Gossip协议

《Redis集群的节点通信原理》

  1. Redis集群采用P2P的Gossip(流言)协议,Gossip协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,这种方式类似流言传播。
  2. 集群中的每个节点都会单独开辟一个TCP通道,用于节点之间彼此通信。
  3. MEET三次握手。
  1. Gossip协议的主要职责就是信息交换,信息交换的载体就是节点彼此发送的Gossip消息,常用的Gossip消息可分为:ping消息、pong消息、meet消息、fail消息。

六(1)、计算机网络

  1. ping 解释如何实现互通
  • 《Ping命令原理》
  • 《ping 的原理》
  1. Ping发送一个ICMP,即因特网际信报控制协议,回声请求消息给目的地并报告是否收到所希望的ICMP echo (ICMP回声应答)。
  2. 利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。
  3. 涉及Mac(ARP)、ICMP,分为同一网段和不同网段。
  1. Mac 的作用,NAT的作用
  • MAC地址称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第二层数据链路层负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。
  • IP地址和MAC地址是成对出现的,映射关系由ARP(地址解析协议)协议完成。
  • MAC地址与网络无关
  • 《NAT(地址转换技术)详解》
  • NAT不仅实现了网络地址转换,同时还起到防火墙的作用,隐藏内部网络的拓扑结构,保护内部主机。
  • 减缓IPv4地址的消耗。
  • 网络地址转换,就是替换IP报文头部的地址信息。
  • NAT通常部署在一个组织的网络出口位置,通过将内部网络 IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。
  1. 为什么要用到MAC地址
  • 组网方式决定的,如今比较流行的接入Internet的方式是把主机通过局域网组织在一起,然后再通过交换机和 Internet相连接。
  • IP只是逻辑上标识,任何人都能随意修改,因此不能用来标识用户;而 MAC地址则不然,它是固化在网卡里面的。
  • 局域网采用了MAC地址来标识具体用户的方法,在交换机内部通过“表”的方式把MAC地址和IP地址一一对应,也就是IP、MAC绑定
  • 只有IP而没有对应的MAC地址在这种局域网内是不能上网的,于是解决了IP盗用问题
  1. NAT转换
  • 一般使用私网ip作为局域网内部的主机标识,使用公网ip作为互联网上通信的标识。双向流量必须都要经过NAT网关
  • 网络访问只能先由私网侧发起,公网无法主动访问私网主机。
  • NAT网关的存在对通信双方是保持透明的。
  • NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
  1. PAT
  • NAT重载,是动态NAT,它利用源端口将多个私网ip地址映射到一个公网ip地址(多对一)。
  • 即利用端口号实现公网和私网的转换。
  1. HTTP状态码

v

  1. HTTP安全吗?为什么不安全?那既然不安全的话要用什么协议?

v

  1. HTTPS连接流程

v

  1. HTTPS为什么要混合使用非对称加密和对称加密

v

  1. 数字签名原理

v

  1. HTTP 和 HTTPS 的区别

v

  1. https如何实现加密

v

  1. HTTPS为什么需要三个随机数才生产出会话密钥?

v

  1. 那为什么前两个随机数是没有加密传输,但第三个随机数就要加密传输了?

v

  1. 访问一个页面的过程,https是对称加密还是非对称加密?

v

  1. 抓包 HTTPS 报文,里面有什么东西(密文)?能看到哪些内容?能看到域名吗(能看到)?为什么能看到(不能看到的话怎么请求响应)?但是域名可以服务端解密啊,作为中间人的话能不能看到域名(能)?

v

  1. UDP一般用在什么地方比较多? UDP最大特点是什么?

v

  1. Socket的连接是怎么建立的?过程说一说
  1. HTTP 和 HTTPS 的默认端口sm

(80 和 443)

  1. TCP的粘包是什么?Tcp如何保证可靠性的?

v

  1. UDP如何实现可靠

v

  1. 一条url从回车到渲染,整个过程,越详细越好

v

  1. RPC调用过程
  1. 假如说你的客户端页面用户使用的时候请求的速度很慢,作为后台开发人员你会怎么去排查后台的问题?

先定大方向,可能是操作系统io方面的、CPU方面的、再是数据库,可以用logger打印一下。

  1. 线上查询接口比较慢,怎么定位

先排查代码效率;再排查 SQL,看是否命中索引

  1. 如果在浏览器上输入一个网址返回error怎么排查?

ping对应的ip,多半是ip地址写错了

  1. 如果ping出来的ip是127.0.0.1怎么办?

域名没被解析,肯定是对应的浏览器缓存映射(DNS)、或者本级host被修改,面试官说就是这个

  1. TCP流量控制是通过接收端发送带有接收窗口剩余大小的ACK来实现的,会不会因为接收窗口满了并且不能及时发送ACK导致数据丢失?
  • 《流量整形,延迟以及ACK丢失对TCP发送时序的影响》
  • ACK是发送端的时钟, 如果连续的ACK丢失了,就会出现一个ACK确认了大块数据的场景。由于前面ACK连续丢失,发送端久久未收到时钟反馈导致数据不能发送
  • 快重传机制
  • TCP重传计时器
  1. TCP流量控制,当发送方收到窗口为0的参数后,便不再发送数据给接收方。接收方有空间后,通过一个ack通知发送方窗口的大小,但是ACK有可能会丢失(ACK没有重传功能),发送方因为窗口时0,一直没有发送数据,所以无法得知最新的窗口大小,通信双方都进入了一直等待状态。

TCP为每一个链接设计了一个持续计数器,当窗口大小为0时,就会启动这个计数器,当计数器到期后会发送一个零窗口探测报文段(一个字节),接收方通过确认这个探测报文时可以告知发送方最新的窗口大小(TCP规定,就算窗口为0,也要接收零窗口探测报文)。

  1. TCP/IP四层协议栈和OSI五层模型,它们的区别是啥,为什么要划分这两个标准?
  • 应用层、运输层、网际层和网络接口层(链路层)
  • JAVA后端面经总结_第2张图片
  1. Socket三元组(ip + 协议 + 端口)是怎么保证传输到对方的,怎么回来的?
  • JAVA后端面经总结_第3张图片

六(2)、OS

  1. select,poll,epoll区别?

v

  1. select的大小可以调整么,怎么调整,select的缺点在另外两个里是怎么解决的?

v

  1. 同步非阻塞模型是怎么样的 ?

v

  1. IO多路复用是复用的什么?

线程

  1. 线程、进程、协程

v

  1. 进程间通信方式(7个),线程间?

v

  1. 进程拥有什么资源?

v

  1. 进程共享什么资源

v

  1. 进程线程的区别,线程共享进程的什么资源,进程独自占有什么资源 ?

v

  1. 进程地址分区
  1. 进程通信方式,共享内存怎么进行通信

v

  1. CPU上下文切换

《什么是上下文切换》
《深入理解Linux内核进程上下文切换》
《线程上下文切换详解》

  • CPU上下文:CPU 寄存器 和 程序计数器(PC)。
  • 上下文切换的步骤
    1.将前一个 CPU 的上下文保存起来;
    2.加载新任务的上下文到寄存器和程序计数器;
    3.最后跳转到程序计数器所指的新位置,运行新任务。
  • 被保存起来的上下文会存储到系统内核中,等待任务重新调度执行时再次加载进来。
  • CPU上下文切换分三种:进程上下文切换、线程上下文切换、中断上下文切换。
  1. 系统调用相关的上下文切换
  • 一次系统调用,发生两次 CPU 上下文切换,只涉及用户态和内核态。
  • 系统调用过程中,不涉及虚拟内存等进程用户态的资源,也不会切换进程
  • 系统调用过程中一直是同一个进程在运行。
  1. 进程上下文切换
  • 进程是由内核管理和调度的,进程的切换只能发生在内核态
  • 进程的上下文不但包括虚拟内存、栈、全局变量等用户空间资源,还包括内核堆栈、寄存器等内核空间状态
  • 保存上下文和恢复上下文需要内核在 CPU 上运行才能完成。
  1. 切换线程的上下文
  • 当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载恢复这个状态。
  • 任务从保存到再加载的过程就是一次上下文切换。
  • 线程上下文切换时,共享相同的虚拟内存和全局变量等资源不需要修改。
  • 而线程自己的私有数据,如栈和寄存器等,上下文切换时需要保存。
  1. 计算机的内存是怎么存在的
  • 计算机内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,内存性能的强弱影响计算机整体发挥的水平。
  • 计算机中所有程序的运行都在内存中进行,是CPU直接与之沟通,并用其存储数据的部件。
  • 内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
  • 物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路
  • ROM:只读存储器,所存数据稳定 ,断电后所存数据也不会改变;
  • RAM:随机存取存储器,在断电时将丢失其存储内容,故主要用于存储短时间使用的程序;
  • Cache:做在CPU里面的。
  1. 堆栈的区别说一说

v

  1. 局部变量和全局变量在内存中有什么区别

v

  1. Linux系统,运行Java程序是一个进程还是一个线程?

是一个进程,因为进程之间的通信也有共享内存,而两个main方法之间如果是分开的(不在一个项目上),想要进行通信,无疑是只有两种办法,一是通过本地JVM中的对象通过反射机制获取,二通过网络通信,所以是一个进程。

  1. 僵尸进程/孤儿进程?

v

  1. Linux的基本指令

v

  1. netstat做是什么用的,可以看到哪些参数?

v

  1. top命令能不能说一说

v

  1. 我想查端口占用情况用什么命令?

v

  1. Linux怎么查询24小时内修改过的文件?

find

  1. CPU 100% 问题排查

v

  1. 内存分页分段机制

v

  1. 计算机的虚拟内存

v

七、框架

  1. Spring、SpringMVC、SpringBoot 区别

v

  1. springboot都有什么优点,为什么可以快速开发,启动器里集成了哪些

v

  1. Spring-Boot都用到了哪些设计模式?

v

  1. mybatis怎么防止sql注入

v

  1. spring aop的底层原理,讲了动态代理和cglib代理

v

  1. Spring IOC和AOP 设计原理,为什么要这样设计

v

  1. Spring bean 的生命周期以及作用域

v

  1. Spring中常用注解

v

  1. Spring事务,传播特性

v

  1. Spring MVC 中后端处理流程

v

  1. Spring 启动流程
  1. spring @componentscan,是怎么扫描加载的?是直接把整个包加载到jvm吗?
  1. springboot内置tomcat如何做到的

v

  • EmbeddedTomcatServer类作为程序的入口,代码逻辑其实就是通过tomcat提供的外部接口类在配置server.xml这个文件。
  • 关键是在类ServletWebServerApplicationContext的onRefresh方法
  • Servlet3.0
  1. MyBatis二级缓存如何实现的?
  1. 二级缓存和一级缓存的区别是什么?
  1. Spring的事务不指定异常时在什么情况下会回滚?
  • 《Spring管理事务默认回滚的异常是什么?》
  • RuntimeException或者Error
  • 由源码决定——RuleBasedTransactionAttribute
  • rollBackFor:默认情况下是empty,默认情况下,如果是RuntimeException或Error的话,就返回True,表示要回滚,否则返回False,表示不回滚。

八、项目

  1. 排查一个问题:前端请求接口无响应

1.先看 nginx 和后端服务是否挂掉。
2.如果没有挂掉,看后端日志,根据日志异常排错。
3.如果根据日志没有找出问题,就本地复现。

  1. oAuth2.0

v

九、JVM

  1. 双亲委派和破坏双亲委派

v

  1. new一个对象的过程,从jvm层面阐述

v

  1. 所有new出来的对象都放在堆内存中吗?

不一定,如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配,这样就无需在堆上分配内存,也无须进行垃圾回收了。

十一、消息队列

  1. MQ的选型和各种MQ的区别

十二、分布式

  1. 负载均衡怎么实现的?有什么用?
  1. 微服务zookeeper、eureka、consul、nacos对比
  1. 微服务的好处,为什么不用本地调用,而要用微服务
  • 把一个应用程序开发为了一套小服务,每个服务一个进程
  • 可能分布在不同地域,容灾
  1. 微服务的业务模块拆分,为什么要这样拆分
  • 模块解耦
  • 服务降级/熔断的安全性
  • 可针对性地对并发量大的模块纵向扩展
  1. 网关模块的具体逻辑,为什么要用网关?
  • 抽象了微服务中都需要的公共功能,帮助解决很多API管理难题。
  • 客户端负载均衡、服务自动熔断、灰度发布、统一认证、限流流控、日志统计等丰富的功能。
  • 请求浏览的入口:路由转发、权限校验、限流控制。
  • API网关:所有的外部请求都会先经过 API 网关这一层,可以复用既有接口,保证了服务集群中REST API无状态的特点。
  • Route
  • Predicate断言
  • Filter
  1. zookeeper讲讲?CP还是AP?eruka呢? 服务调用需要ap还是cp?分析一下场景?
  1. 常见的限流算法?
  • 《限流算法与设计思路》
  • 《【算法设计】限流算法》
  1. 常见的限流方式?
  • Nginx
  • 网关

十三、Netty

  1. 知道protobuf吗?和json比有什么好处呢?

你可能感兴趣的:(面经,java,面试)