当前位置: 首页>前端>正文

java面试题总结

知识整理

一、项目介绍(熟悉项目中用到的中间件及其原理。对目前业务现状有反思,思考可能遇到的问题和解决方案)
二、java基础
三、多线程,并发编程
四、JVM
五、分布式
六、mysql
七、其他。maven git

java 基础

一、集合类
Collections分为List、Set、Map
ArrayList的底层实现原理:ArrayList底层实际上用了一个Object[]来存放数据。你知道ArrayList在实例化时,什么时候才分配大小吗?
LindList的底层实现原理:LindList的底层实际是用了双向链表来实现的。你知道LindList的查找算法是什么吗?
ArrayList和LindList的区别

你直接FailFast机制吗?它的底层实现原理?什么时候会出现FailFast?会抛出什么异常?conrrentmodifiled

Set
HashSet的底层实现原理。其实是基于HashMap来实现的
TreeSet的底层实现原理。其实是基于TreeMap来实现的。采用的哪种数据结构?红黑树
HashSet和TreeSet的区别

List和Set的区别

HashMap的底层实现原理?jdk6和jdk8的区别,冲突怎么解决?两个key的Hashcode相同怎么办?线程不安全,为什么?什么情况下会出现循环链表?
ConcurrentHashMap为什么线程安全?底层实现原理?他是并发容器,怎么理解?为什么相比加锁速度快?它的get操作需要加锁吗?他的size操作怎么实现的?

二、多线程
1、线程的实现方式?几种?
2、线程有几种状态?各个状态是怎么运作的?
3、你知道join()方法和yield()方法吗?
4、线程池的伸缩策略?线程池的几个核心参数:coresize,maxsize,keeplivetime,queue. 拒绝策略有几种。
5、创建线程池的几种方式?静态工厂?
6、你知道CountDownLatch、CyclicBarrier、。你知道它们的实现方式吗?基于AQS实现的。AQS很重要的,一定要明白,JUC包下面的大部分功能都是基于它实现的。
7、你知道Synchionized的底层实现原理吗?moniter对象,moniterenter和moniterexit。你知道Synchionized在1.6都做了哪些优化吗?偏向锁、轻量级锁、重量级锁、锁消除、锁粗化。
8、你知道Synchionized和lock的区别吗?
9、你知道Reentrantlock吗?你知道它的实现原理吗?基于AQS.
10、你知道ReentrantReadWriteLock吗?什么场景用它?底层实现原理
11、Reentrantlock,羊群效应。联想到zookeeper的分布式锁如何解决羊群效应

jvm

一、jvm内存分配
分为两大类:线程私有区,线程共享区
线程私有区:程序计数器、虚拟机栈、本地方法栈
线程共享区:堆、方法区(常量池)
以上的每个区域必须知道里面都存放的什么数据,都干了什么操作。会抛出什么异常。
对象的创建过程:1、遇到new指令之后,会先检查这个指令参数是否能在常量池中定位到一个类的符号引用。。。。

二、垃圾收集算器与内存分配策略
1、判断对象是否需要被回收的算法有哪几种?
引用计数器算法、可达性分析算法。
可以作为GCRoots的对象有哪几种?牢记,被问到过
2、对象有几种引用类型?每种的区别。
3、在可达性分析算法中不可达的对象一定会被回收吗?
看是否实现了finalize()方法,里面都干了什么操作。要了解
4、垃圾收集算法都有几种?
标记清除算法
复制算法
标记整理算法
分代收集算法
每种具体干了什么事情,有什么区别都要了解。

5、垃圾收集器
新生代的:serial收集器、ParNew收集器、Parallel Scavenge收集器(吞吐量优先收集器)
老年代、serial old收集器、Parallel old收集器、CMS收集器(重点在重点)、G1收集器(重点)
CMS收集器(重点在重点)都有哪几步?每步都干了什么事情?哪两步会出现"stop the world"
有哪些缺点?1、无法处理“浮动垃圾”,什么是浮动垃圾?2、内存碎片?什么会有内存碎片?因为CMS采用的是标记清楚算法,不带整理过程。CMS怎么解决的第一种:当CMS顶不住要Full GC的时候,会开启内存碎片的合并整理过程。
第二种:执行多少次不带压缩的Full GC后,外带一次压缩整理的过程。

6、内存分配策略

  1. 对象优先在eden分配
  2. 大对象直接进入老年代
  3. 长期存活的对象将进入老年代 默认经过几次minor GC
  4. 动态对象年龄判定 什么意思 怎么理解
  5. 空间分配担保(重点) 不允许空间分配担保失败,会执行什么操作?

7、类加载过程,几个阶段
加载、验证、准备、解析、初始化、使用、卸载
每一步都干了什么事情,要了解。
8、双亲委托机制。干了什么事情,解决了什么事情。
9、讲一下一个Class类加载的整个过程。。
10、线上OOM排查步骤

  • jps -mlvV 找出当前java进程号1234
  • jstat -gcutil 1234 1000 10
    从这一步查出,full gc次数频繁,由此可见原因是老年代空间不足 dump内存 接下来就是排查问题最重要的一步,dump内存最容易想到的是
  • jmap -dump:format=b,file=heap.hprof 1234。
    使用eclipse MAT或者visaul VM查看dump文件分析原因
    11、 一次load飙高排查过程
  • ps -ef | grep java
    找出Java进程ID,得到进程ID为21711
  • top -Hp 21711
    找出该进程内最耗费CPU的线程,TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用printf "%x\n" 21742,得到21742的十六进制值为54ee,下面会用到。
  • jstack 21711 | grep 54ee
    它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep。有时这一步并不能从整体上查看性能消耗在哪, 要用jstack 21711 > jstack.txt查看整体情况。

总结:
Jstack :可以查看线程信息
Jmap :可以查看java内存分配的情况
Jstat :可以查询gc的信息

spring

1、spring可以解决循环依赖吗?
http://blog.csdn.net/a1548178885/article/details/51697386
2、怎么理解IOC和AOP
3、spring事务怎么实现的
4、spring的传播特性

中间件

Zookpeer
1、什么是原子广播协议
2、master选举算法
3、怎么实现分布式锁
4、有几种节点类型

Dubbo
1、dubbo交互原理
2、Dubbo服务提供者发布服务的流程
3、Dubbo服务消费者消费服务的流程
4、什么是本地暴露和远程暴露,他们的区别
5、支持的协议都有哪些?区别是什么,适用场景

redis
1、和memcache的区别
2、几种数据结构,每种的使用场景
3、过期策略有哪些
4、数据淘汰策略有哪些
5、redis内存模型
6、zset的用法和实现原理

MQ
1、如何解决消息顺序问题
2、如何解决消息重复投递问题
。。。

设计能力

1、如何设计秒杀



2、分布式锁怎么实现

mysql

索引
1、索引的分类以及区别
2、索引的原理 b+树 为什么用B+树 不用B树
3、什么是聚集索引和辅助索引
4、最左前缀

锁:
1、行锁有几种?共享锁、排他锁。怎么实现的
2、什么叫MVCC 一致性非锁定读
3、什么是一致性锁定读 select .... for update select .... lock in share mode
4、表锁有几种?意向共享锁 意向排塔锁
5、锁的算法 ?Recode lock GAP next-key Lock = GAP+ Recode lock
6、锁的隔离级别?ACID 怎么实现的
原子性:redo log
一致性:undo log
隔离线:锁
持久性:redo log
优化
1、哪些情况索引会失效?
2、索引如何设计。怎么考量

其他

1、spring ioc里面为什么用currenthashmap
2、如何设置 不让浏览器缓存
3、nio中 客户端线程如何匹配注册的事件
4、共享session问题


https://www.xamrdz.com/web/2bt1994617.html

相关文章: