乐趣区

关于java:面试总结经验汇总

提到职起因

遇到的最难的技术点

遇到问题:adam 本地启动时用 jdk1.8 能够启动,用 jdk1.7 时尽管启动胜利,然而拜访地址无反馈,而且线上 jdk 版本也是 1.7,错误信息启动几分钟后控制台才有打印,刚开始没看到错误信息,没有脉络,看到错误信息后,明确了起因。

报错提醒:1.WarningService: Shutdown: TcpSocketLinkOutOfMemory

                2.AlarmClock slow alarmAlarm

起因:本地应用默认 jvm 配置,堆内存、cms perm gen 非堆内存不够应用,内存溢出

Perm Gen 全称是 Permanent Generation space,是指内存的永恒保留区域,因此称之为永恒代。这个内存区域用于寄存 Class 和 Meta 的信息,Class 在被 Load 的时候被放入这个区域。因为 Perm 里存储的货色永远不会被 JVM 垃圾回收的,所以如果你的应用程序 LOAD 很多 CLASS 的话,就很可能呈现 PermGen space 谬误。默认大小为物理内存的 1 /64。

解决方案:启动时配置 jvm 参数:-Xms2867M-Xmx2867M -Xmn1075M -XX:PermSize=512M -XX:MaxPermSize=512M, 调大非堆内存代销

思考:通过上述问题加深了对 jvm 参数的了解,后续须要看下 jvm 内存应用状况

问题: 在进行金额运算时,发现后果与预计不符,应用了 BigDecimal 做除法运算时应用的是默认舍入形式。

解决:除法运算时指定舍入形式,并设置保留位数(防止无线不循环小数状况)。

思考:获取所需数据时,为了防止查问库次数过多,先将数据按范畴都查寻进去放入 map 中,通过 map 做映射治理,升高拜访数据库次数,晋升性能;

须要学习

java 根底

罕用的设计模式有哪些?

int(M)长度的意义

MySQL 整型长度的含意

java 容器(汇合)有哪些?

hashmap hashtable 区别

虚援用与弱援用区别

TCP udp 区别?实时性要求高用哪个?

Io nio 区别

btree 深度为什么不能设置太深

应用数组实现队列

并发包

string 为什么定义成 final 类型 益处

 https://www.cnblogs.com/651434092qq/p/11168608.html

switch 反对的数据类型

https://www.cnblogs.com/HDK20…

https://blog.csdn.net/qq_3381…

枚举类在 switch…case 语句中应用的问题

https://blog.csdn.net/qq_3523…

HashMap 和 ConcurrentHashMap 区别(必考)

ConcurrentHashMap 的数据结构(必考)

高并发 HashMap 的环是如何产生的

Boolean 占几个字节

jdk1.8/jdk1.7 都别离新增了哪些个性

Exception 和 Error

多线程

Java 线程状态、线程池状态

Java 线程状态、线程池状态

外围线程池 ThreadPoolExecutor 的参数(必考)

Java 线程池,你理解多少?

为什么当线程池的外围线程满了后,是先退出到阻塞队列,而不是先创立新的线程?

线程池创立线程须要获取 mainlock 这个全局锁,会影响并发效率,所以应用阻塞队列把第一步创立外围线程与第三步创立最大线程隔离开来,起一个缓冲的作用。

引入阻塞队列,是为了在执行 execute() 办法时,尽可能的防止获取全局锁。

如何控制线程池线程的优先级

sleep、yield、wait、join 的区别 (阿里)

volatile 作用(必考)

volatile 关键字解析

Java 内存模型规定所有的变量都是存在主存当中(相似于后面说的物理内存),每个线程都有本人的工作内存(相似于后面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能间接对主存进行操作。并且每个线程不能拜访其余线程的工作内存。

java 中为什么 notify() 可能会导致死锁,而 notifyAll() 则不会

CountDownLatch 的两种罕用场景

threadlocal 原理

一文搞懂 ThreadLocal 原理

正确理解 Thread Local 的原理与实用场景

Atomic 类如何保障原子性(CAS 操作)(必考)

synchronized 实现原理?锁降级过程?

synchronized 和 Lock 的区别(必考)

Synchronized 与 Lock 的区别与利用场景

不可不说的 Java“锁”事

java 锁介绍

为什么要应用线程池(必考)

避免频繁的创立线程耗费服务器资源

CPU 资源无限的状况下,新建更多的线程不仅不能解决更多的工作,反而会因为线程间频繁的切换导致解决工作的效率升高

更不便对线程进行集中管理

不停的创立线程,会占用很大的内存空间

线程之间如何通信

volatile 在双重查看的单例中起到的作用:

    次要在于 singleton = new Singleton() 这句,这并非是一个原子操作,事实上在 JVM 中这句话大略做了上面 3 件事件。1. 给 singleton 分配内存

      2. 调用 Singleton 的构造函数来初始化成员变量,造成实例

      3. 将 singleton 对象指向调配的内存空间(执行完这步 singleton 才是非 null 了)在 JVM 的即时编译器中存在指令重排序的优化。也就是说下面的第二步和第三步的程序是不能保障的,最终的执行程序可能是 1-2-3 也可能是 1-3-2。如果是后者,则在 3 执行结束、2 未执行之前,被线程二抢占了,这时 instance 曾经是非 null 了(但却没有初始化),所以线程二会间接返回 instance,而后应用,而后牵强附会地报错。

分布式 并发

分布式主键 保障唯一性

幂等性

bitmap

秒杀 限流

限流算法

Spring

spring boot 启动过程

spring bean 生命周期

如何记忆 Spring Bean 的生命周期

动静代理

spring 有哪些注解

Spring 调用流程

springMVC 申请流程详解 – 梦醒点灯 – 博客园

Spring 的 IOC/AOP 的实现(必考)

Spring IOC 实现原理

动静代理的实现形式(必考)

Spring 如何解决循环依赖(三级缓存)(必考)

Spring 的后置处理器

Spring 的 @Transactional 如何实现的

Spring 的事务流传级别

Spring 事务流传属性和隔离级别

BeanFactory 和 ApplicationContext 的分割和区别

Spring 中 BeanFactory 和 ApplicationContext 的区别_

Spring 的 Interceptor 和 Servlet 的 Filter 区别

https://blog.csdn.net/qq_4027…

Mysql

索引怎么优化 剖析?

binlog,redolog,undolog 都是什么,起什么作用

分库分表 可反复读怎么保障

mysql 隔离级别 及实现原理

一文彻底读懂 MySQL 事务的四大隔离级别

Innodb 中 RR 隔离级别是否避免幻读?

Innodb 中 RR 隔离级别是否避免幻读

MySQL InnoDB 的可反复读并不保障防止幻读,须要利用应用加锁读来保障。而这个加锁度应用到的机制就是 next-key locks。

Mysql 官网给出的幻读解释是:只有在一个事务中,第二次 select 多出了 row 就算幻读。

a 事务先 select,b 事务 insert 的确会加一个 gap 锁,然而如果 b 事务 commit,这个 gap 锁就会开释(开释后 a 事务能够随便 dml 操作),a 事务再 select 进去的后果在 MVCC 下还和第一次 select 一样,接着 a 事务不加条件地 update,这个 update 会作用在所有行上(包含 b 事务新加的),a 事务再次 select 就会呈现 b 事务中的新行,并且这个新行曾经被 update 批改了,实测在 RR 级别下的确如此。

如果这样了解的话,Mysql 的 RR 级别的确防不住幻读

起因是后面的 UPDATE 语句执行之后,会将以后记录上存储的事务信息更新为以后的事务,而以后事务所做的任何更新,对本事务所有 SELECT 查问都变的可见,因而最初输入的后果是 UPDATE 执行后更新的所有记录。

多读出的一行,是因为 “MVCC 快照读中,“本人的批改可见”。” 还是 update 的锁把快照读变成了以后读。

快照读 以后读?

【MySQL】以后读、快照读、MVCC

mysql 索引构造为什么不必 hash

mvcc

行级锁 怎么实现的

mysql 可反复读怎么实现的

主键索引 非主键索引 汇集索引 非汇集索引 区别

MySQL 大数据量表依据非索引字段检索优化

mysql 日志 模式

分布式事务 https://www.cnblogs.com/xifen…

分库分表、聚合查问

分库分表:https://www.jianshu.com/p/32b…

事务的基本要素

事务隔离级别(必考)

如何解决事务的并发问题(脏读,幻读)(必考)

MVCC 多版本并发管制(必考)

InnoDB 的行锁 / 表锁

myisam 和 innodb 的区别,什么时候抉择 myisam

MyISAM 与 InnoDB 的区别(9 个不同点)

为什么抉择 B + 树作为索引构造(必考)9. 索引 B + 树的叶子节点都能够存哪些货色(必考)

查问在什么时候不走(预期中的)索引(必考)

sql 如何优化

explain 是如何解析 sql 的

order by 原理

深度分页

Redis

redis 如何保障和数据库一致性

Redis 数据分片是怎么做的

一致性 hash 怎么实现的

redis 系列之——一致性 hash

redis 部署形式 集群 哨兵

Redis(二)冰叔带你理解 Redis- 哨兵模式和高可用集群解析

redis 哨兵模式选举机制

《Redis 长久化形式》

RDB 形式:定期备份快照,罕用于劫难复原。长处:通过 fork 出的过程进行备份,不影响主过程、RDB 在复原大数据集时的速度比 AOF 的复原速度要快。毛病:会丢数据。

AOF 形式:保留操作日志形式。长处:复原时数据失落少,毛病:文件大,回复慢。

也能够两者联合应用。

Redis 反对的数据类型(必考)

Redis 反对五种数据类型:string(字符串),hash(哈希),list(列表),set(汇合)及 zset(sorted set:有序汇合)。

Redis 的 LRU 过期策略的具体实现 

https://blog.csdn.net/nakiri_…

redis 过期怎么实现的

Redis 的过期策略是如何实现的?

如何解决 Redis 缓存雪崩,缓存穿透,缓存击穿

缓存穿透,缓存击穿,缓存雪崩解决方案剖析

缓存穿透和缓存击穿解决

Redis 分布式优缺点

Redis 的利用场景

Redis 的管道 pipeline

redis 外部数据结构

zset 跳表的数据结构 实现原理(必考)

音讯队列

Kafka 常见面试题

音讯队列积压从原理剖析怎么解决?

Kafka 集群音讯积压问题及解决策略

kafka 什么时候慢? kafka 为什么快?

Kafka 为什么那么快的 6 个起因!

kafka reblance 怎么实现的?

Kafka Rebalance 机制剖析

目前 kafka 提供了 5 个协定来解决与 consumer group coordination 相干的问题:

Heartbeat 申请:consumer 须要定期给 coordinator 发送心跳来表明本人还活着

LeaveGroup 申请:被动通知 coordinator 我要来到 consumer group

SyncGroup 申请:group leader 把调配计划通知组内所有成员

JoinGroup 申请:成员申请退出组

DescribeGroup 申请:显示组的所有信息,包含成员信息,协定名称,调配计划,订阅信息等

kafka 生产端 实现多线程生产

正确处理 kafka 多线程生产的姿态

如何保障 Kafka 不失落音讯?

Kafka 如何保障音讯不失落不反复

面试官问我如何保障 Kafka 不失落音讯? 我哭了!

Consumer 端

consumer 端失落音讯的情景比较简单:如果在音讯解决实现前就提交了 offset,那么就有可能造成数据的失落。因为 Kafka consumer 默认是主动提交位移的,所以在后盾提交位移前肯定要保障音讯被失常解决了,因而不倡议采纳很重的解决逻辑,如果解决耗时很长,则倡议把逻辑放到另一个线程中去做。为了防止数据失落,现给出两点倡议:

enable.auto.commit=false  敞开主动提交位移

在音讯被残缺解决之后再手动提交位移

手动提交可能导致反复生产:比方你刚刚生产完音讯之后,还没提交 offset,后果本人挂掉了,那么这个音讯实践上就会被生产两次。

解决反复生产:1. 建设去重表,保障解决幂等性

如何保障音讯的程序生产?

深度分析 Kafka/RocketMQ 程序音讯的一些坑

生产端:

如果须要进行音讯具备生产程序性,能够在生产端指定这一类音讯的 key,这类音讯都用雷同的 key 进行音讯发送,kafka 就会依据 key 哈希取模选取其中一个分区进行存储,因为一个分区只能由一个消费者进行监听生产,因而这时候音讯就具备音讯生产的程序性了。

生产端:

JVM

oom 异样场景

https://www.cnblogs.com/devel…

ArrayList addAll 办法,批量增加 频繁扩容 须要控件间断 oom;解决:初始化汇合大小,原本是数据汇总再插入数据库,不须要汇总 能够每个外面都插入

CPU 过高排查

记一次 Java 利用造成 CPU 过高的排查过程

应用 top 命令查问服务 cpu 应用状况

应用 top -Hp 31737 查问 31737 过程中各个线程的资源使用率

应用 printf “%x\n” 5322 把线程 id 转化为十六进制(14ca),因为打印线程栈的时候,本地线程标识 nid 是用十六进制示意的

应用 jstack 命令打印堆栈信息,jstack 31737 | grep -10 14ca

查找本地线程标识为 14ca 的线程堆栈信息

查看源码

频繁 fullgc 怎么排查 解决?

cms 和 g1 区别?别离什么场景下应用?

调优

syschronize 1.7 优化

await sleep

cpu 比拟高查找起因

内存溢出了怎么查找

jvm 命令

运行时数据区域(内存模型)(必考)

垃圾回收机制(必考)

垃圾回收算法(必考)

Minor GC 和 Full GC 触发条件

GC 中 Stop the world(STW)

各垃圾回收器的特点及区别

双亲委派模型

JDBC 和双亲委派模型关系

Java 根底

ZooKeeper

CAP 定理

ZAB 协定

leader 选举算法和流程

Dubbo

调用流程

Dubbo 反对哪些序列化机制

linux

查看端口占用命令

其余

高并发零碎的限流如何实现

高并发秒杀零碎的设计

负载平衡如何设计

补充

另外还会考一些计算机网络,操作系统啊之类的。像音讯队列,RPC 框架这种考的比拟少。

计算机网络就是分层啊,tcp/udp 啊,三次握手之类的。操作系统就是过程与线程啊,过程的数据结构以及如何通信之类的。数据结构的排序算法也比拟常考,考的话肯定会让你手写个快排。剩下的算法题就靠 LeetCode 的积攒了。其实非算法岗考的算法题都蛮简略的,很多题齐全就是考查你智力是否失常,略微难点的波及到一些算法思维的依照 LeetCode 题目类型的分类,每种题做一两道根本就能齐全应酬面试了。

面试感触及评估

除了外企,体验最好的就是阿里。相对的怀才不遇,无论是面试官的业余水平还是面试官对参加面试人员的态度都齐全突出于其余公司。十分的尊重人,以及会疏导我去作出正确的答复,惟一就是阿里的 HR 是十分强势的,永远有一票否决权。而有些公司面试官会成心误导你,千方百计让你说出谬误的答案,并且有些态度极其高傲,让人感觉很不尊重人。这里点名批评面试体验最差的两家公司:美团和 Boss 直聘。

外企的话,体验都很好。微软是英文面的,亚马逊不是。这俩都是以算法为主,微软除了算法还聊了操作系统和计算机网络,亚马逊聊了较长时间的我的项目细节。

最初

最初说下本人的状况,17 年在京东实习,19 年 7 月到职。正式工作工夫很短,就一年(算实习两年),而且 19 年有半年的工夫筹备考研所以有半年的空档期,这也是为什么我被很多 HR 挂了的起因。尽管 Offer 没拿几个,然而一半多都面到 HR 面了,所以对于两三年教训的感觉整顿的问题还是比拟有代表性的。

算法题

最长回文子串

大数据文件 30m 怎么排序

矩阵

小顶堆大顶堆

100 万个数据取前 20 大的数据

疾速排序

单链表获取倒数第 n 个元素

合并两个有序链表,LeetCode21 题。(猿辅导)

反转链表,LeetCode206 题。(头条,搜狐)

两个单单链表相交

杨辉三角求数字地位,LeetCode118,119 题相干。(滴滴)

循环有序数组的查找,LeetCode33 题。(滴滴)

求二叉树的最近公共先人,LeetCode236 题。(滴滴)

求阶乘后的 0,LeetCode172 题。(蚂蚁金服口试)

实现一个增删查性能的 LinkedList,LeetCode707 题。(Boss 直聘口试)

矩阵置 0,LeetCode73 题。(跟谁学口试)

二又树的层序遍历,LeetCode102 题。(搜狐)

中文转数字 / 数字转中文。(头条)

链表的两数相加,LeetCode2 题类型题。(头条)

括号匹配,LeetCode20 题。(拼多多)

队列实现栈,栈实现队列,LeetCode225,232 题。(拼多多)

判断字符串(IP 地址)是否在汇合内。(微软)

中断表达式的计算,LeetCode224 题。(微软)

划分字母区间,LeetCode763 题。(亚马逊)

退出移动版