前言
时长2H 应用+原理理解; Java后端社招三年
1. 自我介绍
2. JVM组成部分
- 堆
- 方法区(元数据区)
- 程序计数器
- 本地方法栈
- 虚拟机栈
3. 虚拟机栈和本地方法栈区别(线程私有,每个线程都有一个)
- 本地方法栈和虚拟机栈的作用相同,用来描述方法
执行
的内存模型- 即每个方法执行都会在栈上创建一个栈帧,存放方法的出入口,局部变量表和操作数等信息.当一个方法开始与执行完毕对应的栈帧就会入栈与出栈
4. 可以用堆代替栈嘛(区别)
- 栈是描述该线程当前执行中方法的内存模型,堆存放程序运行时创建的对象
- 堆生命周期是和程序一致,线程共享,栈生命周期和执行线程一致,且只用于当前线程,所以内存大小比堆小得多
- 栈内存地址要求连续,统一分配好.并且栈后入先出,方法执行完毕栈帧弹出内存及时回收.保证栈的读取速度
- 堆内存地址不一定连续,并且内存回收由GC回收非实时回收
- 栈内存放入堆中由于大部分线程执行周期短会造成大量垃圾对象或者长期对象也会有内存泄露的问题,一直跟随垃圾回收进行迁移
- 所以堆和栈的内存管理方式不一样,用堆代替栈会增加堆内存回收的复杂性,分开更容易管理各自内存
- 两者内存作用不同,栈中溢出会提示栈溢出错误,堆中溢出会提示内存溢出错误,如果放在一起则无法明确定位错误
分开的意义在于两个内存释放时机要求不同导致的内存管理方式不一样,如果放到一起会增加现有垃圾回收复杂度.并且堆栈内存的存取速率以及隔离性要求不一致,使用堆来存放也会增加堆内存管理复杂度以及降低线程执行效率
5. JVM为啥要有垃圾回收器
JAVA语言未提供手动释放对象资源的方式,内存空间释放由JVM虚拟机自己判断与执行,所以提供垃圾回收器帮我们进行内存资源释放.这样也避免了我们申请完内存后如果忘了释放内存而造成的内存泄漏.
6. 如何定位垃圾,那些是ROOT节点
- 类常量和静态属性引用的对象(static,final)
- 虚拟机栈和本地方法栈中引用的对象(局部变量表)
7. Java程序占用cpu100%如何排查解决
前言: CPU占用100则表示当前有计算密集类型线程正在执行并处于无法退出/执行计算难度很大的状态(比如死循环和大量对象未死亡时的GC扫描阶段)
- 查看GC是否正常,当有大量小对象存在,则GC会非常占用资源
- 查看占用资源的线程信息,根据线程执行信息定位代码问题
- 查看占用最高进程: top查看占用最高PID
- 查看该进程的可疑线程: top -H -p PID 查看当前进程中占用最高线程
- 打印输出可疑线程16位字符:
printf "%x\n" 线程PID
或echo "obase=16;线程PID" | bc
- 打印程序线程并查询对应线程信息: jstack pid | grep -A num 16进制PID
- 查看线程栈信息的调用路径以及当前所处方法,查看代码逻辑
8. 阻塞状态线程会让CPU100嘛
CPU使用率的飙升更多是由于执行计算密集型任务导致的,而处于阻塞状态的线程在等待时间分片尚未执行,所以不会导致CPU使用率上升
9. 死锁为啥会让CPU占用100
- 当出现锁竞争时,自旋锁会一直循环执行获取锁操作直至到达重试次数或者获取到锁,使得CPU陷入忙等待状态
- 适用于业务执行时间比较短的操作
while(! lock.lock()){ //... }
10. Connection=keep-alive干嘛的
- HTTP每次请求都会执行TCP连接握手操作,比较消耗资源而且性能也不是很好,所以通过客户端告知服务端建立长连接方式,进行长连接复用.客户端的下次请求即可使用该长连接进行发送
- HTTP1.0协议要求客户端增加
Connection=keep-alive
表明长连接请求,服务端也需要返回加Connection=keep-alive
表示支持,然后双方建立长连接,客户端可复用该条连接请求- http1.1默认使用加
Connection=keep-alive
的长连接模式,默认的连接时长可以在服务器端设置不会让它长时间连接防止无效资源占用- 长连接可以保证客户端可进行连接复用,但不能使服务器端主动向客户端发送请求(复用的是底层TCP的Socket连接,但需要和TCP的keep-alive区分开)
11. 为啥用Websocket做实时通信连接, JSONP了解吗.
- Websocket是基于TCP的全双工通信,可以做到客户端和服务器端实时发送信息,最主要解决服务器端主动向客户端推送信息的问题
- 一个客户端建立一条websocket连接即可,不需要创建大量HTTP连接请求,减少服务端压力
- 减少大量重复请求头的传输,减少网络带宽压力
- JSONP
12. 长轮询机制不能做通信吗
- 长轮询对于不同的实时信息传递需要有不同的请求连接,并且需要服务端HOLD住请求,会占用大量服务资源;而websocket可以将一条tcp通道复用来传递多种类型信息,传输信息再通过文本协议区分;
- Http请求的请求头每次都需要带很多信息,占用很多网络资源
- 无法解决服务器端主动发送消息的问题
- 参考: 短/长轮询和WebSocket的优缺点
13. Kafka顺序消费如何保证
- 一个队列只创建一个分区保证顺序消费
- 一个队列上的消息投递利用key的hash结果,保证部分有序
14. Kafka中Partion和Consumer对应关系
- 一个Partion只能被一个消费者分组中的一个消费者消费
- 一个消费者可以消费队列中多个partion
15. Redis分布式锁先SETNX后,未来得及设置过期时间宕机了怎么办
- set key value nx ex seconds(原子操作)
- LUA脚本保证原子操作
16. Redis内存不足时怎么样
- 执行淘汰策略.默认是返回错误;还有随即淘汰和最近最少使用淘汰策略(注意设置maxmemory,否则64位机器会用尽机器内存)
- 使用集群模式,将数据分片存储(中间件解决分片/业务keyhash实现)
- 减少大key产生,查询大key优化
17. Redis如何查看大KEY
- redis-cli --bigkeys 查看大Key;基于scan命令,不用担心阻塞问题.对String类型统计字节长度,对集合类型统计元素个数.
- debug object key 查看对应key的序列化后长度
- 手动执行bgsave命令,生成rdb文件,通过redis rdb tools工具分析rdb文件
- memory usage key 查看对应key的内存使用(4.0+版本)
18. LUA脚本有了解吗
19. Redis如果有大量Key同一时间失效怎么办
20. Redis Pipeline
21. Linux断开SSH连接(窗口),如何让进程继续执行
- nohup **** &
- 解决Linux关闭终端窗口后运行的程序或者服务自动停止、解决Linux关闭终端后运行的程序自动停止
22. Httpcookie客户端能修改吗,服务端能修改吗.做什么的
- cookie是Http请求头中的参数,是存放到客户端的.主要有kv对,过期时间,域信息和路径信息以及是否只读
- cookie是可以被客户端篡改的(覆盖旧值,删除的话过期时间设置为0),所以现在大部分存放的是非敏感数据或者登录信息.当然如果用户设置保存密码,有的也会保存到cookie中.在请求时带上就可以校验用户的登陆状态了.
- cookie是可以被客户端和服务端修改(set-cookie创建新的覆盖掉/有效期设为0使之删除),但是当用户知道cookie中数据作用,进行修改尝试获取别人信息也是很危险的,所以敏感的cookie数据要进行加密操作,防止用户解析/使修改不生效.
- cookie大小和同域名cookie数量限制不同浏览器有不同限制,和协议无关
23. Http连接Time wait是啥意思
- 这个不知道.也没有查到.可以有大佬解释下吗?我知道的是TCP连接TIME_WAIT状态
- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态,以用来在数据包生命周期内接收可能尚未发送到的信息
- 引用: 看看TCP/IP协议组我们就知道,这样做是为了让在网络中残余的TCP包消失, 也就是说, 如果我们没有等到这个时间就让OS把这个端口释放给其他的进程使用,别的进程很有可能就会收到上一个会话的残余TCP包,这样就会出现一系列的不可预知的错误
- 参考: http client 无限等待返回结果、TIME_WAIT状态原理、TCP的三次握手与四次挥手
24. Integer赋值地址会变吗
这里是写算法题为了方便把传参是传值和传地址给忽略了,代码不用跑.
Integer当作参数传递.不会修改原来的变量,因为传递的是地址.对参数重新赋值是将地址变更了》而原来变量地址不变
(图被吞,传不上去)
25. 算法: 计算组成N的最小平方数的数量(力扣279题)
平方数是可重复的
26. 算法: 查找最深层级子节点和(力扣1302题)
是最深层级所有子节点的和,不是所有子节点的和
27. SQL: 查找员工表第N高的工资
select salary from efm group by salary order by salary desc limit n-1, 1
全部评论
(10) 回帖