2021面试题整理

linux系统内核态和⽤户态是什么,有什么区别?
    1.用户空间指的是用户可以操作和访问的空间,这个空间通常存放用户自己的数据等;
    2.内核空间指的是系统内核可以操作和访问的空间,这个空间存放系统内核的函数、接口等数据;
    3.程序在在用户空间中执行程序,我们把此时运行的程序成为用户态,而当程序在内核空间执行的时候,这种状态成为内核态;
bio、nio、aio都是什么,有什么区别?
    1.bio,同步阻塞io,一个连接一个线程,即客户端有连接请求时服务端就需要启动一个线程进行处理,如果这个线程不做任何事情就会造成不必要的线程开销;
    2.nio,同步非阻塞io,客户端和服务端通过channel通讯,一个请求一个线程,即客户端发送的连接请求都会注册到io多路复用器上,io多路复用器轮询io的文件描述符,有io事件的时候才启动一个线程进行处理;
    3.aio,异步非阻塞io,基于事件和回调机制,一个有效请求一个线程,客户端的io事件先由内核线程处理就绪,将数据拷贝到用户空间之后,再通知服务端启动线程进行处理。
tcp和udp的区别?
    1.tcp向上层提供面向连接的可靠服务,udp向上层提供无连接不可靠服务;
    2.udp的传送速度比tcp快;
    3.tcp是一对一连接,udp是一对多或多对多连接;
    4.tcp是面向字节流,实际上tcp把数据看成一连串无结构的字符流,udp是面向报文;
详细叙述tcp3次握⼿,3次握⼿的具体实现逻辑,tcp和http的区别?
    1.客户端发送syn连接请求(syn=1,seq=k);
    2.服务端响应ack(syn=1,ack=1,seq=f,ack=k+1);
    3.客户端响应ack(ack=1,seq=k+1,ack=f+1);
    4.http协议:超文本传输协议,对应于应用层,是基于tcp协议实现的,主要解决数据包装问题,tcp协议,对应传输层,主要解决数据在网络上中传输的问题,socket,是对tcp/ip协议的封装,本身并不是协议,而是一个api,类似http的httpclient,通过socket、httpclient,我们才能使用tcp、http;
    5.socket是长链接,http是短链接;
第三次握手的作用是什么?第三次握⼿如果失败会怎样?
    1.服务端需要确定客户端的应答能力正常;
    2.防止无效的连接占用资源(服务端及时释放无效连接);
    3.防止无效的数据包发送到服务端引起错误;
    4.服务端重试5次,若还是没有收到确认包,则服务端直接结束本次连接,在此期间若收到了数据包,也结束本次连接;
建议把tcp关闭时的4次挥⼿也看看?
    1.客户端发送终止命令fin(fin=1,seq=k);
    2.客户端响应ack(ack=1,seq=f,ack=k+1);
    3.服务端发送fin(fin=1,ack=1,seq=ff,ack=k+1);
    4.客户端响应ack(ack=1,seq=k+1,ack=ff+1);
    5.关闭连接时,可能服务端还有数据未发送完毕,所以只能先回复一个ack,告诉客户端你的请求我收到了,等服务端的所有数据都发送完毕,我才能发送fin,因此不能一起发送;
rpc和http的区别,你知道有什么rpc框架?
    1.rpc通常基于tcp/ip协议,http基于http协议;
    2.rpc比http效率高;
    3.rpc比http复杂,涉及rpc框架、服务注册发现、服务治理;
    4.rpc一般是长链接,不必每次通讯都三次握手,减少网络消耗;
    5.rpc满足像调用本地服务一样调用远程服务;
    6.rpc是一种api,http是一种无状态的网络协议,rpc可以基于http实现,也可以基于tcp实现;
    7.rmi、dubbo、hessian;
https相对http都实现了什么加密⽅式,是对称加密还是⾮对称加密?https的传输过程?
    1.https在http中加入ssl层;
    2.https在内容传输的加密上使用的是对称加密,验证证书阶段使用的是非对称加密;
    3.客户端发送https请求,服务端返回证书和公钥(ca),客户端对证书进行验证,验证通过后本地生成随机数作为通信对称秘钥发送给服务器,服务端通过私钥(ca)解密获取通信对称秘钥;
⽤linux命令怎么做分组求和,怎么把字符串根据分隔符变成数组?
    todo
简要介绍⼀下jvm虚拟机?
    1.jvm是虚拟机,是java字节码运行的容器;
    2.jvm由类加载器、运行时数据区、执行引擎、本地库接口组成,首先通过类加载器把java代码转成字节码,运行时数据区再把字节码加载到内存中,而字节码并不能直接交给操作系统去执行,而是需要特定的执行引擎把字节码翻译成底层系统指令,再交由cpu执行,这个过程中需要调用本地库接口来实现整个程序的功能;
    3.其中运行时数据区由程序计数器、虚拟机栈、本地方法栈、堆、方法区组成,其中堆由程序内的线程共享,存储对象和静态变量,会被垃圾回收机制不定时回收,方法区由线程共享,存储类变量、常亮池,虚拟机栈由线程独享,存储执行方法时的局部变量、堆对象地址、操作数栈、返回地址、动态连接,栈中存放的变量生命周期一旦结束就会被释放,本地方法栈存放各种native方法的局部变量,程序计数器则记录当前线程执行到哪一条字节码指令位置;
简述⼀次gc的过程(minor gc和major gc过程还记得么)?
    1.gc分为minor g、major gc、full gc;
    2.年轻代回收内存称为minor gc,年轻代分为eden和survivor(s0、s1),对象优先分配在eden区域,当eden区域可用空间不够时或者eden区域满了的时候会进行minor gc,经过对s0和eden区域的编辑和扫描,不再存活的对象被清除,存活的对象进入s1且对象年龄+1,之后s0、eden被清空,随着程序的运行,对象的增多,eden区域又满了,再次进行minor gc清空s1和eden;
    3.随着对象经历多次minor gc,达到年龄阈值(-xx:maxtenuringthreshold)的年轻代对象就会进入到老年代中,随着老年代的对象越来越多,内存不够时就会进行major gc;
    4.full gc是针对年轻代、老年代、元空间、堆外内存的全局范围的gc,full gc不等于major gc,也不等于minor gc+major gc,发生full gc需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收,major gc在很多参考资料中=full gc,且很多检测工具中只有minor gc和full gc;
    5.年轻代晋升到老年代的对象大小,比老年代剩余的空间大小还要大,就会触发full gc,当老年代的空间使用率超过某阈值时触发full gc,元空间(1.7永久代)不足时触发full gc,system.gc()也会触发full gc;
jmm是什么?
    java内存模型,本身是一种抽象的概念,是一种规范,并不真实存在,它描述一组规则或规范,通过这组规则定义了程序中各个变量的访问方式。由于jvm运行程序的实体是线程,而每个线程创建时jvm都会为其创建一个工作内存(有时也称栈空间,cpu缓存),用于存储线程私有的数据,而java内存模型中规定所有变量(不包括局部变量和方法参数)都存储在主内存中(jvm内存的一部分),且属于共享内存区域,所有线程都可以访问,但线程对变量的操作必须在工作内存中进行,首先就需要将变量从主内存中拷贝到自己的工作内存中,然后对变量进行操作,操作完成后再写回主内存。线程内存是每个线程的私有数据区域,因此不同线程无法直接访问对方的工作内存,线程间的通讯(传值)必须通过主内存来完成。主内存可以认为就是物理内存,java内存模型中实际就是jvm虚拟机内存的一部分,而工作内存就是cpu缓存。
jvm共享内存都有什么,什么是堆外内存?
    1.堆、方法区(元数据);
    2.堆外内存就是把内存对象分配在java虚拟机的堆以外的内存,这些内存直接受操作系统管理,而不是虚拟机;
    3.这样能够维护一个较小的堆,在一定程度上减少垃圾回收对应用程序造成的影响,堆外内存也被称为直接内存;
    4.可以使用nio包下的directbytebuffer进行堆外内存的管理和使用,它会在对象创建的时候就分配堆外内存;
    5.堆外内存由操作系统管理,属于内核态,如果从堆内向磁盘写数据时,数据会被先复制到堆外内存,即内核缓冲区,然后再由操作系统写入磁盘,而使用堆外内存,直接写入磁盘,提升了效率。
堆外内存回收过程?
    1.jvm在堆内保存堆外内存引用,用directbytebuffer对象来表示;
    2.每个directbytebuffer对象在初始化时,都会创建一个对应的cleaner对象;
    3.当directbytebuffer对象在某次gc中被回收,此时只有cleaner对象知道堆外内存的地址;
    4.当下一次gc执行时,cleaner对象会触发自身clean方法清理对应的堆外内存;
    5.cleaner对象在下次gc时被回收;
gc区域,垃圾回收算法,垃圾回收器,g1、cms、parnew等垃圾回收器的简介和之间的区别?
    1.标记-清除算法:标记阶段,从根集合出发,将所有活动对象及其子对象打上标记;清除阶段:遍历堆,将非活动对象的地址连接到空闲链表上;
    2.标记-压缩算法:与标记-清除算法类似,不过标记阶段后它会将所有活动对象紧密排列在对的一侧(压缩),消除内存碎片;
    3.引用计数法:引用计数,记录每个对象被引用的次数,每次创建对象、赋值、删除引用的同时更新计数器,如果计数器为0直接回收内存;
    4.复制算法:将堆分为两个大小相同的空间from和to,在from上分配对象内存,当from空间满的时候,将from中活动的对象复制到to空间,将from空间清除,之后将两空间互换;
    5.分代回收:基于大部分对象创建后很快就变成垃圾,很少有对象能存活很久的现状,将内存空间分为新生代和老年代,新生代=生成空间+2*幸存空间(复制算法),老年代使用标记-清除算法;
    6.增量gc:本来gc只在幕后回收资源,但如果gc任务繁重则会长时间stw暂停应用程序执行,而增量gc就是一种逐渐推进垃圾回收来控制最大暂停时间的方法(三色标记算法:白色,还未搜索过的对象,灰色,正在搜索的对象,黑色,搜索完成的对象;根查找阶段:对直接从根引用的对象打上标记,存放到标记栈(白色变灰色),标记阶段:从标记栈中取对象,将其子对象涂成灰色,这个阶段不是一下子处理所有的灰色对象,而是只处理一定个数,然后暂停gc,清除阶段:将没被标记的白色对象连接到空闲链表,并重置已标记的对象标记位);
类加载过程(5个过程最好能研究明⽩,因为还涉及到栈帧、局部表量表、操作数栈、动态链接和⽅法出⼝等知识)?
    参考:
⼀个arraylist的两个对象的getclass()得到的结果相同么(理解类加载和class类类型)?
    参考:
死锁怎么查问题(-xx:+printgcdetails)?
    参考:
gc⽇志得会看,尤其知道怎么查oom问题的时候,你应该知道使⽤jconsole,jstat,jmap,jvisualvm等的⼯具来查看gc状态,看看是不是年轻代设置太⼩了导致major gc频繁或者内存泄露了?
    参考:
synchronized在jdk6做了哪些优化,synchronized和lock的区别?
    参考:
懒汉单例⽤duble check是线程安全的么,为什么要加volatile?
    参考:
volatile有什么⽤,什么是cas?
    参考:
什么是happens before原则?
    参考:
什么是aqs?
    参考:
线程sleep和wait的区别,线程join是什么意思?
    参考:
java都有哪⼏种锁?
    参考:
线程池分⼏种类型,其中的coresize、maxsize、存活时间、等待队列、拒绝策略要清楚?
    参考:
java乐观锁的实现(cas+⾃旋)?
    参考:
阻塞队列的实现,⾄少⾃⼰会实现2种阻塞队列的⽅法(单锁,多锁, reentrantlock,condition)?
    参考:
countdownlatch、cyclicbarrier、semaphore区别,使⽤场景?
    参考:
hashmap是线程安全的么,底层怎么实现的(get,set,resize),jdk1.8之前和之后做了哪些修改,如果要使得插⼊kv有序需要使⽤哪种hashmap(linkedhashmap,treemap),concurrenthashmap线程安全是怎么实现的(jdk1.8前后实现不同)?
    参考:
arraylist和linkedlist的区别,栈和队列的区别。queue和deque区别?
    参考:
netty,jetty实现原理?
    参考:
java 静态代理、动态代理?
    参考:
forkjoin模型?
    参考:
java回调?
    参考:
协程和线程的区别?
    参考:
jdk1.8有什么新特性,了解函数式编程么(不了解的看看guava)数据结构算法和设计模式?
    参考:
设计模式⼀般引申⾃项⽬或者⼯具底层实现,所以需要懂⼀些⽐较常⻅的设计模式,⼯⼚、单例、观察者、命令、适配器、代理等等?
    参考:
算法主要是查找和排序,所以⾄少要会⼿写主流的排序算法和查找算法?
    参考:
lsm树是怎么实现的。和mysql的b+树有什么区别?
    参考:
⼆叉树,平衡查找⼆叉树,红⿊树等?
    参考:
栈,数组,链表,队列,双端队列,跳跃表(redis zset)?
    参考:
aop,ioc概念?
    参考:
spring cloud组件介绍,⽐较多的是hytrix和eureka,hytrix主要怎么实现限流和降级(线程池和信号量),两种实现⽅式有什么区别,具体熔断时的配置;eureka主要介绍和zookeeper的区别,以及注册流程?
    参考:
spring boot配置很多都注解化了,所以常⽤的注解要知道
    参考:
过滤器和spring拦截器的区别
    参考:
单点登录系统怎么做(sso系统)
    参考:
为什么选择cassandra⽽不是hbase,两者有什么区别
    参考:
多线程(threadlocal(⽗⼦线程怎么共享数据 interitablethreadlocals)、lock和sync区别(hashmap1.7、1.8区别时带出)?
    参考:
aqs原理(执⾏过程源码,⼊队出队的细节,源码细节)?
    参考:
countdownlatch和cyclicbarrier的区别是什么源码级别?
    参考:
volatile从指令重排序,内存屏障,聊到总线⻛暴)
    参考:
数据库(mysql索引(聚集索引、⾮聚集索引、索引结构(各种树的特性)、执⾏计划、count1*区别、举例优化sql、mvcc和事务隔离级别的关系、间隙锁、⾏锁(和多线程混合问的,乐观锁悲观锁等)、唯⼀索引和普通索引的区别聊到了changebuffer,聊了⻚分裂合⻚合并)⽐重较⼤
    参考:
jvm调优(可达性分析算法中根节点有哪些、cms和g1区别、怎样gc调优、怎样排查cpu彪⾼、内存彪⾼、逃逸分析)?
    参考:
redis数据结构、跳跃表、redis qps能上多少,怎么知道的、sentinel和cluster区别和各⾃适⽤场景?
    参考:
redis cluster集群同步过程、redis单线程为什么快、多⼤叫⼤key?
    参考:
热key产⽣原因和后果以及怎么解决、本地缓存需要⾼时效性怎么办?
    参考:
spring的作⽤、spring循环依赖怎么解决(说出三级缓存源码细节)、spring aop原理(动态代理)、spring bean⽣命周期?(源码细节,以及各个位置的设计思路,有什么可扩展的)
    参考:
dubbo服务暴露和引⽤过程,负载均衡策略,容错机制在哪⾥实现的源码?
    参考:
说到缓存穿透,设计⼀个防⽌缓存穿透的解决⽅案,简单的就是存null值,但肯定会深究,可以结合布隆过滤器,设计分布式系统,⾥⾯⼜涉及到流量分发到具体过滤器服务的⽅式,⽐如⼀致性hash算法,怎么调⽤?⽐如dubbo直连、等等细节。
    参考:
限流设计⼀个侵⼊性最⼩的限流服务?
    参考:
dubbo服务调⽤过程?
    参考:
nio、bio区别,nio解决了什么问题?netty线程模型(源码拷问)?
    参考:
mq相关(rocketmq、kafaka)?
    参考:
限流,限流标准?(并发数? qps?并发数和qps关系?说出了5种限流⽅案和对应算法原理)
    参考:
dubbo调⽤端怎么在jvm中⽣成对应服务?dubbo服务端和调⽤端超时时间设置和区别、dubbo⻓连接;
    参考:
mysql⾏锁最⼤并发数?(秒杀项⽬指出)
    参考:
设计秒杀系统,异步的⽅式,怎么优化?改为了同步的⽅式,异步和同步区别?
    参考:
碰到哪些技术难点?怎么解决?有没有参考其他⼤⼚?其他⼤⼚⽅案什么样的?
    参考:
秒杀系统,会涉及到多个库表的更新,分布式事务怎么解决,消息最终⼀致性,异步?有没有更好的⽅案?同步tcc⽅式,tcc⽅式原理?
    参考:
自我介绍?
    参考:
项目?
    参考:
限流的原理?
    参考:
jre与jdk,有什么关系?
    参考:
jre包含哪些组件?
    参考:
private修饰的字段或方法,子类可以重写么?
    参考:
父类静态的方法,子类可以重写么?不可以重写父类的静态方法
    参考:
基本数据类型-包装类型的相互转换叫什么?
    参考:
重载,返回值一样可以重载么?
    参考:
线程创建的方式?【4方式】
    参考:
线程池的创建方式?【2】
    参考:
线程池的基本参数?【3+4】
    参考:
核心线程数空闲了,会被销毁么?不会,通过队列的 take 方法阻塞核心线程
    参考:
常见的集合类?
    参考:
hashmap为什么1.8加入了红黑树,加入了之后对hashmap有什么提升?
    参考:
hashmap线程是否安全?
    参考:
hashmap多线程不停的读写会出现什么情况?
    参考:
线程之间同步的方式?
    参考:
volatile可见性的原理?
    参考:
synchronized是否为可重入锁?
    参考:
jvm的内存结构?
    参考:
虚拟机栈和本地方法栈的区别?
    参考:
native方法是什么?
    参考:
min gc和full gc的区别?
    参考:
jdk8的改进?
    参考:
改进的原因?
    参考:
nio包括哪些模块,nio与其他io的区别?什么场景下用nio比其他io好?
    参考:
spring的ioc和普通的new相比,好处在哪里?ioc相当于将创建对象的方式交给了spring,然后创建对象是由容器管理的,默认单例。作用:减少了bean创建的时间和节省cpu资源
    参考:
用什么实现服务之间的调度?
    参考:
dubbo的调用链?
    参考:
dubbo的协议?
    参考:
数据库分表之后,比如:1024张表,然后有很多热点数据,只写入两张表,怎么让数据均匀分布?
    参考:
冒泡排序?
    参考:
项目介绍?
    参考:
项目的挑战?
    参考:
java文件是怎么运行的?
    参考:
java方法,变量,对象存哪?
    参考:
堆栈,哪些线程不安全的?
    参考:
java怎么做到内存的可见性?
    参考:
java中有几种重排序的类型?
    参考:
重排序会带来什么问题?
    参考:
怎么解决指令重排序?【屏障】
    参考:
java创建对象的方式?
    参考:
什么时候发生内存泄漏?讲一个场景?
    参考:
jvm的垃圾回收器选择?高吞吐?低延迟?
    参考:
g1与cms优势?
    参考:
mysql引擎?以及区别?(发散性讲)
    参考:
mysql事务的隔离级别?
    参考:
什么是sql注入?
    参考:
mysq中,去除重复的行,保留第一次插入的行,sql如何实现?
    参考:
10亿数据中,找出里面重复的数据?1、分治;2、取hash,相同的放在一个里面set中;
    参考:
算法:多线程交替答应abc?
    参考:
算法:实现一个数据结构,栈,且增加一个新功能,返回栈中的最小值?
    参考:
自我介绍?【性格,兴趣】
    参考:
特殊算法?
    参考:
理解的比较深刻的算法?
    参考:
快排的思想?
    参考:
基准值是选取?
    参考:
怎么更好的选取基准值?
    参考:
非递归的实现?
    参考:
项目介绍?
    参考:
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值