面试题专场之源码和JVM篇

面试源码篇

1、阅读过哪些框架的源码?
SSM框架源码
Spring Boot
Spring Cloud
Tomcat
Netty
Dubbo
RocketMQ
。。。
2、说说你为什么要读源码?以及你读源码最大的收获是什么?
为了面试(内心独白)
编码能力(面向对象思想、设计模式)—面试官喜欢听的(因为大厂喜欢自研)
为了解决一些框架使用时的bug或者是完整用法
喜欢读源码,因为从源码中可以学到很多东西
因为我喜欢写技术博客 — 加分项
3、在你阅读的Mybatis框架源码过程中,你见到了哪些设计模式及相关类,能举例说说吗?
构建者模式:SqlSessionFactoryBuilder/MappedStatement.Builder(构建者模式的范
本)/xxxxBuilder
读取配置文件,来构建一个对象。(原因:构建者模式更适合于那种私人定制方式的创建对
象)
工厂模式:SqlSessionFactory/MapperProxyFactory
代理模式:MapperProxy
UserMapper proxy = SqlSession.getMapper(UserMapper.class)
策略模式:TypeHandler
委托模式:CachingExecutor/RoutingStatementHandler
抽象模板方法模式:BaseExecutor#doQuery
。。。。
4、在你阅读的Spring框架源码过程中,你见到了哪些设计模式及相关类,能举例说说吗?
工厂模式:BeanFactory、ObjectFactory、AopProxyFactoty
代理模式:AopProxy、CglibAopProxy、JdkDynamicAopProxy
策略模式:BeanPostProcessor、NamespaceHandler
责任链模式:ReflectiveMethodInvocation
适配器模式:AdvisorAdapter
。。。。
5、在你阅读的SpringMVC框架源码过程中,你见到了哪些设计模式及相关类,能举例说说吗?
策略模式:HandlerMapping集合、HandlerAdapter集合、HttpMessageConverter集合
适配器模式:HandlerAdapter
。。。
6、从Mybatis源码角度,聊聊#{}和${}的参数解析时机以及参数设置的区别?

解析时机:${}先被解析、#{}后被解析
参数处理时机:?
7、我们经常说Spring容器或者IoC容器,那你能说说,Spring容器中存储的Bean都有哪些特点吗?它
们存储在哪个类里面?

单例、懒加载Bean
SingletonBeanRegistry#Map集合
8、在SpringMVC中,使用@RequestMapping注解建立的请求和处理器的映射关系是存储在哪?如何
存储的?

请求和处理器的映射关系是存储到两个集合中,为什么呢?
请求URL和RequestMappingInfo
RequestMappingInfo和HandlerMethod
因为在使用@RequestMapping注解的时候,一个URL会对应多个RequestMapping注解注释
的方法。
9、Spring源码中是如何处理的循环依赖问题?
第三级缓存和第二级缓存主要是为了解决Spring容器中存在的循环依赖问题。
第三级缓存是存储的beanName和ObjectFactory(产生提早暴露的bean实例的对象工厂)
ObjectFactory在bean实例化的时候,就已经持有了创建出来的Bean的引用
ObjectFactory在处理Bean的时候,会去判断BeanPostProcessor(会产生代理对象)
二级缓存,其实主要是为了将代理对象替换为原对象的地方
原流程会产生原对象
循环依赖流程可能产生代理对象
原流程会判断二级缓存是否有对应的代理对象,如果有,则使用代理对象去替换原对象
一级缓存,只存储完整体的Bean实例

面试JVM篇

1、是否了解类加载器双亲委派模型机制和破坏双亲委派模型?
双亲委派模型机制:皇子的例子
破坏双亲委派模型:JDK1.0的时候写好了一些类和类加载器,但是JDK1.2的时候才出现了双亲委
派模型。比如说DriverManager去加载Driver的时候,就是破坏了双亲委派模型。
DriverManager相当于是皇上去处理
Driver实现类(第三方提供)相当于皇子去处理
2、JVM运行时数据区是如何分配内存的?说说各个区域的作用?
线程私有:没有线程,该内存不会有内容。这块区域的初始化大小,取决于固定配置还是扩展配
置。
程序计数器
虚拟机栈(方法调用、方法执行)
本地方法栈
线程共享:GC回收的区域
堆(新生代、老年代)
方法区(1.8之前:永久代,1.8及以后:元空间)
3、能聊一聊字符串常量池吗?
JDK1.6及以前,是存储到永久代
JDK1.7及以后,是存储到堆上的。
JDK1.6及以前,字符串常量池中,存储的对象(如果原来没有,则复制到字符串常量池中一个对
象)和引用stringtable
JDK1.7及以后,字符串常量池中,存储的对象()和引用stringtable
4、Java 虚拟机是如何判定两个 Java 类是相同的?
同一个类被不同的类加载器去加载的话,在JVM内存中,会存在两个Class对象
类加载器和类的全路径都要一致。
5、在 Java 中,对象什么时候可以被垃圾回收?
首先先由可达性算法去判断对象是否可回收
二次标记,相当于二次审判。finalize方法
其次再去根据GC的回收机制,择时回收
6、能简述一下Java 垃圾回收机制吗?
先要了解垃圾对象的判定算法
再了解垃圾回收四种算法
再了解垃圾回收器(串行垃圾回收器、并行垃圾回收期、CMS、G1、ZGC等)
再了解什么场景下应该选择哪种垃圾回收器去回收垃圾对象最高效。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值