文章目录
先看原题,自己心里默想一遍答案再滑到后面对比答案。答案来源于网络,欢迎指正,共同进步
1、聊项目
项目背景
项目大致流程
负责模块
遇到的问题
如何解决的
2、JVM讲一下
定义:JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
JVM体系结构:
类装载器ClassLoader:用来装载.class文件执行引擎:执行字节码,或者执行本地方法
运行时数据区:方法区、堆、Java栈、程序计数器、本地方法栈
3、你了解的垃圾回收机制
- 概述:垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
- 常用的垃圾回收判断算法:
- 引用计数法
- 可达性分析法
- 常用的GC算法:
- 标记-清除算法
- 复制算法
- 标记-压缩算法
4、垃圾回收策略怎么选择
1、两个串行收集器、三个并行收集器、一个并发收集器。
2、ParNew收集器是Serial的多线程版本。
3、Serial Old收集器是Serial收集器的旧生代版本。
4、Parallel Scavenge收集器以吞吐量为目标,适合在后台运算而不需要太多交互的任务。
5、Parallel Old收集器是Parallel Scavenge的旧生代版本。
6、Parallel Scavenge收集器和Parallel Old收集器是名副其实的“吞吐量优先”组合。
7、除CMS外,其他收集器工作时都需要暂停其他所有线程,CMS是第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收 集器线程与 用户线程同时工作,是一款以最短停顿时间为目标的收集器,适合交互性较多的场景,这也是与Parallel Scavenge/Parallel Old吞吐量优先组合的区别。
8、新生代因为回收留下的对象少,所以采用标记-复制法。
9、旧生代因为回收留下的对象多,所以采用标记-清除/标记-整理算法
5、讲一下线程池(几个参数和工作流程)
- 五个参数:
- 核心线程池(corePoolSize)
- 最大线程池(maximumPoolSize)
- 等待队列(workQueue)
- 保持时间(keepAliveTime)
- 拒绝策略(RejectedExecutionHandler)
- CallerRunsPolicy:如果发现线程池还在运行,就直接运行这个线程
- DiscardOldestPolicy:在线程池的等待队列中,将头取出一个抛弃,然后将当前线程放进去。
- DiscardPolicy:什么也不做
- AbortPolicy:java默认,抛出一个异常:RejectedExecutionException。
6、hashmap说一下
- 底层原理:
- 1.7:数组+链表
- 1.8:数组+链表+红黑树 (数组长度大于64并且链表长度大于8升级为红黑树)
- 问红黑树:自求多福
7、spring是什么
概念:轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架
8、什么是ioc
- 概念:控制反转,把创建对象和调用对象的过程交给是spring管理。
- 口头语:原本是自己new对象的,控制权在我们手里;现在把new的过程交给spring做了,控制权就反转给了spring
- 底层原理:xml解析、工厂模式、反射
9、什么是aop,举例子
- 概念:面向切面的编程,在不改变原有方法主体的情况下对该方法进行增强
- 例子:日志框架、@Transactional注解等
10、bean的生命周期
- 实例化
- 属性赋值
- 前置处理:把bean的实例传递给bean的前置处理器的方法
- 初始化
- 后置处理:把bean的实例传递给bean的后置处理器方法
- 获取对象
- 销毁
11、讲一下快排
参考回答首先选择一个轴值,小于轴值的元素被放在数组中轴值左侧,大于轴值的元素被放在数组中轴值右侧,这称为数组的一个分割(partition)。快速排序再对轴值左右子数组分别进行类似的操作,选择轴值有多种方法。最简单的方法是使用首或尾元素。但是,如果输入的数组是正序或者逆序时,会将所有元素分到轴值的一边。较好的方法是随机选取轴值
时间复杂度:
最优:O(nlogn)
最差:O(n*n)
平均:O(nlogn)
空间复杂度:
最优:O(logn)
最差:O(n)
12、线程有几种状态、分别说一下
- 新建(new):新创建一个对象
- 就绪(runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除****CPU之外,其它的运行所需资源都已全部获得。
- 运行(running):就绪状态的线程获取了CPU,执行程序代码。
- 阻塞:
- 等待阻塞
- 同步阻塞
- 其他阻塞
- 死亡(dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
13、说一下你知道的数据库引擎、他们的有什么区别
MyISAM: Mysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务
.frm: 存储表结构
.myd: 存储数据,MYData的缩写
.myi: 存储索引,MYIndex的缩写InnoDB :事务型数据库的首选引擎,支持ACID事务,支持行级锁定
14、什么是数据库索引,索引有哪些,区别
- 索引概念:就是为了提升查询效率,类似于于目标
- 有哪些索引:
- 聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序
- 非聚集索引:就是给普通字段加上索引
- 联合索引:就是好几个字段组成的索引,称为联合索引
15、反问
工作内容
作息时间
项目能力提升空间