面试常见:
Jvm,高并发,多线程,数据库,redis,框架
1.N I/O有什么核心组件
Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客
Buffer 缓冲 Channel 一对一 Channel 读取数据
Selector对应线程池 (环形链表)
2. Select Poll Epoll区别
用户空间(用户需要的数据)和内核()
select 交换两次
poll 优化大小限制
epoll 交互的次数 0拷贝 直接用户空间和用户空间
3.Http和Https的区别
HTTP 与 HTTPS 的区别 | 菜鸟教程 (runoob.com)
http超文本传输协议
https超文本传输安全协议 比如银行和金融
http是一个简单的无状态的 https是通过加密的,安全性高
http是免费的
他俩传输协议和端口号不一样
https端口号443 redis端口6379 mysql端口3306 ssh端口21
缺点:
https握手 不完全安全 涉及CA(Certificate Authority,数字证书认证机构) 申请证书
4.Jvm的结构
5.Java类加载的全过程
一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为链接(Linking)。
6.(jvm)一个对象从加载到jvm开始到GC回收,经历的过程是什么
JVM基础 -> ⼀个对象从加载到JVM,再到被GC清除,都经历了什么过程?_普通对象到第一次gc经理什么-CSDN博客
⼀个对象从加载到JVM,再到被GC清除,都经历了什么过程?
⾸先类加载器把
字节码⽂件内容加载到⽅法区
,当然类加载器这中间用双亲委派机制
加载然后再根据加载完方法区中的类信息在堆区
为对象分配内存丶初始化零值丶设置对象头执行 init 方法
- 分配内存: 确定大小的内存从 Java 堆中划分出来
- 初始化零值: 将分配到的内存空间都初始化为零,这样对象只定义,不初始化也可以用
- 设置对象头: 对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等
- 执行 init 方法: 最后就是调用构造方法了,初始化对象,完成创建
对象⾸先会分配在
堆内存中新⽣代的Eden
。
- 小对象分配在
新⽣代的Eden
。然后经过新生代GC
,对象如果存活,就会进⼊S区。
- 在后续的每次GC中,如果对象⼀直存活,就会在S区来回拷⻉,每移动⼀次,年龄加1。
- 多⼤年龄才会移⼊⽼年代? 年龄最⼤15, 超过⼀定年龄后,对象转⼊⽼年代。
- 对象够大,分配在
老年代
- JDK 6 之前存在空间担保 -> 老年代保证我会保留一个连续内存大小的内存空间
- 如果内存不够,你就可以FullGC,还不够内存溢出
- 如果内存够,那就存进去
- JDK 6 之后 -> 老年代的连续空间大于
新生代对象总大小或者历次晋升的平均大小(动态年龄)
- 如果内存不够,你就可以FullGC,还不够内存溢出
- 如果内存够,那就存进去
当创建对象的⽅法执⾏结束后,栈中的指针会先移除掉了,对象就没有
GC Roots
根节点的引用了然后GC根据
可达性分析法
,判断对象是否可以被回收最后GC线程
调用合适的GC算法
清理掉可回收的对象
总结
1.创建对象的时候,jvm在方法区寻找对象相关信息,然后创建对象
2.在堆里面创建对象,是半初始化状态
3.对象首先会分配在堆内存中新生代Eden
4.当创建对象的⽅法执⾏结束后,栈中的指针会先移除掉了,对象就没有GC Roots
根节点的引用了
5.然后GC根据可达性分析法
,判断对象是否可以被回收
6.最后GC线程调用合适的GC算法
清理掉可回收的对象
7.怎样确定这个对象是否被回收
Java垃圾回收机制(如何判断一个对象是否该回收)_3.java垃圾收集机制,并描述垃圾收集器如何判断一个对象是否能被收集。-CSDN博客
1.引用计数法
计数器为0,等于垃圾,被回收
给对象增加一个计数器,当有引用它时,计数器就加一,当引用失效时,计数器就减一;
2.根可达性分析法
Java则是用了这种方法来判断是否需要回收对象;
此算法的核心思想为 : 通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象到GC Roots没有任何的引用链相连时(从GC Roots到这个对象不可达)时,证明此对象是不可用的;
8.Jvm有哪些垃圾回收算法
JVM的4种垃圾回收算法、垃圾回收机制与总结_jvm垃圾回收机制有几种-CSDN博客
1.标记清除算法
2.标记复制算法(拷贝算法)
3.标记整理算法
4.分代收集算法
5.增量收集算法
6.分区算法
9.什么是STW,我们能避免它吗?
不能避免,可以进行优化
STW,即Stop-The-World
的缩写,指的是系统在执行特定操作时需暂停(停止)所有应用程序线程。
JVM的4种垃圾回收算法、垃圾回收机制与总结_jvm垃圾回收机制有几种-CSDN博客
JVM对垃圾回收站进行算法处理的时候,STW是把jvm内存冻结的一种状态,在这个状态下,java所有线程都是停止状态,除了GC。
10.如何进行jvm调优,jvm的参数有哪些
Jvm调优,一中是标注指令,一种是非标准指令,还有不稳定参数。
标准指令是-开头
非标准指令 -x
java -XX:+PrintCommandLineFlags : 查看当前命令的不稳定指令。
java -XX:+PrintFlagsInitial : 查看所有不稳定指令的默认值。
java -XX:+PrintFlagsFinal: 查看所有不稳定指令最终生效的实际值。
9.MQ是什么?有什么作用
MQ是消息队列,先进去的先出去的数据结构,消息由生产者生产,排队,由消费者进行处理。
作用:
1.异步,作用是提高系统的响应速度和吞吐量
2.解耦,减少服与服的耦合度,减少响应时间,提高性能稳定性和可扩展性
3.削峰,稳定系统对突发流量的处理
应用场景:电商,用户要求响应时间短的类型
10.如何进行MQ产品的选型
MQ选型:ActiveMQ、RocketMQ、RabbitMQ、Kafka对比_rocketmq和rabbitmq哪个用的多-CSDN博客
MQ目前的产品RocketMQ,RabbitMQ,Kafka,ActiveMQ
Kafka
优点 吞吐量大,性能大,集群高可用
缺点 会丢失数据,功能单一
使用场景 日志分析 大数据采集等
RabbitMQ
优点 消息可靠性高,功能全面
缺点 吞吐量低 消息积累会严重影响性能 使用的是erlang语言(不好定制)
使用场景 小规模的场景
RocketMQ
优点 高吞吐 高性能 高可用 功能非常全面
缺点 开源版不如商业版功能 官方文档和周边不够成熟
使用场景 都可以用
11.如何能保证消息不丢失
1.生产者发送消息不丢失
1.消息发送给与反馈
2.手动开启事物保证消息不丢失
3.Publisher Confirm 发布确认的方式
2.同步不丢失
1.同步会丢失,异步不会丢失,采用异步的方式
2.消息存盘,保存在磁盘上面,发布一条后,再删除
4.消费者不丢失,采用默认方式消费
5.手动提交
12.如何保证消息消费的幂等性
消息中间件(三)------如何保证消息幂等性_如何保证消息的幂等性-CSDN博客
1.消息给与唯一的标识
13.如何保证消息的顺序
线程取模
14.如何保证消息队列的高效读写
上图 用到了4次拷贝 提高效率 做到0拷贝
0拷贝不经过用户态 用户空间
MappedByteBuffer
FileChannel
mmap
使用小文件操作 不超过2G
transfile
没有文件限制
15.MQ如何保证分布事物的最终一致性
RocketMQ事务消息如何保证数据的最终一致性_rocketmq 一致性-CSDN博客
1.生产者保证100 的头列
2.消费者保证幂等性消费,不然会造成重复消费和多次消费
16.让你去设计MQ你会怎么去设计?
1.实现一个单机队列的数据结构,是高效的,可扩展的
2.把单机队列拓展成可分布式的 集群进行处理
3.定制的一个策略,根据主题进行消息定制 (根据主题发送消息策略)I/O 实现0拷贝
4.实现一些高效的读写
17.为什么使用缓存
缓存具有高性能, 高可用的特性 ,减少对数据库的直接访问,比如连接次数
18.缓存穿透,击穿,雪崩
1.缓存穿透(恶意攻击,数据库没有值)
缓存,数据库都查询不到数据
解决方法
1.缓存空值
2.设置访问名单
3.采用布隆过滤器 (空间查询效率高)
4.进行实时监控
2.缓存击穿(数据库中有值)
给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。
解决方案:
1.设置热点缓存永不过期
2.预设热门数据
3.设置实事监控
4.互斥锁
5.逻辑穿透
雪崩
缓存大量过期,导致请求直接访问数据库,导致雪崩
解决方法
1.添加多级缓存
2.设置更新标识缓存
3.将缓存过期时间分散
4.锁,队列的机制