1. 类的加载机制
类加载器是java运行核心组件之一,类的加载由类加载器及其子类完成,当java需要对象时,类加载器会进行类的加载(生成类对象),连接(静态变量分配内存,默认值赋值)和初始化(有父类先加载父类,顺序初始化).
2. spring-IOC的核心机制和原理
ioc控制反转
核心机制:1)由spring框架实现对象的创建及管理
2)spring管理对象之间的依赖
原理:1)容器初始化时通过元数据的描述反射生成对象
2)通过get或者构造属性注入值
3)外界需要对象时通过key查询获取对象
3.spring-AOP的核心机制和原理
核心机制:基于OCP原则在不改变核心代码的前提下,动态织入拓展功能和管理目标的运行
原理:通过jdk或者cglib动态代理生成目标对象的代理类,来实现功能拓展.
两种动态代理:目标对象实现了接口则选用jdk,否则使用cglib
SpringMVC流程
1)客户端向服务端发起请求
2)请求经过滤器到达 DispatcherServlet 前端控制器,并初始化 Spring MVC配置。
3)前端控制器DispatcherServlet将请求资源url传递给HandlerMapping对象处理。
4)HandlerMapping 对象依据 URL 获取对象请求的执行链对象,然后先执行拦截器, 再执行后端处理器对象
5)将后台控制器的处理结果例如视图和数据封装到 ModelAndView对象,最后返回给 spring mvc
6)Spring mvc 解析控制层方法的返回结果(例如视图解析器解析视图)再进一步处理。
7)请求处理结束,返回客户端相关信息
4.什么是事务?事务的特性?
事务是将一组sql语句作为一个整体,只有当全部sql正常执行成功,才算事务执行成功,任何一条sql执行失败,那么整个事务执行失败,将回滚到操作之前的状态.
特性:ACID
原子性:事务是sql最小操作单元
一致性:执行事务的结果必须使数据库从一个一致性状态到另一个一致性状态
持久性:事务执行后对数据库的改变时持久的,不被丢失的.
隔离性:不同事务之间的执行是独立的,相互不影响.
5.内外连接的区别
内连接:只查询满足连接条件的数据
外连接:不满足连接条件的数据也查询出来
左外连接:join关键字左边的表不满足连接条件的数据也查询出来
右外连接:join关键字右边的表不满足连接条件的数据也查询出来
6. 事务的隔离级别
多个事务并行操作时,可能引发数据访问冲突,包括:脏读、不可重复读和幻读; 为了避免数据访问冲突,需要对并行的事务进行隔离,而完全隔离又会降低操作效率。 为了兼顾数据的安全和执行效率,数据库中提供了四种隔离级别:
READ_UNCOMMITED 读未提交,会引发脏读、不可重复读和幻读
READ_COMMITED 读取已提交,会引发不可重复读和幻读
REPEATABLE_READ 可重复读,会引发幻读,数据库的默认隔离级别
SERIALIZABLE 串行化,完全隔离,效率低
7.HTTP协议的作用和内容?
作用:规定服务器和客户端通信格式
内容:请求(请求行,请求头,请求实体) 响应(状态行,响应头,响应实体)
8.四大域对象
域对象 生命周期 作用范围 主要功能
PageContext Jsp开始访问-访问结束 整个JSP页面 Jsp页面中数据共享
Request 一次请求开始到结束 整个请求链 请求链中数据共享
Session 第一次调用Request.getSession时产生
销毁:1)30分钟超时销毁
2)自杀 invalidate方法
3)意外死亡:web被移除或者服务器非正常关闭 整个会话 整个会话数据共享
servletContext web应用加载时创建
web移除或者服务器关闭 整个web应用 整个web数据共享
8.九大隐式对象
Request,response,session,page,pageContext,application,config,exception,out
9.聊聊你对nginx的理解?
Nginx是开源,高并发,轻量级的http反向代理服务器,主要用于反向代理和实现负载均衡.
负载均衡实现方式:
- 轮询:按照配置顺序依次访问服务器
- 权重:按照配置权重访问服务器
- IP_hash:根据ip绑定服务器
10.伪静态
伪静态是指在浏览器中的地址 www.jt.com/index.html;虽然表面看上去为 html 结尾的静 态页面,但是实际后台处理的依然是.jsp 这样的动态页面.
采用伪静态的目的就是为了增强搜索引擎友好面.
11.Mysql主从复制原理
1)Mysql主机生成操作的二进制文件(需要手动开启)
2)从机I/O线程监听二进制文件
3)将获取到的数据写入中继文件中
4)Sql线程读取中继文件,实现数据库操作,实现数据同步
12. .描述Servlet生命周期
Servlet在第一次被访问时创建servlet实例,创建实例后会立即调用init方法初始化操作,实例化后该servlet实例会一直驻留在服务器中为之后访问该servlet的请求服务,知道web应用被移除,或者服务器关闭,实例将会销毁,在销毁前会调用destroy方法进行善后处理.
13. 面向对象的特征
1)封装:把一切能封装的代码封装起来,对外界只提供最简单的编程接口.
2)继承:从已有类(父类)得到继承信息创建新类的过程(子类)
3)多态:把子类当做一致的父类类型来处理,但是允许对同一请求可以做出不同的响应.
14.抽象类和接口的区别
抽象类和接口都不能被实例化,实现或继承的类必须实现抽象方法,否则该类也必须声明为抽象类.接口类比接口更加抽象,抽象类中可以有构造器,抽象方法和普通方法,接口中没有构造器,全是抽象方法.抽象类中的成员变量可以是public,protected,缺省,private,抽象类中的变量都是常量.
15. JVM虚拟机垃圾回收策略,以及使用场景
垃圾回收机制有很多种,包括:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆。栈保存了原始型局部变量,堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域:
- 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
- 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
- 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。
16.数据库优化策略
1.sql语句优化
1)优先使用单表查询
2)必须使用多表查询时,提前确定结果,否则会进行大量笛卡尔积操作.
3)尽量使用主键查询
2.创建索引
3.添加缓存
4.定期转储数据库(历史表策略)
5.分库分表(mycat分库分表中间件)
17.谈谈你对nginx的理解?
nginx是一款轻量级的web服务器,反向代理(代替客户端发起请求,将得到的响应信息响应给客户端)服务器及电子邮件服务器.特点是:占用内存少,并发能力强(理论5万/s,实例平均3万/s),软件负载均衡.
18.nginx实现负载均衡的方式?
1)轮询:按配置文件顺序,依次访问服务器
2)权重:按配置文件每台服务器的权重比例,让处理能力强的服务器多处理请求
3)ip_hash:根据用户的ip地址,哈希算法绑定一台固定的服务器.
19.如何实现用户数据共享?
1)url重写技术:将用户的sessionId拼入url中,后台代码处理.
效率低,早期使用,可以解决cookie禁用的问题.
2)ip_hash技术:通过ip值hash算法绑定指定服务器实现数据共享
缺点:a.由于绑定了特定服务器,可能会使该服务器负载过高
b.如果该服务器宕机,绑定该服务器的用户则访问不了.
3)sso单点登录技术:采用redis缓存技术模拟共享session
20.Linux系统特点
1)开源免费
2)运行最稳定的系统
3)运行安全性更好
4)操作系统运行内核小
5)操作都是基于文件的,只要权限足够久可以删除任意文件,可以自杀
21.数据库主从配置原理
1)主库中的操作会记录到二进制文件中(二进制文件需手动开启)
2)从库通过I/O线程实时读取二进制文件,将获取的信息同步到中继日志文件中
3)通过mysql线程,根据中继文件中的数据更新从机的数据库,实现主从同步.
22.什么是双机热备?调用过程是?
1)正常情况下主库负责写库操作,从库主要负责读库操作
2)当主库宕机后,通过一定技术手段实现主从切换,这时从库既充当主库又充当从库.
3)当运维人员主库修复成功后,因为之前双机热备,从库将信息同步到主库,实现数据一致
23.数据库分库分表
1)垂直拆分:根据不同的数据库,把有关联的表拆分到一个数据库中(按业务来拆分)
2)水平拆分:将数据库中的表拆分到多个数据库中的表中
24.设计缓存需要考虑的问题
1)缓存采用什么数据结构存储数据(K-V)
2)缓存数据如何和数据库中的数据保持一致(d代码实现)
3)缓存如何维护内存空间的大小(Lru最近最少使用算法)
4)缓存数据如何实现持久化(定期序列化到磁盘中)
25.redis
Redis是一种K-V存储系统,Value支持多种数据类型,例如Stirng,Set,List,Hash类型.并且操作都具有原子性.
Redis可以当做缓存,消息队列,数据库来使用.
26.redis的优点
作用:1)减少数据库访问次数,保护数据库
2)快速获取数据,提高相应速度
3)redis在大型项目中经常使用,例如消息队列
优点:1)底层C语言实现,工作在内存中,异常快速,存8W/S,取12万/S,平均10W/S
2)支持多种数据类型
3)Lru算法自动调优
4)支持数据持久化
27.什么是缓存击穿?
当遇到大规模并发操作时,请求大量的访问缓存,而缓存中数据为空或者命中率过低,这时候用户的请求会直接访问真实数据库,可能造成宕机的现象.
28.Redis中持久化策略?
- RDB模式是redis中默认的持久化策略.该模式能够定期(有时间间隔)将内存中的数据持久化到XXX.rdb文件中.
- 该模式的效率是最高的.相当于对内存做快照处理.
- 同时数据加密保存.
- 如果允许少量的数据丢失则首选RDB模式
- AOF模式通过持久化文件记录了用户的全部的操作过程.该模式可以实现数据的实时备份.
- AOF模式中持久化文件会很庞大.不易于解析.
- AOF文件没有加密处理.
特点:
如果对数据完整性有特殊要求,则采用AOF模式.
29.什么是JSONP?
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于客户端的同源策略,数据不能跨域访问,JSONP是利用script标签src属性访问跨域数据,并将数据封装成回调函数的结构,解析回调函数来获取数据。
30.JSONP和HTTPCLIENT的区别?
1.请求发送的解析的位置不同:
JSONP:是浏览器解析AJAX发起的请求.
httpClient:在业务层中,模拟发起http请求.
2.调用方式不同
JSONP:解决跨域问题
HttpClient:只要在业务层需要调用远程程序获取结果,就可以调用
3.安全性问题
JSONP是基于浏览器解析的,通过浏览器可以查询调用的详情.安全性不好.
HttpClient:浏览器不能获取HttpClient请求数据.
31.单点登录的调用过程?
1)用户输入账号密码,点击登录
2)web获取到用户信息,经过加密后,请求sso进行数据校验
3)sso对数据进行检验,如果账号不存在或者密码错误则返回给客户端异常.如果账号密码正确,则开始单点登录.
4)生成token唯一密钥作为key,将用户信息对象转为json串作为value存入redis中,并将tooken返回给web
5)web将tooken返回给客户端保存在cookie中
6)用户进行敏感操作时,先获取cookie中的tooken,查看redis中是否存在对应数据,确定用户是否已经登录,从而进行其他业务逻辑.
32.zookeeper
注册中心,为分布式系统提供一致性服务的软件.
业务逻辑说明:
- 当服务的提供者启动时,会将服务的名称:IP:端口会写入zookeeper.
- zookeeper内部会维护服务列表,某个服务提供者关机了,服务还能正常进行
- 当消费者需要访问服务时,需要先访问zookeeper获取服务列表信息.之后将服务列表保存到本地缓存中.方便后续的访问.在客户端内部有负载均衡的算法,筛选出一台服务器,之后进行访问.
- 如果zookeeper服务器出现宕机现象.这时注册中心通过心跳检测的方式判断服务器是否宕机.如果服务器宕机则会将该服务器信息从服务列表中删除.之后将新的服务列表发送消费者(客户端)进行更新.
- 当zk如果宕机后,消费者能否正确运行?
答案:可以
因为zk会动态的向客户端更新服务列表信息.当zk宕机后,由于之前已经同步了zk的服务列表信息,所以客户端可以按照自己已经缓存的清单进行访问.如果在这个期间服务端程序发现宕机现象,那么则访问故障机时由于不能通信,则等待超时时间,则访问下一台服务器.
如果这时,所有的服务端程序都宕机,则整个服务陷入瘫痪.
34.SOA介绍
SOA面向服务的架构(Service-oriented architecture)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过接口联系起来。各种各样的服务可以通过接口进行交互。
35. 浏览器与服务器session会话维持的机制
在创建session后,服务器会向浏览器发送Cookie来保存session的id,我们也可以向浏览器发送Cookie,也保存session的id,区别是我们发送的Cookie,可以设置最大生存时间,这个Cookie将会保存在硬盘上,即使浏览器关闭,Cookie也不会丢失,下次来访问服务器仍然可以带着session的id,也可以获取之前的session.
36.什么是Orm?
ORM是为一种为了解决程序面向对象模型和数据库关系数据模型不匹配问题的技术,通过元数据描述java对象和数据库数据的映射关系,实现数据类型转换.
37.说说你了解的设计模式
1)单列设计模式:饿汉式(静态变量),饿汉式(静态初始化代码块),[饿汉式实例没有延迟加载],懒汉式(线程不安全),懒汉式(同步代码块),懒汉式(同步方法),[同步线程安全,效率低],懒汉式(double-check),懒汉式(静态内部内),懒汉式(枚举)
2)代理模式(Dao)
3)工厂模式:实例工厂,静态工厂,spring工厂
4)装潢模式(new CacheExecutor(new SimpleExecutor()))
5)建造模式(XmlConfigBuilder,XmlMapperBuilder,SqlSessionFactoryBuilder)
6)责任链模式(Intercetor)
38.面向对象的三个特征
1)封装:将一切能封装的东西封装起来,对外界只保留最简单的编程接口
2)继承:从已有类得到继承信息创建新类的过程
3)多态:将子类当做一致的父类类型来对待,但是允许子类对同一信息做出不同的响应.分为:编译时多态,运行时多态.
39.抽象类和接口的区别
接口是极端的抽象类,实现了接口或者继承了抽象类的类必须重写所有的抽象方法,否则必须声明为抽象类.但是接口比抽象类更抽象,抽象类中可以有构造器,抽象方法和普通方法,而接口中不能有构造器,方法必须全为抽象方法.抽象类中的属性和可以是四种权限修饰符修饰,但接口中的属性只能为全局常量.
40.String中inner()方法的用法?
intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回。
String s1=”aa”;
String s2=s1.intern();
System.out.print(s1==s2);//返回true
41.线程局部变量ThreadLocal
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享, 简单说ThreadLocal就是一种以空间换时间的做法在每个Thread里面维护了一个ThreadLocal.ThreadLocalMap把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了.
42.生产者消费者模型的作用是什么?
(1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用。
(2)解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约。
43. 分布式下怎么保证session的统一?
1)url重写
2)ip_hash
3)redis模拟session共享
44. dubbo的实现原理?
1)消费者调用接口方法
2)动态代理生成代理对象
3)将接口名,方法名以及方法参数通过网络传输给提供者
4)提供者根据参数执行实现类方法
5)将执行结果返回.
dubbo负载均衡策略
在service或reference标签中配置负载均衡策略
<dubbo:service interface="…“loadbalance=” random “/>
或:
<dubbo:reference interface=”…“loadbalance=” random "/>
共有四种算法
1.Random LoadBalance
随机
2.RoundRobin LoadBalance
轮循
3.LeastActive LoadBalance
最少活跃调用数,使慢的提供者收到更少请求
4.ConsistentHash LoadBalance
一致性Hash,相同参数的请求总是发到同一提供者
45.同一服务在dubbo中注册两次会出现什么情况?
同一服务注册两次或者多次即为搭建集群,可实现负载均衡。
46.去dubbo中注册后,监控中没有出现服务提供者是什么原因?
1)超时时间太短,服务未连接上就超时
2)服务提供者连接zookeeper端口错误
47.怎么保证dubbo服务注册成功?
48. Spring中的事务你了解吗?
Spring 中的事务处理有两种方式:编程式事务处理和声明式事务处理。
编程式事务处理:需手动编写事务处理代码,代码量比较大,侵入性比较高,现已经不推荐使用。
声明式事务处理:采用 xml 或注解方式进行低侵入性事务处理,代码量比较小,开发效率高.可维护性更好
49.sleep和wait的区别?
Sleep是Thread的静态方法,调用此方法可让该线程休眠指定的时长,将CPU使用权让给其他线程,但是对象的锁依然保持,因此在休眠结束后线程会进入就绪状态。
而wait是Object中的方法,调用该方法会让线程放弃对象的锁进入等待池中等待,直到调用notify或者notifyAll方法被唤醒,则进入等锁池,当获取到锁时才能进入就绪状态。
50.什么是索引?索引的优缺点?索引的类型?什么情况索引会失效?
索引类似目录,可以加速数据的检索,但是进行增删改的时候会更新索引,降低效率,同时索引也会占大量的内存空间。
索引一般分为:普通索引,唯一索引,主键索引,组合索引。
失效:1)null值判断 2)or连接条件 3)条件判断><<>!=
4)模糊查询like %开头 5)索引列有函数处理或者隐式转换 6)多列索引,非第一部分
51.HashMap和HashTable的区别
都存储K-V键值对数据,但前者支持存储null值,同时hashTable是线程安全的,效率低下,hashMap是线程不安全的。如果需要使用线程安全的HashMap可以使用collection工具类包装一下,或者使用conCurrentHashMap
52.union和union all的区别
都是用来合并结果集,区别union自动去重,union all不去重
53.spring中事务的传播属性?
PROPAGATION_REQUIRED 需要事务,支持当前事务,如果没事务则新建一个事务
PROPAGATION_REQUIRES_NEW 新建事务,当前有事务,挂起
PROPAGATION_SUPPORT 支持当前事务,如果没事务,就以非事务方式运行
PROPAGATION_ NOT_SUPPORT 不支持事务,如果有事务,则事务挂起
PROPAGATION_NEVER 不支持事务,如果有事务,则抛异常
PROPAGATION_MADATORY 强制事务,如果当前没事务,则抛异常
PROPAGATION_ NESTED 嵌套事务
54.在开发中遇到过内存溢出吗?原因有哪些?解决方案有哪些?
1)内存中一次性读取数据量过于庞大,如一次性从数据库取出过多数据
2)代码中有死循环,产生过多重复的实体对象
3)递归调用
4)JVM启动参数内存值设定得太小
5)集合类中有对象的引用,使用完后未清空,使得JVM不能回收
55. 分布式系统中CAP代表什么
C代表一致性,A代表可用性,P代表分区容错性,分布式系统需要解决的问题就是在满足分区容错性的前提下如何平衡一致性和可用性。
56.HttpClient与JSONP的区别
1.请求发送的解析的位置不同:
JSONP:是浏览器解析AJAX发起的请求.
httpClient:在业务层中,模拟发起http请求.
2.调用方式不同
JSONP:解决跨域问题
HttpClient:只要在业务层需要调用远程程序获取结果,就可以调用
3.安全性问题
JSONP是基于浏览器解析的,通过浏览器可以查询调用的详情.安全性不好.
HttpClient:浏览器不能获取HttpClient请求数据.
实现单点登录流程
问题:如果用户没有登陆,则不允许执行敏感操作(查询订单/查询物流…),因为采用集群的搭建方式,所以session不能共享.
解决:
- 当用户输入用户名和密码后点击登陆按钮后,系统访问jt-web
- Jt-web接收用户的数据后经过加密处理后,请求JT-SSO进行数据校验.
- JT-SSO接收请求后,进行用户信息的校验,
如果根据数据查询,用户不存在,用户输入的用户名或者密码错误.则直接返回错误提示(state:201)
如果用户名和密码正确.则开始实现单点登录. - 生成加密的秘钥TOKEN,之后将user数据转化为userJSON数据.将数据保存到redis服务器中.token充当key,userJSON充当value.
- JT-SSO将用户登陆的秘钥token返回给JT-WEB
- JT-WEB将TOKEN数据返回给用户,将TOKEN数据保存到用户浏览器的Cookie中.
- 如果用户再次访问JT-WEB时,获取Cookie中的TOKEN,查询Redis缓存服务器.如果有数据,则证明用户已经登陆.则进行数据回显.
如果用户返回数据为null,表示没有登陆.则根据具体的业务实现再定.
问题提取
- 类的加载机制
- spring-IOC的核心机制和原理
- spring-AOP的核心机制和原理
- 什么是事务?事务的特性?
- 内外连接的区别
- 事务的隔离级别
- HTTP协议的作用和内容?
- 四大域对象
- 1.九大隐式对象
- 聊聊你对nginx的理解?
- 伪静态
- Mysql主从复制原理
- 描述Servlet生命周期
- 面向对象的特征
- 抽象类和接口的区别
- JVM虚拟机垃圾回收策略,以及使用场景
- 数据库优化策略
- 谈谈你对nginx的理解?
- nginx实现负载均衡的方式?
- 如何实现用户数据共享?
- Linux系统特点
- 数据库主从配置原理
- 什么是双机热备?调用过程是?
- 数据库分库分表
- 设计缓存需要考虑的问题
- 谈一下你对redis的理解
- redis的优点
- 什么是缓存击穿?
- Redis中持久化策略?
- 什么是JSONP?
- JSONP和HTTPCLIENT的区别?
- 单点登录的调用过程?
- zookeeper
- 当zk如果宕机后,消费者能否正确运行?
- SOA介绍
- 浏览器与服务器session会话维持的机制
- 什么是Orm?
- 说说你了解的设计模式
- 面向对象的三个特征
- 抽象类和接口的区别
- String中inner()方法的用法?
- 线程局部变量ThreadLocal
- 生产者消费者模型的作用是什么?
- 分布式下怎么保证session的统一?
- dubbo的实现原理?
- 同一服务在dubbo中注册两次会出现什么情况?
- 去dubbo中注册后,监控中没有出现服务提供者是什么原因?
- 怎么保证dubbo服务注册成功?
- Spring中的事务你了解吗?
- sleep和wait的区别?
- 什么是索引?索引的优缺点?索引的类型?什么情况索引会失效?
- HashMap和HashTable的区别
- union和union all的区别
- spring中事务的传播属性?
- 在开发中遇到过内存溢出吗?原因有哪些?解决方案有哪些?
- 分布式系统中CAP代表什么
- HttpClient与JSONP的区别
实现单点登录流程
问题:如果用户没有登陆,则不允许执行敏感操作(查询订单/查询物流…),因为采用集群的搭建方式,所以session不能共享.
解决: