三、多线程和Java锁
===========
-
线程池的三大方法、七大参数、四种拒绝策略(可以顺带谈一下阿里巴巴开发手册对于线程池使用的规范)
-
最大线程数如何定义?(从CPU密集型和IO密集型考虑)
-
线程池的五种状态(Running、Shutdown、Stop、Tidying、Terminated)
-
线程池的任务执行流程、excute方法和 submit方法的区别?
-
Synchronized锁和Lock锁的区别
-
Java线程虚假唤醒(线程本应该处于wait状态却被唤醒了,解决方案是wait方法应该用while循环包裹,不用if)
-
JMM的三种特性(原子性、可见性、有序性)、主内存和线程工作内存的八种交互动作
-
volatile如何保证可见性(MESI缓存一致性协议)
-
volatile如何保证有序性(内存屏障——lock前缀指令)
-
synchronized和volatile的区别(volatile是一种非锁机制,这种机制可以避免锁机制引起的线程上下文切换和调度问题。因此,volatile的执行成本比synchronized更低;volatile只能保证可见性有序性;synchronized可以保证原子性可见性有序性)
-
JUC包中的原子类如何保证原子性?(CAS机制和自旋锁)
-
CAS机制,会引发什么问题,如何解决ABA问题?(CAS会导致ABA问题,解决ABA问题是使用版本号机制)
-
悲观锁和乐观锁的区别,应用?(java中的Synchronized关键字和lock锁使用的都是悲观锁;CAS机制是乐观锁的一种实现方式)
-
公平锁和非公平锁(公平锁按照先来先服务,不会出现饥饿;非公平锁会导致饥饿,但是效率更高,默认的锁都是非公平的)
-
自旋锁和互斥锁,自旋锁的优缺点?(优点:减少上下文切换和用户态内核态的切换带来的开销;缺点:循环等待消耗CPU)
-
可重入锁和不可重入锁(不可重入锁容易导致死锁发生,大多数锁都是可重入的,例如Synchronized锁和ReentrantLock)
-
JDK1.6 Synchronized锁升级(偏向锁—轻量级锁—重量级锁)
-
Synchronized锁的底层实现,锁的是什么,其它线程如何判断该锁已经被占用了?
-
死锁产生的四个必要条件以及死锁的处理策略
四、Mysql
=======
-
Myisam和InnoDB存储引擎的区别?(Myisam不支持外键也不支持事务,支持的是表锁,当执行select操作时,自动给涉及的表加表锁,当执行增删改操作,自动给涉及的表加写锁;InnoDB支持外键也支持事务,支持的是行锁,当执行select操作时,不加任何锁,当执行增删改操作,自动给涉及的行加写锁)
-
间隙锁是什么?行锁升级为表锁的情况?
-
InnoDB的行锁有哪些?锁住的是行还是索引?(Record Lock、Gap Lock、Next-Key Lock;锁住的是索引,而不是行)
-
为什么可重复读隔离级别也可以解决幻读?(通过Next-Key Lock可以消除幻读)
-
并发事务处理带来的四种问题和事务的隔离级别(丢失更新、脏读、不可重复读、幻读;读未提交、读已提交、可重复读、串行化)
-
如何理解Mysql默认的事务隔离级别可重复读?
-
事务的ACID属性是如何实现的?(原子性通过回滚日志undo log实现;持久性通过重做日志redo log实现;隔离性通过锁和MVCC实现;而一致性则是通过原子性、隔离性、持久性来实现,只有满足这三个特性,才能实现事务的一致性)
-
聚簇索引、非聚簇索引、回表查询、覆盖索引;
-
索引失效的情况?(违反最左前缀法则、范围查询右边的列索引失效、字符串不加单引号、对索引列进行运算、头部模糊匹配、使用不等于!=或者<>)
-
explain分析执行计划、SQL语句的优化
-
mysql三大范式(1NF即原子性,2NF即消除部分依赖,3NF即消除传递依赖)
-
mysql索引的底层实现,为什么用B+树不用B树?(B+树IO次数更少、更适合范围查询、查询效率更加稳定)
-
哈希表查找速度不是更快吗,为什么不直接使用哈希表来做索引的底层数据结构?(哈希表不支持范围查找)
五、Redis
=======
-
Redis五种基本数据类型的使用场景
-
缓存穿透、缓存击穿、缓存雪崩
-
Redis的过期策略和内存淘汰机制
-
Redis的zset底层数据结构,为什么用跳跃表而不用红黑树
六、框架相关
======
-
Spring AOP的实现原理?(基于动态代理模式,如果目标类实现了接口,那么使用基于接口的动态代理,否则使用基于子类/cglib的动态代理)
-
Spring AOP 的具体加载步骤?
-
AOP和OOP的区别,分别适用什么场景?
-
Spring Bean的作用域,Spring Bean的生命周期(Bean的实例化—初始化Bean—使用Bean—Bean的销毁)
-
Spring容器创建对象的两种时机,各有什么优缺点?(一是Spring容器启动时创建Bean,二是调用getBean方法时创建)
-
SpringMVC的执行流程(可以顺带讲一下适配器模式)
-
Mybatis的一级缓存和二级缓存?
-
Mybatis中#和$的区别?
-
Mybatis如何实现批量插入?
-
Mybatis的xml文件中,sql语句可以使用直接使用大于号小于号吗?应该用什么符号代替?
七、设计模式
======
-
代理模式(应用:一是创建多线程的方式之使用Runnable接口应用了静态代理;二是Spring AOP应用了动态代理)
-
适配器模式(应用:一是创建多线程的方式之使用Callable接口;二是SpringMVC中的HandleAdapter)
-
工厂模式(应用:一是Spring IOC;二是Mybatis中的SqlSessionFactory就用到了简单工厂模式)
-
单例模式(一般会需要手撕单例模式的代码,主要谈DCL模式关于指令重排的问题,以及反射可以破坏除枚举以外的几种方式;单例模式的应用有:一是Spring Bean的作用域默认就是使用单例模式;二是Mybatis中的ErrorContext类也使用了单例模式,这个类用于记录线程执行环境的错误信息)
-
装饰器模式(应用:JAVA的IO流就用到了装饰器模式)
-
装饰器模式和代理模式的区别?
-
策略模式(应用:Arrays类的sort方法就用到了策略模式,Comparator接口就是一个策略接口,将排序方法定义成一个策略,用户可以自定义排序策略,可以是升序也可以是降序)
-
观察者模式与发布订阅模式的区别?(JDK源码已经为我们提供好了一套观察者模式,Observer就是观察者接口,Observable类是被观察者,是一个具体类,提供了一个存放所有观察者角色的集合,并且也提供了添加观察者、移除观察者、通知观察者等方法)
八、网络
====
-
TCP三次握手和四次挥手的过程,每次发送的包的内容,客户端和服务端的状态?
-
TCP三次握手可以携带数据吗?TCP协议运行时阶段?
-
为什么是三次握手,可以四次握手或者两次握手吗?
-
为什么握手是三次,而挥手要四次?
-
TCP四次挥手为什么需要TIME-WAIT阶段等待2MSL,是哪一方有TIME-WAIT阶段?(主动释放释放连接的那端)
-
TCP的长连接和短连接
-
半连接队列和全连接队列,什么是syn flood攻击,如何应对syn flood攻击?
-
在浏览器中输入一个网址回车后发生了什么?
-
域名解析过程的递归查询和迭代查询
-
浏览器输入一个网址之后,按照TP/IP参考模型,从应用层到网络层各使用了哪些协议?
(应用层:HTTP、DNS;传输层:TCP、UDP;网络层:IP、ICMP、ARP)
-
ICMP协议的两个应用——Ping和Traceroute
-
IP地址和MAC地址有什么区别?
-
http和https的区别
-
网站为什么要使用cookie和session;cookie和session有什么区别?
-
get请求和post请求的区别?
-
TCP和UDP的区别以及各自的应用场景?
-
epoll和select的区别?
九、JVM
=====
-
JVM内存模型(程序计数器、虚拟机栈、本地方法栈、堆、方法区)
-
JDK1.8做了哪些变化?(JDK1.7已经将原本位于永久代的字符串常量池移到堆中了,但是永久代的概念还存在,JDK1.8才彻底废除永久代,进而用元空间代替)
-
永久代和元空间,JDK1.8为什么要使用元空间代替永久代?
-
元空间溢出?(元空间不属于Java虚拟机,使用的是本地内存,存放的是类及方法的一些信息,动态加载类或者频繁加载类信息,但是没有及时卸载,会导致元空间溢出)
-
对象创建的两种方式(指针碰撞、空闲列表)、对象访问定位的两种方式(使用句柄、直接指针)
-
栈上分配与逃逸分析(JVM层面进行java性能优化的技巧)
-
判断对象是否存活的两种方式,引用计数法的缺点?(引用计数法、可达性分析法)
-
关于Object类的finalize()方法(jvm自动执行,无需手动调用,只能执行一次).
-
java的四种引用(强引用、软引用、弱引用、虚引用)
-
三种垃圾回收算法,各自的优缺点(标记-清除法、标记-复制法、标记-整理法)
-
Minor GC 和 Full GC 的区别,触发条件,以及空间分配担保策略?
-
内存溢出和内存泄露(内存泄露的堆积会导致内存溢出)
-
JVM参数调优(-Xms、-Xmx、-Xss、-XX:NewRatio、-XX:SurvivorRatio、-XX:+PrintGCDetails、-HeapDumpOnOutOfMemory)
-
发生OOM如何解决(首先尝试通过JVM参数调优扩大堆内存空间;再者dump出堆内存存储快照,使用JProfile工具进行分析)
-
垃圾收集器(CMS问的居多,另外,如果谈及发生gc会给用户带来什么不好的体验,可以谈谈Stop the World)
-
类加载机制的过程,准备阶段做了哪些工作?(准备阶段会给类的静态变量分配内存(方法区)并赋初值,如果类的静态变量被final修饰,那么初始化的值就不是零值,而是声明的值)
-
类的双亲委派模型定义,双亲委派模型的好处?如何破坏类的双亲委派模型?
十、操作系统
======
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
知其然不知其所以然,大厂常问面试技术如何复习?
1、热门面试题及答案大全
面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer
2、多线程、高并发、缓存入门到实战项目pdf书籍
3、文中提到面试题答案整理
4、Java核心知识面试宝典
覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
、Hadoop、Spark、Storm的大量技术点且讲解的非常深入**
[外链图片转存中…(img-RB6jAxR5-1713304988799)]
[外链图片转存中…(img-yllgQLNp-1713304988799)]
[外链图片转存中…(img-RZCoMst0-1713304988799)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!