面试问题记录-24年增

https://segmentfault.com/a/1190000040927379

部分来源如上

wait 和sleep区别

241204准备

https://segmentfault.com/a/1190000040927379

描述线程的生命周期。

 

  • 什么是死锁?如何避免死锁?

多线程 / 获取共享资源 / 对资源加锁

避免方式:

1,不使用多线程,不同时获取多个共享资源(获取一个释放在获取另外一个),

2,少使用锁:

避免在多线程程序中使用过多的锁,减少加锁的复杂度,也能够减少死锁的发生几率。锁的使用越简单,死锁的可能性越小。

3,顺序获取资源

4,使用定时锁(Try-lock):以使用定时锁(如 ReentrantLocktryLock() 方法)来避免死锁

死锁条件:

互斥:一个资源只能由一个线程获取

持有等待:有一个,还想要更多

不能抢:持有不释放别人不能抢,不能抢别人的

循环等待条件

  • 什么是内存泄漏,如何避免内存泄漏?

java中内存泄露的例子,代码

 理解 

静态变量的生命周期与整个应用程序一致

  • 什么是JVM的内存模型?描述堆内存和栈内存。

 垃圾回收器

多线程收集+减少服务停顿时间+并发(垃圾收集线程与程序线程同时执行,服务不停顿)

一文彻底搞懂八种JVM垃圾回收器_说一下 jvm 有哪些垃圾回收器?-CSDN博客

 

1,Springboot 自动装配过程

以redis为例

2,Springboot 自定义 start

步骤 1:创建一个新的 Maven 项目

步骤 2:在 pom.xml 中配置 Starter 依赖

步骤 3:创建自动配置类

步骤 4:创建 spring.factories 文件

步骤 7:在 Spring Boot 应用中使用自定义 Starter

自定义 Starter 的关键点在于:

  1. 自动配置类:负责配置 Bean 和功能。
  2. spring.factories 文件:告知 Spring Boot 启动时加载自动配置类。
  3. 依赖管理:通过 Maven 来管理所需的依赖。

3,hashmap

3.1 ConcurrentHashMap 

ConcurrentHashMap原理详解(太细了)-CSDN博客

区别

null问题

红黑树二叉树 B+树的区别。

为什么使用红黑树,不使用普通的二叉树。

https://zhuanlan.zhihu.com/p/152599308

4,JVM/ArrayList/JMM 内存屏障

万字总结什么是JMM、内存屏障及其原理_jmm内存屏障-CSDN博客

5,垃圾回收

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 & 垃圾回收定位清除算法 & JVM中的垃圾回收器_java的内存模型以及gc算法-CSDN博客

6,:AQS 实现,公平锁/非公平锁,synchronized 和 lock 的区别,synchronized 锁演化过程

一般从 AQS 谈起,这个和 HashMap 一样一定要通读源码,知道每一个方法的名字和过程,和集合类同样重要。

即使没有问你,你最后也可以对比下 synchronized 和 lock 和 LockSupport,显得 JUC 下面都精通。

还有这三个 CountDownLatch_CyclicBarrier_Semaphore,一般会问使用场景,要了然于胸

6.1 synchronized 和 lock 的区别

6.2 synchronized 锁升级过程,要详细

个人总结

偏向锁:线程:一个线程;目的:避免重入锁的开销;方式:标记为当前线程

轻量级锁:

线程:有竞争,轻微竞争,至少两个线程,多线程;

目的:避免直接进入重量级,减少上下文切换;

方式:CAS,线程会尝试使用CAS操作将锁标志位从未锁定状态(UNLOCKED)设置为锁定状态(LOCKED

是否阻塞:竞争激烈时,不直接阻塞,先自旋,不行了,再升级为重量级锁;

自旋:如果线程在尝试CAS操作时发现锁已经被其他线程获取(即锁的标志已经被改变),它会发生锁竞争,进入自旋阶段。自旋时线程会在CPU缓存中持续尝试获取锁,不会立刻阻塞。

升级重量级:如果锁的竞争变得非常激烈,经过一定次数的自旋后,轻量级锁会升级为重量级锁(即操作系统的互斥量)。这个过程涉及到线程的阻塞和上下文切换,代价相对较高。 

重量级锁:竞争激烈,

实现方式: 重量级锁使用的是操作系统的互斥量,获取锁时线程会被挂起,直到锁被释放

阻塞:线程会进入阻塞状态

6.3 synchronized 加锁原理

总结:

对象 - 》 监视器锁 -〉监视器锁实现原理是:对象头与锁状态(偏向,轻量级,中)-》

mark_word(对象头部分),存状态

7,AQS

1.5w字,30图带你彻底掌握 AQS!(建议收藏)-阿里云开发者社区

Lock -> AQS -> 管程 

state / 等待队列 / CAS

【源码解析】35张图详解 AQS底层原理_java aqs底层原理-CSDN博客

cas源码

 队列

双向链表

非公平锁实现 

 三步:

tryAcquire:cas再次尝试获取锁,

addWaiter:加入队列
acquireQueued:unsafe.park

Java类加载机制?双亲委派模型的好处?


网络IO模型?什么是多路复用IO?select和epoll的差别?


阻塞 I/O(Blocking I/O):

什么时候多线程会发生死锁?怎么来预防

什么是操作系统的用户态和核心态,,,切换条件以及为什么要切换

 数据库事务特点?事务隔离级别?项目中的事务实现?脏读、不可重复读、幻读各举个例子?

数据库索引?B+树?为什么要建索引?什么样的字段需要建索引,建索引的时候一般考虑什么?索引会不会使插入、删除***作效率变低,怎么解决(分表***作)?

设计模式,单例模式,怎么保证线程安全?锁效率太低,怎么提高效率? 

十大经典排序算法(Java实现)_java基础排序算法-CSDN博客

CAS
https://blog.csdn.net/zsr6135/article/details/120822804
乐观锁,原子性,Unsafa 底层由硬件资源控制,ABA,版本号,没有加锁,自旋

如何利用redis处理热点数据?

可能是某个产品的详情、用户的缓存信息等

淘汰策略/LRU缓存策略 / Zset热点数据排序/发布订阅更新/预热机制:job / 系统启动初始化

缓存雪崩/击穿 @设置不同的过期时间 / 双检锁

redis 的IO多路复用中select poll epoll之间的区别?

select底层是数组,有1024连接数限制,每次都需要讲fds从用户态拷贝到内核态,在内核态进行判断完成后,再从内核态拷贝至用户态,采用轮询遍历fds,造成资源浪费。复杂度是O(N)。 poll底层是链表,虽解决了连接数的限制,但还是避免不了轮询遍。复杂度是O(N)。 epoll底层是双链表+红黑树结构,采用了事件回调机制,会将事件注册到内核态中,内核态完成会进行回调通知。复杂度是O(1)

redis 过期和淘汰策略

 

谈谈你的SOA以及微服务的理解?

分布式的cap了解么,分别指什么?

网络编程nio和netty相关,netty的线程模型,零拷贝实现?
@my理解 线程/IO操作,阻塞与非阻塞(针对线程,请求方,无响应线程是否可以进行其他操作),同步与异步(针对请求提供方),

IO多路复用,一个线程,多个连接请求,可以在一个线程中同时处理多个 I/O 事件,select poll epoll,底层数组/链表/链表/红黑树,文件大小限制1024,遍历复杂度O(n),并发度

零拷贝:用户态,内核态

https://segmentfault.com/a/1190000044596986

跳表的查询过程是怎么样的,查询和插入的时间复杂度?

跳表 (图解)_跳表查询过程-CSDN博客

一种数据结构,二分法查找,基于链表,提取数据到上一层,索引,场景:Zset

ThreadLocal:也是要看源码,还可以结合 4 大引用类型,堆内存泄漏使用,还有使用场景

场景:调用第三方接口,限制调用次数;接口异常,ESB参数复杂,AOP,记录异常日志

ThreadLocal -》内部类  ThreadLocalMap -> 内部类Entry ->Entry<key ,value>

key = ThreadLocal,value = 要存入的值

ThreadLocalMap = 与Thread 关系,前者是后者的一个属性

源码

Spring 循环依赖

高频面试:Spring 如何解决循环依赖?

java事物失效的场景

Java异常的分类和类结构图_异常分类图-CSDN博客

mysql

聚集索引/非聚集索引的区别

https://zhuanlan.zhihu.com/p/351240279

 

mysql 存储底层结构,页和节点和数据之间关系

Redis

  • redis 的数据类型: 5 大常用 3 个不常用的,然后结合使用场景都说下。

Zset:经理排行,排序分页,报表排队

set:抢单列表

hash:门店商品

list:缓存最新访问记录

redis穿透,击穿,雪崩

雪崩:原因:同一个时间,redis大量过期,大并发访问数据库,导致数据库压力过大,宕机或性能下降;解决方案:过期时间均匀分布

@其他方案:缓存预热;双检锁;案例:电商商品信息缓存

穿透:缓存中和表中都不存在。@解决方案:校验参数,缓存null,布隆过滤器

击穿:从量上来说,某一个key过期或者不存在,被频繁攻击,方案:双检锁,合理设置过期时间,为啥会过期。

如:某商品详情过期,大量请求,导致数据库压力

redis淘汰策略和删除策略?

删除策略:前提:已过期;方式:job主动查看/获取时检查(惰性删除)

淘汰策略:前提:内存满了;方式:1,LRU最近最少使用(分已过期未过期两种),2,最近使用频率低,3,随机删除(已过期或者未过期),4,TTL(Time-to-Live),删除剩余过期时间最短的

RedLock

https://zhuanlan.zhihu.com/p/374732293

 MQ

rabbitmq

之前

------------------------------------------------

redis
分布式锁,一致性hash
https://www.cnblogs.com/javazhiyin/p/13839357.html

设计模式
算法
String @

mysql

缓存对比

jvm

 IO
 
 springboot
 https://www.jianshu.com/p/5901da52ca09
 
 
 springCloud
 https://blog.csdn.net/oldshaui/article/details/906751
 https://blog.csdn.net/panhaigang123/article/details/79587612?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=415be9bb-b6c2-463a-9544-fd13828d1970&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
 
 E fe conf zull his ribbon
 
 mysql
 

jvmn内存模型,类加载,性能调优

动态代理 与静代理 机制

https://blog.csdn.net/weixin_42719412/article/details/85282535

配置中心

ams

反射
https://blog.csdn.net/qq_39565307/article/details/102967762

主线程

子线程 主线程怎么保证子线程执行完在走
https://blog.csdn.net/m0_37125796/article/details/81105099

aop 依赖注入
https://blog.csdn.net/weixin_42719412/article/details/85282535

https://blog.csdn.net/qq_17555933/article/details/9244195

依赖注入与控制反转
https://www.sohu.com/a/230849961_100109711
https://blog.csdn.net/qq_17555933/article/details/92441957

循环依赖问题
https://www.cnblogs.com/wjxzs/p/14239052.html

Kafka
https://www.cnblogs.com/sujing/p/10960832.html

https://blog.csdn.net/suifeng3051/article/details/48053965

顺序消费
https://blog.csdn.net/qq_31329893/article/details/90451889
https://blog.csdn.net/u011439839/article/details/90349596?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=5d2fbcaf-8ebf-47c8-81e8-c70af2b7bd7d&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

rocketmq

https://www.cnblogs.com/qdhxhz/p/11094624.html

hashMap
https://www.toutiao.com/i6930953980453470724/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1614067064&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=2021022315574401013509807542001E70&share_token=2747d4d2-bdf0-4dd0-8154-cba9846aaf42&group_id=6930953980453470724

垃圾回收
https://www.toutiao.com/i6828436496907764235/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1614124468&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=20210224075427010130037136191354DF&share_token=f2be1ea5-bde7-414a-babf-fd42c36ed4d2&group_id=6828436496907764235

缓存穿透
https://weixin110.qq.com/cgi-bin/mmspamsupport-bin/newredirectconfirmcgi?main_type=1&evil_type=110&source=2&bancode=83f6a5515ac2c5310595fce64d4c7fda1c48747457c047ee60b9293c1b00beab7b026eb7128ad71b5ddcc95ca3c84549561f0c554c45a8a7d183f8ce9c923584821fb758f069d5107fb4a45a3e7ce02df730abbb1b0d79f0b8cd31349eac8bb2e4809500e9c7fbd299a76d51aa346776&scene=1&devicetype=Windows+10+x64&click=58fe4aaa7eaf88163cafa033a322fbd5

内存模型
https://www.toutiao.com/i6629813495053419016/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1614127038&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=202102240837180101351631005114621C&share_token=10355b47-1c09-407c-9399-e2962b2f8043&group_id=6629813495053419016

基本面试
https://www.cnblogs.com/51ma/p/12462688.html

死锁
https://blog.csdn.net/jonnyhsu_0913/article/details/79633656


spring
ioc底层原理:工厂,反射。Bean管理
bean生命周期
循环依赖问题
Bean Factory 与Factory Bean
spring中用到设计模式
AOP底层原理:动态代理 有接口(JDK动态代理)
事务传播

@Nullable
函数式编程
创建对象,给spring管理
webFlux,响应式编程 基于sevlet3.1以后才支持,核心基于Reactor的api实现
传统web springmvc 基于sevlet容器

异步非阻塞
同步 异步,调用者发送请求,是否等对方回应,再去做其他时间。
阻塞 非阻塞
被调用者,收到,立马回应,再去做,非阻塞
相比springmvc
1.非阻塞,有限资源,提高吞吐量,基于Reactive
2.函数式编程 java8,实现路由请求
mvc命令式编程


 数据库四大特性和四种隔离
https://www.cnblogs.com/liangyc/p/11631718.html
spring事物传播行为
https://www.nowcoder.com/test/question/done?tid=50427719&qid=14942#summary
Servlet的生命周期

Servlet的生命周期
1.加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
2.创建:通过调用Servlet的构造函数来创建一个Servlet实例
3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
4.处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的
Service()方法来响应客户端请求(Service方***根据请求的method属性来调用doGet()和doPost())
5.卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
发表于 2016-01-13 21:49:25
回复(0)

sleep()和wait()
https://www.nowcoder.com/test/question/done?tid=50427719&qid=15267#summary

Java里String str = new String(“Hello“);会创建几个对象?
https://blog.csdn.net/C18298182575/article/details/121667672
虚拟机内存主要分为三块:

    堆:存放对象实例和数组。
    栈:存放基本类型,以及对象的引用。
    方法区:“类”被加载后的信息,常量、静态变量存放在这儿。


二叉树 极端情况变成链表
平衡二叉树 左右高度不超过1,弊端 同二叉树一个节点只存了一个键值,导致节点很多,很高,很多磁盘IO
B树 一个节点 相当于一页page 一个节点存储多个数据(key),一个节点包含多个子节点
B+树  非叶子节点不存数据,只存键,叶子节点存键值(包含数据),所以每个节点(一页默认16kb,可以存储更多键值)可以存储更多的键,页之间通过双向链表关联,每一页通过单向链表关联


while 和 do...while 的区别:
while:   先判断 再执行   条件不成立   循环体 一遍都不执行   
do...while: 先执行 再判断  条件不成立  循环体 至少执行一遍

@Autowired单例,默认饿汉式
Spring为什么不推荐使用@Autowired注解详析
https://blog.csdn.net/buduoduoorg/article/details/121124962
servlet 生命周期
https://baijiahao.baidu.com/s?id=1684616619505078970

String类方法
trim eq sub replace index getByte split startwith endwith length hashcode cocat cotain chartAt toLowerCase upper isEmpty

NIO AIO
BIO 一个客户端连接,一个服务端线程;每个客户端连接请求,服务端都需求创建一个线程处理,连接无请求,服务端造成不必要开销
NIO 一个请求,一个线程,一个线程处理多个客户端连接,多路复用器,连接有请求才开启线程去处理
AIO 同NIO 服务器异步处理

源码 jre编译器 字节码(虚拟机识别) 虚拟机加载 解释器(jvm) 机器码(二进制) 不同平台运行     

多态
Java中的多态靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

session共享
https://blog.csdn.net/grabungen/article/details/91950667
tcp udp 建立连接,可靠,三次握手四次挥手,传输字节流; upd 没有,实时性高,丢包 直播,视频,传输报文,只发,不管是否收到
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html

算法 
统计字符串中出现频率最高的字符

设计模式原则
单一,开闭 隔离 季米特法则,里氏替换 子类替代

controller单例
https://www.cnblogs.com/mjtabu/p/14413233.html

String a = new String(abc);
https://www.cnblogs.com/taochen-go/p/9475947.html 这里s2不对,应该是栈中地址
https://blog.csdn.net/csdn_yaohailong/article/details/98969542

Lock synchronized
https://blog.csdn.net/zhang1314fudao/article/details/89424758
s 是内置的,java关键字,lock是一个类
都是可重入锁,Reetrantlock
释放锁 异常,程序执行完自动释放,阻塞无法释放sleep,lock手动释放(finally,异常不会释放锁)
lock 可知道是否获取锁,有等待时间,更多方法,读写锁(s获取锁,其他线程只能等待,lock多线程读写),中断锁(其他持有锁,不等待)
持有成员变量锁,不能持有方法级别锁
sy非公平锁,按请求锁的顺序,持有锁,lock 可设置公平锁,默认非公平锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值