JAVA高级面试题汇总及答案
-
-
-
- 1.hashaMap原理源码
- 2.synchronize关键字1.6之后的优化,(偏向轻量级锁,重量级锁)
- 3.双亲委派是什么
- 4.类加载过程中可以动态改字节码吗?
- 5.如何定位线上问题,CPU100%
- 6.redis线程模型,分布式锁,除了redis还有哪些可以用来分布式锁
- 7.了解springboot吗?springboot自动装配是如何实现的?
- 8.RPC框架用过哪些?谈一下内部实现原理。
- 9.设计一个线程安全的队列,有哪些点需要去考虑
- 10.spring ioc原理,bean初始化过程,bean的生命周期
- 11.lock源码,aqs源码
- 12.服务器如何去内部扩容,内部原理知不知道
- 13.jsonp原理是什么?
- 14.ibatis如何防止注入,#$的区别
- 15.gc roots哪些可以作为root
- 16.redis槽个数,扩容之后如何迁移,redis事物是怎么实现的,watch命令干吗用的
- 17.谈谈mysql索引,(从文件结构,数据结构,应用层面去谈)datatime 和timestamp区别,间隙锁解决了什么问题
- 18.springcloud全家桶中有个zuul为什么还要再做一个springgateway
- 19.maven依赖的范围,如何解决循环依赖的
- 20.设计一个流(控)程组件
- 21.activemq,rabbitmq,kafka等消息中间件,如何去选型,依据是什么?
- 22.spring如何解决bean的循环依赖
- 23.redis集群简单描述一下,(槽,crc16算法)
- 24.redis存储一个比如学生信息,1000万条,如何预估存储容量
- 25.mysql主从同步原理,mysql有那些锁,update时什么时候用到行锁,什么时候用到表锁
- 26.mysql索引原理,住建索引和普通索引的区别,(估计还要说个联合索引)
- 27.kafka集群锁谈一下,如果一个consumer挂了会有什么后果?
- 28.java隐式锁,显示锁,有什么区别,内部原理,aqs过程画一下。
- 29.cap理论,zk,redis分别符合哪些,zk如何做到一致性的
- 30.http协议简单说下,如何解决跨域访问问题,如何解决xss问题,如果在代码中调用http如何鉴权
- 31.数据库SQL索引,索引失效条件,联合索引使用,聚集索引
- 32.常用集合包括但不限于hashmap concurrentHashMap LinkedHashMap TreeMap数据结构,并发集合CopyOnWriteArrayList ConcurrentSkipListMap这些集合的内部结构
- 33.多线程相关的,线程池ThreadPoolExecutor 工作机制,ThreadLocal , synchronized ,ReentrantLock ,volatile 使用场景和内部实现机制
- 34.动态代理的两种jdk cglib各自的实现方式和原理,自动生成的类结构是什么样的
- 35.spring 容器启动顺序,扩展点BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor,BeanPostProcessor 初始化顺序和使用场景,spring aop ,mvc的核心servlet 加载顺序,IOC相互依赖如何解决,(BeanFactoryAware方式获取bean ,打破,或者无参构造),spring事务如何实现, 哪些情况可能会失效,spring的缓存框架
- 36.常用的设计模式,工厂,代理,模板方法,策略,装饰,观察者
- 37.jvm内存结构,垃圾回收算法,垃圾回收器(特别是CMS)的工作机制
- 38.classLoader 双亲委派机制 提高部分
- 39.总结做的项目的技术选型依据,设计思路40.RPC框架设计,数据传输,序列化协议,注册中心(服务发现),熔断,限流降级,负载均衡,幂等
- 41.MQ(最好是能够知道kafaka,rocketMq中的一种)
- 42.临时设计一种场景,比如整点抢红包,秒杀,综合使用上面的一些
- 43.高并发这个应用各个层次的处理, 补:缓存的使用和防缓存穿透措施 高并发应用各个层次的应对措施,数据库层面的乐观锁,应用层面的
- 44.深入理解IO原理,bio,nio,aio相关原理特性以及应用场景
- 45.深入理解cas原理,对cas应用场景有深刻理解
- 46.深入理解java.concurrent包中各个常用类,对自旋锁,重入锁,读写锁的深入理解对sync相关的偏向锁,轻量级锁和锁升级相关场景深入理解
- 47.深入理解volatile关键字以及缓存一致性协议,对使用场景有深入理解
- 48.深入理解current包中,阻塞和非阻塞队列熟悉应用场景和特性
- 49.熟悉线程池相关类,对线程池使用和拒绝策略比较熟悉
- 50.熟悉java集合相关类对jdk1.8集合升级特性有一定了解
- 51.深入理解,引用计数,标记清除,编辑整理相关GC算法特性以及应用场景
- 52.深入理解jvm classloader类加载机制
- 52.深入理解java反射机制和性能调优
- 53.深入理解jvm栈与堆的结构,以及线程出栈入栈的相关原理,对jvm中逃逸分析、栈上替换、方法内联有深入理解
- 54.深入理解jit动态编译原理,对解释执行、编译执行有深刻理解
- 55.熟悉jvm调优,分代收集等
- 56.深入理解tomcat启动原理以及相关的调优,对tomcat类加载机制有深入理解
- 57.深入理解rpc动态代理+zk+netty相关中间件原理和应用场景,对消息队列acticvemq、rabbitmq、kafka有一定的了解
- 58.熟悉redis使用,对高并发下的秒杀,分布式锁,防重等业务场景有深入理解,对缓存一致性,缓存击穿,缓存雪崩有深入理解
- 59.熟悉nginux相关限流算法、规则、负载均衡原理及应用场景、对流行降级策略降级框架有一定的了解
- 60.熟悉mybatis持久框架
- 61.熟悉mycat适用、mysql主从、读写分离有深入理解。对mycat+mysql的分库分表有深入理解
- 62.熟悉zookeep特性,以及在整个架构中的应用场景。对zk脑列、故障修复有一定的了解
-
-
1.hashaMap原理源码
2.synchronize关键字1.6之后的优化,(偏向轻量级锁,重量级锁)
synchronized是Java提供的一个并发控制的关键字,作用于对象上。主要有两种用法,分别是同步方法(访问对象和clss对象)和同步代码块(需要加入对象),保证了代码的原子性和可见性以及有序性,但是不会处理重排序以及代码优化的过程,但是在一个线程中执行肯定是有序的,因此是有序的。
原理:借用对象markword中的标记以及monitor监控器生成monitorEnter以及monitorExit指令以及对应的计数器。
在jdk1.6之前,synchronized是非常重量级的,因为它会无时无刻进行锁住对象,而不考虑到程序实际的竞争情况,大多数程序在都是进行交替执行,也就是说不存在资源的竞争,如果没有竞争,但是加锁,加锁和解锁是非常耗费性能的,(重量级)因为线程之间的切换以及线程从内核态到用户态的时间是耗费性能的。
在jdk1.6之后,sun公司对synchronized进行了大幅度的优化,现在采用偏向锁+(轻量级锁+cas)+重量级,之间通过锁碰撞进行切换。
3.双亲委派是什么
什么是类加载器?
类加载器是jre的一部分,负责动态将类添加到Java虚拟机。
类加载分类
1、启动类加载器 bootstrap classloader :加载jre/lib/rt.jar
2、扩展类加载器 extension classloader :加载jre/lib/ext/*.jar
3、应用程序类加载器 application classloader:加载classpath上指定的类库
双亲委派机制
双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。
双亲委派模型工作工程:
1.当Application ClassLoader 收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成。
2.当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader去完成。
3.如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。
4.如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载。
5.如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。
6.如果均加载失败,就会抛出ClassNotFoundException异常。
4.类加载过程中可以动态改字节码吗?
是可以的,在动态代理中CGLIB动态代理采用的就是ASM字节码处理框架,动态修改字节码。
问题延伸:
JDK动态代理:
CGLIB动态代理: