什么是JMM,谈谈你对JMM的理解?
JMM(Java 内存模型),
Java线程之间的通信采用的是过共享内存模型,这里提到的共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。
需要注意的是,JMM与Java内存区域的划分是不同的概念层次,更恰当说JMM描述的是一组规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性,有序性、可见性展开的(稍后会分析);参考这里
Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存
储到内存和从内存中取出变量这样底层细节。此处的变量与 Java 编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。
谈谈你对GC的理解?
这篇博文总结的非常到位!
结合GC三要素:
1. 什么内存需要GC?
2. 什么时候进行GC?
3. 怎么进行GC回收?
谈谈你对spring的AOP的理解?
它利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”, 简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
TCP连接为什么是3次握手,4次挥手?
- 因为在连接过程中,客户端向server端发送SYC同步请求时,server直接可以回复SYC(用来同步)和ACK(用来应答)给客户端,这样客户端再回复ACK给server端后就可以传输数据了。
- 而在断开连接过程中,客户端向server端发送FIN后,server并不会马上关闭socket,因为可能还有数据在传输,只会回复ACK提醒客户端你的FIN请求我收到了,之后等它的数据都传完了,才会发送FIN报文告诉客户端我传完了,然后客户端继续发送ACK作为应答,这才可以算是结束了挥手过程。
对于MySQL慢查询你有什么优化策略?
为什么选用springboot作为开发框架?
内核还是spring,不过是对外做了大量封装,大大提高了开发的效率;不必再像传统spring开发过程中,需要面临大量的整合三方应用包括服务器等的麻烦,配置起来非常方便;方便了部署,配置,监控;缺点是封装了太多的东西,更加难以接触到spring的本质,就像是棉花糖,使用方便,但是想做自己单独的配置,需要去读很多官方文档,修改不少指定的类,而且版本不断的更新,有不少坑得踩;
谈谈SpringMVC的原理
首先MVC是一种设计模式,model是模型,如services层和dao层处理业务的,view是视图,如前端的html和jsp显示层,controller是控制器,是控制用户访问的控制层,如执行拦截,验证,根据特定的url找到对应的模型进行处理等;之前网络上有struts,struts2等MVC框架出现过,而SpringMVC就是基于spring这一个非常流行框架下的MVC框架,因为Spring框架的IOC和AOP等特性,springmvc也流行起来,主要能将业务处理很好的和用户访问控制解耦,天然集成于spring中;
和struts区别:springmvc是基于方法开发,一个url对应一个方法,参数作为方法形参传入,而struts2是基于类,请求参数是通过类的属性传入;
如何工作的?
为什么选用RabbitMQ作为消息中间件
传统的AMQP实现的消息队列,对数据的一致性,可靠性,稳定性要求较高,但是对性能和吞吐量还在其次;而kafka一开始开发出来就是为了处理海量数据如日志处理和传输,追求高吞吐量,不支持事务。
谈谈你对Redis的理解?
Redis不仅可以做缓存,还可以做DB,分布式锁,消息队列等;使用Redis作为缓存层,主要是基于Redis的性能和并发:redis是单线程的,redis的纯内存操作;采用了非阻塞的I/O多路复用机制;
缓存穿透:访问的数据都不在缓存里导致大量访问数据库,从而使数据库连接异常;
缓存雪崩:缓存同一时间的大量失效,又来一波请求,结果导致数据库连接异常;
Redis里使用过哪些常见的数据类型,有序的集合使用过么?底层是怎么实现的?
死锁的生成条件
死锁的条件:互斥、持有并等待、资源不可被剥夺、循环等待