- JVM 说一下(JVM 面试题)
(1) Jvm 内存图
(2) 什么是堆和栈?
- 多线程的实现形式(4 种)
(1) 继承 Thread 类,重写 run 办法
(2) 实现 Runnable 接口,重写 run 办法,实现 Runnable 接口的实现类的实例对象作为 Thread 构造函数的 target
(3) 通过 Callable 和 FutureTask 创立线程
(4) 通过线程池创立线程
- 有没有尝试进行多机 redis 的部署?如何保证数据统一的?
主从复制,读写拆散
一类是主数据库(master)一类是从数据库(slave),主数据库能够进行读写操作,当产生写操作的时候主动将数据同步到从数据库,而从数据库个别是只读的,并接管主数据库同步过去的数据,一个主数据库能够有多个从数据库,而一个从数据库只能有一个主数据库。
- 线程池(java 线程池面试题)
(1) 什么是线程池?
① 线程池是一种多线程解决模式,解决过程中将工作提交到线程池,工作的执行交由线程池来治理。
② 如果每个申请都创立一个线程去解决,那么服务器的资源很快就会被耗尽,应用线程池能够缩小创立和销毁线程的次数,每个工作线程都能够被反复利用,可执行多个工作。
(2) 为什么要应用线程池?
① 创立线程和销毁线程的花销是比拟大的,这些工夫有可能比解决业务的工夫还要长。这样频繁的创立线程和销毁线程,再加上业务工作线程,耗费系统资源的工夫,可能导致系统资源有余。(咱们能够把创立和销毁的线程的过程去掉)
(3) 线程池有什么作用?
线程池作用就是限度零碎中执行线程的数量。
① 提高效率 创立好肯定数量的线程放在池中,等须要应用的时候就从池中拿一个,这要比须要的时候创立一个线程对象要快的多。
② 方便管理 能够编写线程池治理代码对池中的线程同一进行治理,比如说启动时有该程序创立 100 个线程,每当有申请的时候,就调配一个线程去工作,如果刚好并发有 101 个申请,那多出的这一个申请能够排队等待,防止因无休止的创立线程导致系统解体。
(4) 说说几种常见的线程池及应用场景
① newSingleThreadExecutor
创立一个单线程化的线程池,它只会用惟一的工作线程来执行工作,保障所有工作依照指定程序 (FIFO, LIFO, 优先级) 执行。
② newFixedThreadPool
创立一个定长线程池,可控制线程最大并发数,超出的线程会在队列中期待。
③ newCachedThreadPool
创立一个可缓存线程池,如果线程池长度超过解决须要,可灵便回收闲暇线程,若无可回收,则新建线程。
④ newScheduledThreadPool
创立一个定长线程池,反对定时及周期性工作执行。
- Redis 是单例还是多例?
(1) 单例模式
5.2 单例模式有以下 3 个特点:
① 它必须有一个构造函数, 而且构造函数必须为公有
② 必须有一个保留实例的动态成员变量
③ 领有一个拜访这个实例的公共的静态方法
- 设计模式 23 种,说一下!你会的独自说一下
(1) 创立型模式,共五种:工厂办法模式、形象工厂模式、单例模式、建造者模式、原型模式。
(2) 结构型模式,共七种:适配器模式、装璜器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
(3) 行为型模式,共十一种:策略模式、模板办法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
(4) 其实还有两类:并发型模式和线程池模式
- 高并发怎么解决 ?( 如何解决高并发问题)
(1) HTML 动态化:效率最高,耗费最小
(2) 图片服务器拆散:独立的图片服务器,甚至多台图片服务器
(3) 数据库集群和库表散列
(4) 缓存
(5) 镜像
(6) 负载平衡:负载平衡将是大型网站解决高负荷拜访和大量并发申请采纳的终极解决办法。
- 多态应用的益处?
(1) 进步了代码的维护性(继承保障)
(2) 进步了代码的扩展性
- MySQL 有几种事务 个性?别离形容一下!(4 种)
(1) 原子性:事务中所有操作是不可再宰割的原子单位。事务中所有操作要么全副执行胜利,要么全副执行失败。
(2) 一致性:事务执行后,数据库状态与其它业务规定保持一致。如转账业务,无论事务执行胜利与否,参加转账的两个账户金额之和在事务前后应该是放弃不变的。
(3) 隔离性:隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相烦扰
(4) 持久性:一旦事务提交胜利,事务中所有的数据操作都必须被长久化到数据库中,即便提交事务后,数据库马上解体,在数据库重启时,也必须能保障通过某种机制复原数据。
- 过程和线程的关系以及区别?
(1)定义:
过程是具备肯定独立性能的程序对于某个数据汇合上的一次运行流动, 过程是零碎进行资源分配和调度的一个独立单位.
线程是过程的一个实体, 是 CPU 调度和分派的根本单位, 它是比过程更小的能独立运行的根本单位. 线程本人基本上不领有系统资源, 只领有一点在运行中必不可少的资源(如程序计数器, 一组寄存器和栈), 然而它可与同属一个过程的其余的线程共享过程所领有的全副资源.
(2)关系:
一个线程能够创立和撤销另一个线程; 同一个过程中的多个线程之间能够并发执行.
绝对过程而言,线程是一个更加靠近于执行体的概念,它能够与同过程中的其余线程共享数据,但领有本人的栈空间,领有独立的执行序列。
- Spring AOP 代理是什么?
(1) 代理是应用十分宽泛的设计模式。简略来说,代理是一个看其余像另一个对象的对象,但它增加了一些非凡的性能。
(2) Spring AOP 是基于代理实现的。AOP 代理是一个由 AOP 框架创立的用于在运行时实现切面协定的对象。
(3) Spring AOP 默认为 AOP 代理应用规范的 JDK 动静代理。这使得任何接口(或者接口的汇合)能够被代理。
(4) Spring AOP 也能够应用 CGLIB 代理。这对代理类而不是接口是必须的。
14.eureka 和 zookeeper 都能够提供服务注册与发现的性能,请说说两个的区别(长处)?
(1)zookeeper:当主节点故障时,zk 会在残余节点从新抉择主节点,耗时过长,尽管最终可能复原,但 是选取主节点期间会导致服务不可用,这是不能容忍的。
eureka:各个节点是平等的,一个节点挂掉,其余节点仍会失常保障服务。
(2)总结:驰名的 CAP 实践指出,一个分布式系统不可能同时满足 C(一致性)、A(可用性)和 P(分区容错性)。因为分区容错性 P 在是分布式系统中必须要保障的,因而咱们只能在 A 和 C 之间进行衡量。因而,Zookeeper 保障的是 CP, Eureka 则是 AP。
- Ribbon 与 Nginx 的区别?
(1) nginx 是客户端所有申请对立交给 nginx,由 nginx 进行实现负载平衡申请转发,属于服务器端负载平衡。既申请由 nginx 服务器端进行转发。
Nginx 适宜于服务器端实现负载平衡 比方 Tomcat
(2) Ribbon 是从 eureka 注册核心服务器端上获取服务注册信息列表,缓存到本地,而后在本地实现轮询负载平衡策略。既在客户端实现负载平衡。Ribbon 适宜与在微服务中 RPC 近程调用实现本地服务负载平衡,比方 Dubbo、SpringCloud 中都是采纳本地负载平衡。
- Ribbon 怎么实现客户端负载平衡?
因为 Spring Cloud Ribbon 的封装,咱们在微服务架构中应用客户端负载平衡调用非常简单,只须要如下两步:
(1)启动多个服务提供者实例并注册到一个服务注册核心或是服务注册核心集群
(2) 服务消费者通过被@LoadBalanced 注解润饰过的 RestTemplate 来调用服务提供者。
这样,咱们就能够实现服务提供者的高可用以及服务消费者的负载平衡调用。
14. Spring MVC 运行流程
(1) 用户发申请–>DispatcherServlet,前端控制器收到申请后本人不进行解决,而是委托给其余的解析器进行解决,作为对立拜访点,进行全局的流程管制。
(2) DispatcherServlet–>HandlerMapping,HandlerMapping 将会把申请映射为 HandlerExecutionChain 对象(蕴含一个 Handler 处理器, 多个 HandlerInterceptor 拦截器)。
(3) DispatcherServlet–>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而反对多种类型的处理器。
(4) HandlerAdapter–> 处理器性能解决办法的调用,HandlerAdapter 将会依据适配的后果调用真正的处理器的性能解决办法,实现性能解决,并返回一个 ModelAndView 对象(蕴含模型数据,逻辑视图名)
(5) ModelAndView 的逻辑视图名–>ViewResolver,ViewResoler 将把逻辑视图名解析为具体的 View。
(6) View–> 渲染,View 会依据传进来的 Model 模型数据进行渲染,此处的 Model 理论是一个 Map 数据结构
(7) 返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户。
15. IOC 底层实现原理
IoC,管制反转,是一种设计思维,对于 spring 框架来说,就是由 spring 来负责管制对象的生命周期和对象间的关系。是说创建对象的控制权进行转移,以前创建对象的主动权和创立机会是由本人把控的,而当初这种势力转移到第三方。它是通过反射机制 + 工厂模式实现的,在实例化一个类时,它通过反射调用类中 set 办法将当时保留在 Map 中的类属性注入到类中。
DI—Dependency Injection,即“依赖注入”由容器动静的将某个依赖关系注入到组件之中。
- AOP 底层实现原理
面向切面编程,利用一种称为“横切”的技术,剖解开封装的对象外部。将那些与业务无关,却为业务模块所独特调用的逻辑或责任封装起来。便于缩小零碎的反复代码,升高模块间的耦合度。实现 AOP 的技术,次要分为两大类:一是采纳动静代理技术,Spring 默认应用 Jdk 动静代理,如果指标类不是接口抉择 cglib 动静代理,二是采纳动态织入的形式。