第站:(深圳)
1. 多个线程同时读写,读线程的数量远远⼤于写线程,你认为应该如何解决 并发的问题?你会选择加什么样的锁?
1.当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞
2.当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是以写模式对它进行加锁的线程将会被阻塞
3.当读写锁在读模式的锁状态时,如果有另外的线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁的请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求则长期阻塞。
读写锁最适用于对数据结构的读操作次数多于写操作的场合,因为,读模式锁定时可以共享,而写模式锁定时只能某个线程独占资源(解释为读模式可以共享 所以不用创建线程 多个线程共享个资源, 二写模式由单个线程独占,所以要写更多的内容则需要创建更多的线程),因而,读写锁也可以叫做个共享-独占锁。
2. JAVA的AQS是否了解,它是⼲嘛的?
3. 除了synchronized关键字之外,你是怎么来保障线程安全的?
可重 锁指的是在个线程中可以多次获取同把锁,比如:
个线程在执行个带锁的方法,该方法中又调用了另个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁;
synchronized和reentrantlock都是可重 锁. reentrantlock 比synchronized更灵活 可以有自己的方法和属性. 通过盗用lock和unlock开锁解锁,解锁必须在finally代码块中执行.
4. 什么时候需要加volatile关键字?它能保证线程安全吗?
当并发线程考虑线程安全问题 volatile只能修饰变量 直接读取主内存中的数据, 写 也直接写 主内存. 被volitile 修饰 的变量不会加载进内存永远是最新的.
5. 线程池内的线程如果全部忙,提交个新的任务,会发⽣什么?队列全部 塞满了之后,还是忙,再提交会发⽣什么?
将任务存进任务队列中 . ThreadPoolExecutor's中的submit()方法会抛出一个RejectedExecutionException异常啦~~~
6. Tomcat本身的参数你般会怎么调整?
、Tomcat服务器优化(内存,并发连接数,缓存) --整理
a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。
b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。
c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。
7. synchronized关键字锁住的是什么东?在字节码中是怎么表示的?在内 存中的对象上表现为什么?
当前对象. class
8. wait/notify/notifyAll⽅法需不需要被包含在synchronized块中?这是为什 么?
wait() 方法执行默认释放对象锁 所以为了同步 需要在synchronized块中
9. ExecutorService你般是怎么⽤的?是每个service放个还是个项 ⾥⾯放个?有什么好处?
第二,第三站
Spring
1. 你有没有过Spring的AOP? 是来嘛的? 概会怎么使?
面向切面 . 底层是通过动态代理实现的. 动态的对方法进行增强. 在xml中配置
2. 如果个有2个不同的实现, 那么怎么来Autowire指定的实现?
Autowire @Qualifier 来确定实现
3. Spring的声明式事务 @Transaction注解般写在什么位置? 抛出了异常 会动回滚吗?有没有办法控制不触发回滚?
service层的接口实现类上 会回滚 . (3) 通过设置事务传播行为的 not_reuqeiid 默认不使用事务.
4. 如果想在某个Bean成并装配完毕后执的逻辑,可以什么式实 现?
@after 切入要实现的逻辑 并在xml中配置
5. SpringBoot没有放到web容器⾥为什么能跑HTTP服务?
6. SpringBoot中如果你想使⽤⾃定义的配置⽂件⽽不仅仅是 application.properties,应该怎么弄?
7. SpringMVC中RequestMapping可以指定GET, POST⽅法么?怎么指定?
@RequestMapping(value="index",method={RequestMethod.GET,RequestMethod.POST})public String index(){ return "index.html";}
8. SpringMVC如果希望把输出的Object(例如XXResult或者XXResponse)这 种包装为JSON输出, 应该怎么处理?
@response
9. 怎样拦截SpringMVC的异常,然后做⾃定义的处理,⽐如打⽇志或者包装 成JSON
10. 1.struts1和struts2的区别
struts2是webwork的升级. 不是struts1的延伸.
strut1 封装参数通过Actionform struts2可以通过属性驱动和模型
struts1默认执行的是控制器. struts2默认执行的是过滤器
管理action时struts1是单例的 struts2是多例的
11. .struts2和springMVC的区别
12. spring框架中需要引用哪些jar包,以及这些jar包的用途
13. springMVC的原理
14. springMVC注解的意思
15. spring中beanFactory和ApplicationContext的联系和区别
ApplicationContext
beanFactory是ApplicationContext的父类
16. spring注 的几种方式
注解注入, 配置文件注入. set方法注入
17. spring如何实现事物管理的
通过注解 和xml配置文件
18. springIOC和AOP的原理
19. hibernate中的1级和2级缓存的使用方式以及区别原理
2.一级缓存
Hibenate中一级缓存,也叫做session的缓存,当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。
一级缓存可以在session范围内减少数据库的访问次数,只在session范围有效,session关闭,一级缓存失效。
session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
Hibernate提供了基于应用程序级别的缓存, 可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存
它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围
20. spring中循环注 的方式
MySQL
1. 如果有很多数据插 MYSQL 你会选择什么式?
2. 如果查询很慢,你会想到的第式是什么?索引是嘛的?
构建索引. 索引类似书籍的目录. 通过索引快速找到 查询数据在数据库中的位置
3. 如果建了个单列索引,查询的时候查出2列,会到这个单列索引吗?
4. 如果建了个包含多个列的索引,查询的时候只⽤了第列,能不能⽤上 这个索引?查三列呢?
5. 接上题,如果where条件后⾯带有个 i + 5 < 100 会使⽤到这个索引吗?
不会. 运算 不走索引
6. 怎么看是否⽤到了某个索引?
使用explain命令查看query语句的性能:
EXPLAIN select * from t_car_copy ; ##查看执行计划中的sql性能
EXPLAIN select * from t_car_copy where org_id = '3';
EXPLAIN select * from t_car_copy where 1=1 and org_id = '3';
7. like %aaa%会使⽤索引吗? like aaa%呢? 后面的会
8. drop、truncate、delete的区别?
delete保留索引 可以恢复
truncate重建索引. 主键生成策略 不可恢复
drop删除整张表 和数据库
9. 平时你们是怎么监控数据库的? 慢SQL是怎么排查的? --没懂
10. 你们数据库是否⽀持emoji表情,如果不⽀持,如何操作?
11. 你们的数据库单表数据量是多少?般多⼤的时候开始出现查询性能急 剧下降? --没懂
12. 查询死掉了,想要找出执⾏的查询进程⽤什么命令?找出来之后般你 会⼲嘛?
13. 读写分离是怎么做的?你认为中间件会怎么来操作?这样操作跟事务有 什么关系? 14. 分库分表有没有做过?线上的迁移过程是怎么样的?如何确定数据是正 确的?
15. MySQL常用命令
16. 数据库中事物的特征?
原子性. 事务操作要么都成功 或都失败.
一致性 :事务执行结果使事务从一致性状态到另一个一致性状态
隔离性 事务执行不被其他事务影响
永久性. 事务操作对数据库的改变是永久的
17. JDBC的使用?
一般dao层框架底层都是对JDBC进行封装, 所以JDBC单独操作数据库 速度是最快的.
18. InnodB与MyISAM的区别
InnodB支持事务, 支持外键. MyISAM都不支持
InnodB用于 写入和更新比较多的且数据量比较大的. MyISAM用于查询多的. 数据量小的
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
InnodB数据文件本身就是索引文件
19. MySQL为什么使用B+树作为索引?
JVM
1. 你知道哪些或者你们线上使⽤什么GC策略? 它有什么优势,适⽤于什么 场景?
1 New Generation的GC策略
Serial GC。采用单线程方式,用Copying算法。到这里我们再来说说为什么New Generation会再次被划分成Eden Space和S0、S1,相信聪明的你一定已经想到Copying算法所需要的额外内存空间了吧,S0和S1又称为From Space和To Space。具体细节自己好好想想。
Parallel Scavenge。将内存空间分段来使用多线程,也是用Copying算法。
ParNew。比Parallel Scavenge多做了与Old Generation使用CMS GC一起发生时的特殊处理。
5.2 Old Generation的GC策略
Serial GC。当然也是单线程方式,但是实现是将Mark-Sweep和Mark-Compact结合了下,做了点改进。
Parallel Mark-Sweep、Parallel Mark-Compact。同样也是把Old Generation空间进行划分成regions,只是粒度更细了。为什么用这两个算法,不用我赘述了吧。
CMS(Concurrent Mark-Sweep) GC。我承认这个GC我真的没怎么看懂,目的是为了实现并发,结果就造成具体实现太麻烦了。有兴趣的朋友去看书吧,文末我说了是哪本书。这里有个地方可以说一下,就是算法使用的还是Mark-Sweep,对于内存碎片的问题,CMS提供了一个内存碎片的整理功能,会在执行几次Full GC以后执行一次。
2. JAVA类加载器包括⼏种?它们之间的⽗⼦关系是怎么样的?双亲委派机 制是什么意思?有什么好处?
3. 如何⾃定义个类加载器?你使⽤过哪些或者你在什么场景下需要个⾃ 定义的类加载器吗?
动态代理的时候
4. 堆内存设置的参数是什么? 5. Perm Space中保存什么数据? 会引起OutOfMemory吗? 6. 做gc时,个对象在内存各个Space中被移动的顺序是什么?
7. 你有没有遇到过OutOfMemory问题?你是怎么来处理这个问题的?处理 过程中有哪些收获?
发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够
1. 增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行:
JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"
OutOfMemoryError: Java heap space
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:
1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。
我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。
2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m
8. 1.8之后Perm Space有哪些变动? MetaSpace⼤⼩默认是⽆限的么? 还是 你们会通过什么⽅式来指定⼤⼩?
9. Jstack是⼲什么的? Jstat呢? 如果线上程序周期性地出现卡顿,你怀疑可 能是gc导致的,你会怎么来排查这个问题?线程⽇志般你会看其中的什么 部分?
10. StackOverFlow异常有没有遇到过?般你猜测会在什么情况下被触 发?如何指定个线程的堆栈⼤⼩?般你们写多少?
在hibernate一对多映射中,两个实体都重写了toString()方法,,应用程序递归太深了,所以发生了堆栈溢出。解决方法就是将多的一方对象里面重写的toString方法去掉,
多线程
1) 什么是线程?
2) 线程和进程有什么区别?
3) 如何在Java中实现线程?
4) 用Runnable还是Thread?
6) Thread 类中的start() 和 run() 方法有什么区别?
8) Java中的volatile 变量是什么?
9) Java中的同步集合与并发集合有什么区别?
10) 如何避免死锁?
11) Java中活锁和死锁有什么区别?
12) Java中synchronized 和 ReentrantLock 有什么不同?
13) Java中ConcurrentHashMap的并发度是什么?
15) 单例模式的双检锁是什么?
16) 写出3条你遵循的多线程最佳实践
17) 如何避免死锁?
18. 常用的线程池模式以及不同线程池的使用场景
Netty
1.BIO、NIO和AIO的区别?
2.NIO的组成?
3.Netty的特点?
4.Netty的线程模型?
5.TCP 粘包/拆包的原因及解决方法?
6.了解哪几种序列化协议?
7.如何选择序列化协议?
8.Netty的零拷贝实现?
9.Netty的高性能表现在哪些方面?
10.NIOEventLoopGroup源码?
Redis
1.Redis与Memorycache的区别?
2.Redis的五种数据结构?
3.渐进式rehash过程?
4.rehash源码?
5.持久化机制
6.reaof源码?
7.事务与事件
8.主从复制
9.启动过程
10.集群
11.Redis的6种数据淘汰策略
12.redis的并发竞争问题?
Hadoop
1.HDFS的特点?
2.客户端从HDFS中读写数据过程?
3.HDFS的文件录结构?
4.NameNode的内存结构?
5.NameNode的重启优化?
6.Git的使用?
7.Maven的使用
好了,到这里面试题差不多已经写完了,如果以上的面试题题你已经全部理解,全部能回答出来了,那么我可以在这里告诉你,你牛批,我服。
如果以上题还不会的,还回答不上来的,那么你可以跟着我的脚步,我来介绍下我总结出来的几大体系。
以下就是我总结出来的几大体系图:
、源码分析
二、分布式架构
三、微服务
四、性能优化
五、Java工程化