晨考题汇总一. Java Web1. 什么是bom,什么是dom,两者有什么关系,尝试画一下两者的关系图
bom:BOM简称浏览器对象模型。是用来获取或设置浏览器的属性、行为,例如:新建窗口、获取屏幕分辨率、浏览器版本号等。 比如 alert();弹出一个窗口,这属于BOM
dom:DOM简称文档对象模型。是用来获取或设置文档中标签的属性,例如获取或者设置input表单的value值。document.getElementById(“”).value;
2.javascript 中== 和=== 的区别
==:仅比较两边的值。对于不同类型的对象,会先做类型转换再进行比较
===:会先比较两个对象的类型,类型相同才比较值。
3. 乱码问题怎么解决
post request。setC utf-8
get tomcat8以上不用管 以下 配置URIEn
4. 如何找到所有 HTML select 标签的选中项?
$(’[name=selectname]:selected’)
5. $(document).ready()是个什么函数?为什么要用它?
是一个页面载入函数,可以极大的提高Web应用程序的响应速度
6. 使用CDN加载 jQuery 库的主要优势是什么 ?
CDN:静态资源加速服务器
可以节省服务器带宽
可以更快地下载jquery文件
如果浏览器已经从同一个cdn上下载了jquery文件,再次打开页面时,不会再次下载
7. 跨域问题如何解决
跨域问题:不允许js跨服务器获取数据
解决方案:
cross:同源策略
后端通过response的头设置可以获得数据的域
jsonp = json+packpage
原理:走规则的空子,把json包装返回来,包装成一个javascript的函数
后端:把json包装成jsonp
前端:解开json
代理服务器
通过代理服务器访问数据
8. jsp的工作原理是什么
客户端通过浏览器向服务器发出请求,在该请求中包含了请求的资源的路径,这样当服务器接收到该请求后就可以知道被请求的内容。
服务器根据接收到的客户端的请求来加载相应的JSP文件。
Web服务器中的JSP引擎会将被加载的JSP文件转化为Servlet文件(.java)。
JSP引擎将生成的Servlet代码编译成Class文件。
服务器执行这个Class文件。
9. request.getParameter()和request.getAttribute() 的区别
request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据;
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。
10. servlet 的生命周期是什么
servlet的生命周期顾名思义就是从servlet出现到消亡(销毁)的全过程。
主要分为以下几个阶段: 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁
11. session 和 cookie 的区别
session 存储在服务器中,安全
cookie 存储在客户浏览器中,不安全
都是用来保存状态信息
12.重定向和转发的区别
转发:
转发速度快,不需要跨越服务器,在自己项目的页面之间跳转
转发是同一次请求
转发地址栏是没有变化的
转发可以带参数
反向代理:反向代理隐藏真实服务端
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。
我们平时访问百度时,直接访问www.baidu.com。它背后可能有成千上万的服务器为我们服务,但具体是哪一台为我们服务,我们并不知道,也没必要知道。我们只需要知道反向代理服务器是谁就可以(只要达到目的就可以了)。
来源:(43条消息) 什么是正向代理和反向代理_Kaiser king的博客-CSDN博客
34、nginx的 负载均衡算法或者说【负载均衡的方式】有哪些
轮询:nginx负载默认的方式,它的本意是将海量请求按照时间的顺序分配到不同的服务器上;如果某个服务器down掉,nginx可以将其自动踢出集群
权重:指定每个服务器的权重比例,由于有的服务器性能比较好,所以通过设置不同服务器间权重的比例可以发挥服务器的最大性能
ip_hash:根据ip经过hash后的结果进行分配,这样每个ip只能固定访问一个服务器
url_hash:根据url经过hash后的结果进行分配,这样每个url只能固定访问一个服务器
fair:根据后端服务器的响应时间 来分配请求,响应时间短的优先分配,响应时间越短说明服务器负载压力越小,所以优先分配
35、请描述一下 企业开发中 异常是怎样处理的
数据持久层(dao)和业务层(service)不处理异常,抛到控制层(controller)调用自定义异常进行统一处理
36、$(this) 和 this 关键字在 jQuery 中有何不同?
表示对象不同:this表示的是javascript提供的当前对象,$(this)表示的是用jquery封装后的当前对象。
过程不同:this对象可以直接用this.style修改样式,$(this)可以使用jquery提供的方法访问样式。
37、怎样理解无状态协议38、TCP和UDP的区别39、servlet是懒加载还是及时加载
懒加载
40、什么是jsp的内存对象二. 线程1. 线程池的原理是什么
原理:在应用程序启动之后,就马上创建一定数量的线程,放入空闲的队列中。这些线程都是处于阻塞状态,这些线程只占一点内存,不占用CPU。当任务到来后,线程池将选择一个空闲的线程,将任务传入此线程中运行。当所有的线程都处在处理任务的时候,线程池将自动创建一定的数量的新线程,用于处理更多的任务。执行任务完成之后线程并不退出,而是继续在线程池中等待下一次任务。当大部分线程处于阻塞状态时,线程池将自动销毁一部分的线程,回收系统资源。
工作流程(口述):
1、线程在有任务的时候会创建核心的线程数corePoolSize
2、当线程满了(有任务但是线程被使用完)不会立即扩容,而是放到阻塞队列中,当阻塞队列满了之后才会继续创建线程。
3、如果队列满了,线程数达到最大线程数则会执行拒绝策略。
4、当线程数大于核心线程数事,超过KeepAliveTime(闲置时间),线程会被回收,最终会保持corePoolSize个线程。
2. Executors创建的线程池种类有哪些
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数。超出的线程会在队列中等待
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。
3. 为什么阿里巴巴开发规约不让我们使用Executors创建线程池
说明:Executors 返回的线程池对象的弊端如下:
FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
CachedThreadPool 和ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
4. 你们用什么创建线程池
ThreadPoolExecutor
5. 线程池的7个核心参数分别是什么意思
corePoolSize: 线程池核心线程个数
workQueue:用于保存等待执行任务的阻塞队列
maximunPoolSize: 线程池最大线程数量
ThreadFactory: 创建线程的工厂
RejectedExecutionHandler: 队列满,并且线程达到最大线程数量的时候,对新任务的处理策略
keeyAliveTime: 空闲线程存活时间
TimeUnit: 存活时间单位
6. 什么叫做线程池的拒绝策略,一共有几种拒绝策略(重要)
当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略,一共有四种,第十题
7. 线程池的好处(重要)
降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行。
提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,监控和调优。
8. 线程池的种类 以及各种种类的特点(了解)
Executors.newFixedThreadPool(nThreads):固定容量的线程池。corePoolSize为nThreads,maximumPoolsize为nThreads,keepAliveTime为0ms,采用了无界队列。缺点在于容易造成大量内存占用,可能会导致OOM。 Executors.newSingleThreadExecutor():单个线程的线程池。corePoolSize为1,maximumPoolsize为1,keepAliveTime为0ms,采用了无界队列。缺点在于当请求堆积的时候,可能会占用大量的内存。 Executors.newCachedThreadPool():可缓存线程池,特点是具有自动回收多余线程的功能。corePoolSize为0,maximumPoolsize为Integer.MAX_VALUE,keepAliveTime为60s,采用了直接交换。缺点在于maximumPoolsize为Integer.MAX_VALUE,这可能会创建数量非常多的线程,甚至导致OOM。 Executors.newScheduledThreadPool(corePoolSize):支持定时及周期性任务执行的线程池。corePoolSize为corePoolSize,maximumPoolsize为Integer.MAX_VALUE,keepAliveTime为0ns,采用了优先队列。采用schedule()方法可以设置要执行的任务,以及执行的时间间隔,采用scheduleAtFixedRate()方法可以设置任务,第一次的延迟时间,以及执行的时间间隔。 Executors.newWorkStealingPool():JDK1.8后加入的线程池,与前面的线程池有很大的不同。通常来说,当这个任务可以产生子任务(如树的遍历、处理矩阵)的时候,才适合这种场景。这种线程池拥有一定的窃取能力,每一个线程之间会合作,任务会放在线程独有的队列中,而不是公共的队列,线程之间会有互相帮助的现象。注意点:1. 为了提高效率,任务最好不要加锁,因为任务可能被不同的线程执行;2. 不保证执行顺序。
9. 怎样创建线程池
通过 ThreadPoolExecutor 创建线程池;
通过 Executors 创建线程池。
10. 线程池的4个拒绝策略(重点)
1、AbortPolicy(被拒绝了抛出异常)
2、CallerRunsPolicy(使用调用者所在线程执行,就是哪里来的回哪里去)
3、DiscardOldestPolicy(尝试去竞争第一个,失败了也不抛异常)
4、DiscardPolicy(默默丢弃新任务、不抛异常)
11. ThreadLocal 是什么,特点是什么
概念:线程局部变量
特点:每个线程都能往其中存东西 ,但是每个线程取出来的东西都是自己放进去的,别的线程放进去的东西他娶不到,线程和线程之间是隔离的
12. ThreadLocal 的原理是什么?
在每一个线程对象里面都有一个ThreadLocalMap,我们的值其实是放在每个线程的 ThreadLocalMap中,而map的key 是ThreadLocal 对象,这样就能做到每个线程的局部变量是隔离的
13. 我们3层中,DBFactory 中ThreadLocal 是用来干什么的?
为了保证 同一个事务用的连接是同一连接
synchronized是关键字,lock是类,synchronized会自动释放锁,lock必须手动释放锁
2. 什么是公平锁 什么是非公平锁
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁,这种方式会造成性能低下,大量的时间花费在线程调度上。 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。
3. lock 公平锁和非公平锁实现的原理
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁,这种方式会造成性能低下,大量的时间花费在线程调度上。
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。
4. 什么是可重入锁 什么是不可重入锁,可重入锁的好处是什么
可重入锁又名递归锁,指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。与可重入锁相反,不可重入锁不可递归调用,递归调用就发生死锁
5. 独占锁,共享锁 互斥锁 排他锁 读写锁
读锁 :共享锁
写锁:独占锁 排他锁 互斥锁
6. synchronized的原理
synchronized是一种对象锁,是可重入的,但是不可中断的,非公平的锁。
和moniter对象有关,moniter对象是锁的要钥匙,如何实现的,是通过对象的对象头来实现,对象头是64位编码,如果我们对所有代码,一上来就使用锁,容易造成资源浪费,所以就有了锁升级概念,是自动调整的,根据实际情况,有无锁,偏向锁,轻量级锁,重量级锁
7. synchronized 锁升级
synchronized锁本质是一个对象锁,即在对象中锁的一个过程。
在JVM中,每个对象都有一个对象头,synchronized用的锁是存在对象头中的,对象头里Mark Word的存储结构是64位
在运行期间,Mark Word中的数据会随着锁标志位的变化而变化,Mark Word可能会变成以下四种状态:
无锁,偏向锁,轻量级锁,重量级锁
8. 悲观锁 和 乐观锁
乐观锁的原理:cas
乐观锁:对于并发间产生的线程安全问题持乐观态度,乐观锁认为竞争总是不会发生,因此他不需要持有锁,将比较和替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,应有相应的重试逻辑
悲观锁:对于并发间产生的线程安全问题持悲观态度,悲观锁认为竞争总是会发生,因此每次对于资源进行操作时,都会持有一个独占的锁,就像synchronized,直接上锁操作资源
9. 乐观锁的缺点
缺点一:不可重试
缺点二:ABA问题
如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的 “ABA”问题。
解决方式:添加版本号
缺点三:循环时间长开销大
自旋CAS(也就是不成功就一直循环执行直到成功)如果长时间不成功,会给CPU带来非常大的执行开销
10. 怎样无锁也能保证原子性
即乐观锁的原理,使用比较和替代实现原子操作
11. 写生产者和消费者12. a-b-c-d 4个线程同时就绪 请按照a-b-c-d的顺讯执行线程13.什么是自旋锁
如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗
14、详细描述一下锁升级的过程
无锁:首先是一个无锁的状态,代表着里面不涉及到锁,什么时候是无锁的状态呢,就是写了一个synchronized将一个对象锁住(写了一个对象),此时没有任何线程去访问这个对象,此时这个对象就是无锁状态,此时没有线程访问它
偏向锁:顾名思义它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁
轻量级锁:是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁
重量级锁:如果轻量级锁自旋到达阈值后,没有获取到锁,就会升级为重量级锁
锁升级不可逆,只能往上升,不能往下降
15、wait和sleep的区别
sleep,wait方法调用后都会阻塞当前线程并让出cpu的执行时间,但不同的是sleep方法不会释放当前持有的对象的锁资源,阻塞结束后会继续执行,而wait方法会放弃所有锁,并需要通过notify/notifyAll唤醒后重新获取到对象锁资源后才能继续执行
16、如何检查死锁
jstack
jconsole
jvisualvm
jmc
17、读写锁的原理18、怎样让一个线程有序执行 19、死锁产生的条件
不可剥夺
循环等待
互斥
请求与保持
四、数据库1、数据库并发会带来什么问题
脏读、不可重复读、幻读
2、请详细解释什么叫做 脏读 不可重复读 幻读
脏读:读到了其他事务未提交的数据
比如:事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中
不可重复读:不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
比如:事务 A 多次读取同一数据,但事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致
幻读:事务 A 多次读取一个范围内的数据集的过程中,事务 B 对数据进行了新增操作或者删除操作,导致事务 A 多次读取的数据集不一致
比如:目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读
3、数据库的隔离级别有哪些
读未提交
读以提交
可重复读
串行化
4、mysql 和 oracle的默认隔离级别分别是什么
mysql:可重复读
oracle:读已提交
5、数据库中性别用什么数据类型 钱用什么数据类型
性别:
枚举类型 优点:节省空间,提高查询效率
TinyINT
cha(1)
bit 1
钱:浮点类型统一用decimal
6、内连接 外连接 的区别
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。
7、请说出数据库连接池的好处 ,以及常见的配置
好处:
资源重用 由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。
更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间
统一的管理连接,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先设定的连接占用超时时间,强制收回被超时占用的连接。从而避免了常规数据库连接操作中可能出现的资源泄漏(当程序存在缺陷时,申请的连接忘记关闭,这时候,就存在连接泄漏了)
保护数据库
常见配置(druid):
maxActive:连接池支持的最大连接数
maxIdle:连接池中最多可空闲maxIdle个连接
minIdle:连接池中最小空闲连接数
initialSize:初始化连接数目
maxWait:连接池中连接用完时,新的请求等待时间
removeAbandonedTimeout:活动连接的最大空闲时间
minEvictableIdleTimeMillis:连接池中连接可空闲的时间
老师测c3p0版本:
initialPoolSize 初始化连接数
maxIdleTime 最大空闲时间
idleConnectionTestPeriod 多长时间检查一次是否有空闲连接
minPoolSize 最小连接数
acquireIncrement 一次增长几个
maxPoolSize 最大连接数
checkoutTimeout 最大等待时间
maxStatements 缓存PrependStatement
validation-query :SELECT 1 FROM DUAL(mysql特有的,因为mysql每过8个小时就会自动挂起,连接池不知道)
8、事务的四个特性(ACID)
原子性
一致性
隔离性
持久性
9、char、varchar的区别是什么?
char:定长字符串
varchar:可变长字符串
能选定长,绝不选变长
原因:1. 不容易产生碎片
同样长度 varchar在实际内存中,会多占两位
10、TRUNCATE和DELETE的区别是什么
二者都能删除表中的数据
delete
:属于 DML(数据操作语言) 范畴
truncate
:属于 DDL(数据定义语言) 范畴
delete
:能删除表中或基于真实表创建的视图中的数据truncate
:只能删除表中的数据,无法应用在视图上
delete
:删除表中数据时,可以通过where
关键字,进行选择性s删除truncate
:不能使用where
关键字进行选择性删除
delete
:删除表中数据时,涉及到事务处理:回退(缓存)、提交、撤退truncate
:删除缓存时,不涉及缓存事务处理delete:由于 delete 删除数据时要考虑事务管理(缓存、回退机制、日志记录),所以当删除大批量数据时,速度慢,效率低,甚至达不到删除的目的 truncate:删除大批量数据时,速度快、效率高、但无法撤销
delete
:可以运用SQL
语句、按照业务逻辑、按照一定的先后顺序可以删除相关表中的数据truncate
:不能删除对于由foreign key
约束引用的表,不能删除该表中的数据
trunca删除速度比 delete快
truncate 不涉及事务的提交和回滚
11、varchar(50)中50的含义
varchar(50)
中50
的涵义为最多存放50
个字符,varchar(50)
和varchar(200)
存储hello
字符串所占空间一样,但后者在排序时会消耗更多内存若列值的尾部含有空格,则CHAR列会删除其尾部的空格,而VARCHAR则会保留空格
12、int(20)中20的含义
int(10)的意思是假设有一个变量名为id,它的能显示的宽度能显示10位。在使用id时,假如我给id输入10,那么mysql会默认给你存储0000000010。当你输入的数据不足10位时,会自动帮你补全位数。假如我设计的id字段是int(20),那么我在给id输入10时,mysql会自动补全18个0,补到20位为止。
但是内存占用还是4个字节
13、钱用什么数据类型,性别用什么数据类型
性别:
枚举类型 优点:节省空间,提高查询效率
TinyINT
cha(1)
bit 1
钱:浮点类型统一用decimal
14、内连接和外连接的区别 什么是全连接
内连接:也称为等值连接,返回两张表都满足条件的部分
左连接,取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null
右连接:取右边的表的全部,左边的表按条件,符合的显示,不符合则显示null
全外连接:返回左右表中所有的记录和左右表中连接字段相等的记录。
15、Blob 和 clob
BLOB和CLOB都是大字段类型, 1、BLOB是按二进制来存储的,通常像图片、文件、音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去。
2、CLOB是可以直接存储文字的,像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新存储等操作都提供很大的方便。
16、事务并发会带来的问题17、什么是隔离级别,每种隔离级别可以解决什么问题
基于事务的隔离性,对并发操作带来的问题有不同的解决方案
18、一条sql 语句执行的过程
连接器
如果要操作 MySQL 数据库,我们必须使用 MySQL 客户端来连接 MySQL 服务器
查询缓存
MySQL 拿到第一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。
分析器
判断你输入的这个 SQL 语句是否满足 MySQL 语法
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
执行器
执行优化之后的执行计划,在开始执行之前,先判断一下用户对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误;如果有权限,就打开表继续执行。
19、mysql 怎样防止长连接产生的oom 问题
在使用数据库的过程中定时的去断开连接;
20、连接池配置中 validation-query: SELECT 1 FROM DUAL 配置是什么意思
mysql数据库每过8个小时,就会进入挂起状态
使用SELECT 1 FROM DUAL来检查数据库是否有效。
连接池每隔一段时间 用连接发一个最简单的请求给mysql 看这个连接有没有被挂起
21、口述 mysql的架构体系
连接层
客户端连接器:提供与MySQL服务器建立连接的能力
服务层
连接池:主要是负责存储和管理客户端与数据库的链接,一个线程负责管理一个连接
系统管理和控制工具:提供数据库系统的管理和控制功能
SQL接口:主要负责接收客户端发送过来的各种SQL命令,并将SQL命令发送到其他部分,并接收其他部分返回的结果数据,将结果数据返回给客户端。
解析树:主要负责对请求的SQL解析成一棵“解析树”,然后根据MySQL中的一些规则对“解析树”做进一步的语法验证,确认其是否合法
查询优化器:在MySQL中,如果“解析树”通过了解析器的语法检查,此时就会由优化器将其转化为执行计划,然后与存储引擎进行交互,通过存储引擎与底层的数据文件进行交互
缓存:MySQL的缓存是由一系列的小缓存组成的
存储引擎层
MySQL中的存储引擎层主要负责数据的写入和读取,与底层的文件进行交互
系统文件层
日志文件
数据文件
配置文件
pid文件
socket文件
22、cahr,varchar的区别
char:定长
varchar:不定长
23、索引的数据结构有哪些
线性: 数组 链表 队列 栈
树: 二叉树 搜索二叉树 平衡搜索二叉树(红黑树) b树(排序 多叉) b+树
图: n比n
hash: 查询性能最强 0(1),查询性能最强的是hash
24、b树为什么比二叉搜索树和hash更加适合做索引
b树比搜索二叉树好,因为b树多叉,索引b树更矮胖,查询的时间复杂度变少
b树比hash这种数据结构更加适合范围查找
25、b+树和b树的区别
b+树非叶子节点只存索引 只有在叶子节点才存数据 这样b+树比b树更加矮胖
26、一个树的节点是64k,请大致估算一下 以下表1000万条数据 ,分别用b树和b+树做索引 需要多少层
jvm内存模型中有程序计数器、堆、虚拟机栈、方法区、和本地方法栈五个部分
2、jdk1.7和1.8中jvm内存模型的区别
1.7中的方法区实现叫做永久代
1.8中方法区的实现叫做元空间
3、方法区中放的是什么
常量池、class文件、static、方法信息
4、哪些东西对于线程是共享的,哪些是独享的
线程私有:程序计数器、本地方法栈、虚拟机栈
线程共享:堆、方法区
5、程序计数器是用来干什么的
记录每一个线程执行到哪一行了
6、栈是不是越大越好,堆是不是越大越好
堆越大越好
栈不是越大越好,因为一个线程就分配一个栈,我们的物理内存是一定的,栈内存越大,可执行的线程数就会越少
7、Jvm的类加载机制
加载(Loading):将类的.class文件加载到内存中,并创建一个对应的Class对象。
验证(Verification):验证.class文件的正确性和安全性,包括文件格式、语义、字节码验证等。
准备(Preparation):为类的静态变量分配内存,并设置默认值。
解析(Resolution):将符号引用转换为直接引用,包括类、方法、字段等。
初始化(Initialization):执行类的初始化代码,包括静态变量赋值、静态代码块等。
三、面向对象1、抽象类和接口的区别
抽象类:is a 代表这是一个什么
接口:has a 代表一种规范
2、什么是原子类?原子类的原理?原子的类的优点?原子类的缺点
原子类:java.util.concurrent.atomic包下的类
优点:在高并发下不用考虑并发带来的问题
拓展:为什么原子类会导致自旋?
底层有一个while循环,当对原子类进行高并发操作时,每一个需要改变原子类的线程都必须改变原子类的值之后,才能结束循环,否则就会一直循环,也就是自旋
缺点:自旋影响性能,会产生ABA问题
原理:CAS(比较和替换) + 自旋
3、aba是什么问题 怎样解决
ABA问题:也就是经过两次比较和替换,导致原本已经被改变的值,又回到了初始值,当后边的线程进行操作时,会认为没有被替换过,然后继续进行操作
原子类解决ABA问题的方法:使用原子引用类,原子引用类里面包含初始值和版本号,这样,当我们改变引用类里的初始值时,版本号也会随之改变
4、equals详解
当我们的子类没有重写equals 时,我们调用的时Object 的equals方法,只有判断两个引用类型的地址是否相同; 当我们的子类重写equals 时,如同String和 Integer 一样,判断的是内容是否相等,这里我们自己写,需要判断来对象地址是否相同,对象一致,内容自然也就是一样的,如果不是,我们就要判断传入的对象编译类型是不是同一个,若是直接调用属性判断两者是否一样,若不是,则通过向下转型,转为同一个编译类型(前提是在创建对象的时候,对象引用指向目标转换的类型),再进行比较
5、一个字符占几个字节?
一:在ASCII码编码方案中,一个英文字符占用一个字节,一个汉字字符占用两个字节的空间;
二:在Unicode编码方案中,一个英文字符或一个汉字字符都占用两个字节的空间;
三:在UTF-8编码方案中,一个英文字符占用一个字节,一个汉字字符占用三个字节的空间。
一个字节占8位
6、什么是字符流,什么是字节流7、最有效计算2X8的方式8、throw和throws的区别四、集合1、ArrayList的扩容机制六、maven1、你们公司使用的maven 版本
3.5.4
2、使用maven 经常遇到的问题有哪些 怎么解决的
因网络波动导致依赖文件下载失败,但开发工具却误以为下载成功,这时候项目运行就会报错,得去本地仓库删除未下载成功的文件,并重新下载
引入多个依赖导致jar包重复问题,由于重复jar包版本不一致,于是去掉低版本,保留高版本
3、什么是maven 的3大坐标
groupId :定义当前Maven项目隶属的实际项目
artifactId : 该元素定义当前实际项目中的一个Maven项目(模块)
version : 该元素定义了使用构件的版本
4、maven 中打包类型(项目类型)有哪些 请说出每一种打包类型的使用场景
类型 场景 pom 聚合项目,管理其他项目的项目【整个工程的jar 以及 插件的版本】 war 在web容器中发布的项目(如tomacat下) jar 提供jar 共别人使用【长期被认为 是提供给别人使用的一些包和类 现在也可以做成启动项目】
5、使用过哪些maven的插件
tomcat
6、请写出5条mvn 命令
mvn clean
mvn package
mvn install
mvn deploy
mvn -v
7、操作系统环境变量中,配置path的作用
操作系统配置path 的作用 ,就是让path下的可执行的命令 可以在任何路径下被使用
8、maven 依赖的的jar 有哪些scope 的取值 分别代表什么意思
scope 周期 compile 默认值,适用于所有阶段(开发、测试、部署、运行) provided 只在编译,测试,运行阶段使用,部署上线的时候,不需将依赖的jar包打包到项目工程里,因为上线的服务器中会提供这个jar runtime 只在运行时使用,如JDBC驱动,适用运行和测试阶段。 test 只在测试时使用,用于编译和运行测试代码。例如junit.jar。 system Maven不会在仓库中中查找对应依赖,在本地磁盘目录中查找。适用编译、运行和测试阶段,它与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath指定本地jar文件路径,所以该scope是不推荐的。
9、maven 中依赖传递指的是什么 具体说出每一种scope依赖能否传递
依赖传递:A项目依赖B,B项目依赖了C,则A项目对C项目的依赖就是通过依赖B项目传递的,也就是依赖传递
当B对C的依赖的scope是test或者provided,则A不依赖C。
当B对C的依赖是scope是runtime、system或者compile,则A依赖C。且传递依赖的scope的规则:如果A对B的依赖是compile,那么A对C的依赖和B对C的依赖相同,否则和A对B的依赖保持一致。
10、你们公司使用maven私服吗 使用什么产品 什么版本
nexus
11、maven 私服的仓库类型
hosted proxy ground
12、什么是MAVEN
maven项目管理工具
13、display,pagckage,install
package: 打包不发布
install:打包并发布到本地仓库
display:打包并发布到企业仓库
七、git1、什么是git
Git 是一个开源的分布式版本控制系统
2、git常用指令
git init
新项目执行Git初始化,并进行第一次提交
git add .
添加指定目录到暂存区,包括子目录
git commit -m “提交内容备注”
将暂存区内容添加到本地仓库中
git status
查看当前分支状态
git reflog
查看所有分支的版本和所有操作记录
git reset –hard 要回退的版本号
回退到某个版本
git branch [***]
新建的分支名 新建分支
-a 查看所有分支信息
-d 本地分支名 删除本地分支
git checkout 分支名
切换分支
3、你们公司里面使用什么版本管理工具
git
4、git 和 svn的区别
git:分布式的
svn:非分式 没有本地仓库
5、使用git 的时候什么时候会可能产生冲突 产生冲突了怎么办
合并时,如果多条分支修改了同一文件的同一行,则会产生冲突
解决办法:与分支负责人进行商量,最后通过项目经理修改提交一个可用版本
6、你们使用git在哪个分支上开发
在自己的分支上开发,开发完成进行合并
7、描述一下平时怎样使用git 工作
每天从远程仓库中拉取最新主分支
通过主分支创建自己的分支
在自己的分支上进行开发操作
开发完成进行上传提交到本地仓库
上传到远程仓库前拉取最新主分支进行合并操作
合并完成不产生冲突,就上传到远程仓库
组员删除本地分支,组长合并项目后,删除远程仓库其他分支
8、什么是深拷贝什么是浅拷贝
深拷贝:可以拷贝基本类型,也可拷贝引用类型
浅拷贝:只能拷贝基本类型
八、Mybatis1、${} 和 #{}的区别
Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值
Mybatis在处理${}的时候就是把 ${}替换成变量的值,调用Statement来赋值
简单来说:#{}是PreparedStatement ${}是Statement
2、什么是sql注入攻击
SQL注入攻击是利用是指利用设计上的漏洞,欺骗服务器执行恶意的sql语句
3、为什么PreparedStatement可以防止sql注入攻击
因为sql语句是预编译的,而且语句中使用了占位符,规定了sql语句的结构。 用户可以设置”?”的值,但是无法改变sql语句的结构
4、什么是orm
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据
5、mybatis 是一个什么样的框架
MyBatis 是一个开源、轻量级的数据持久化框架
MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身
MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现
6、mybatis 和 hibermate的区别
hibernate:全自动映射 ORM框架,扩展性强,不需要自己手动去写SQL语句 但是sql都是自动生成的,无法直接维护sql
mybatis:半自动ORM框架,需要自己手动去写SQL语句 可以优化sql语句,灵活性更高
7、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?
原理:动态代理
Dao接口,就是maven中的Mapper接口,每个mapper接口都会有一个mapper.xml文件与之对应,xml文件中mapper标签中的namespace的值就是mapper接口的全类名,xml文件中每一个sql语句的实现,都会有一个MappedStatement与之相对应(也就是select和update标签),标签的id就是mapper接口中的方法名,接口方法内的参数,就是传递给sql语句的参数
Mapper接口是没有实现类的,当调用接口方法时,通过xml文件中的namespace的接口全限类名+id中的接口方法名拼接字符串作为key值,可唯一定位一个MappedStatement
Mapper接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理proxy对象,代理对象proxy会拦 截接口方法,转而执行xml文件中MappedStatement所代表的sql,然后将sql执行结果返回
8、Dao 接口里的方法参数不同时,方法能重载吗?
不能
因为Mapper接口中的每一个方法都有唯一的MappedStatement与之对应,方法名唯一,所以不能重载
9、什么是mybatis的接口绑定,接口绑定的几种方式
接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 当我们需要执行sql语句时我们直接调用接口方法就可以了
注解绑定:就是在接口的方法上面加上@Select、@Update等注解,里面包含Sql语句来绑定
xml配置文件绑定:在xml映射文件里面写SQL语句来绑定,在这种情况下,要指定xml 映射文件里面的namespace必须为接口的全路径名,每个sql语句的id要与Mapper接口中的方法名对应。
10、分析一下 mybatis xml配置和注解配置
当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。
11、mybatis 在mapper中如何传递多个参数
方法1:顺序传参法
public User selectUser(String name, int deptId);
select * from user
where user_name = #{0} and dept_id = #{1}#{}里面的数字代表你传入参数的顺序。
方法2:@Param注解传参法
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
select * from user
where user_name = #{userName} and dept_id = #{deptId}#{}里面的名称对应的是注解
@Param
括号里面修饰的名称。方法3:Map传参法
public User selectUser(Map params);
select * from user
where user_name = #{userName} and dept_id = #{deptId}
#{}
里面的名称对应的是Map
里面的key名称。
12、什么是数据持久化
数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作
13、说一下什么是resultmap 什么是resulttype
resultmap:结果集映射
resulttype:结果集类型
作用:数据库列名和实体类名对不上号的时候使用
14、列名和实体类的变量名不一样的时候怎么办
通过mapper.xml中的resultmap统一定义对应关系
配置驼峰和下划线的映射
在sql语句中起别名,与类的属性名一一对应
通过参数标签@Param直接返回map
15、mybatis有几种分页方式
自己写分页逻辑
rowbounds 一次性把结果都查到内存中,再在内存中分页
分页插件
16、mybatis 分页插件的原理
实际上是一个拦截器,拦截器的原理是面向切面AOP
拦截器的底层原理是动态代理
17、动态代理的原理
proxy
18、缓存作用
提升性能
提升速度
保护数据库
19、什么是动态sql
动态SQL就是根据传入的变量值进行逻辑操作,并动态拼接,方便实现多条件下的数据库操作
20、什么是缓存 缓存的作用是什么 你们项目中使用到缓存的场景
概念:缓存是存在于内存中的临时数据。
缓存是数据交互的缓冲区域,简称cache,当某一个硬件想要读取数据时,会首选从缓存中获取数据,有则直接执行,或者返回,如果没有,去内存中获取。如果内存中也没有,就会去数据库进行查询
作用:缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能
21、什么是mybatis的一级缓存 什么是二级缓存
一级缓存:作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取
二级缓存:缓存在硬盘中
22、什么是嵌套查询
查对象的时候 查出相关联的对象
23、什么是懒加载 什么是及时加载
懒加载:嵌套查询的时候,一开始只查询自己,在使用的时候才会二次查询跟他相关联的对象
及时加载: 嵌套查询的时候,把自己和相关联的对象一股脑全查出来
24、mybatis 和 hibernate的区别
hibnate:利于移植 扩展 全orm
mybatis:不利于移植,但是可以灵活的操作sql[调优]
25、为什么有了一级缓存,还要二级缓存
因为一级缓存的生命周期太短,他是事务级别的缓存,随着事务的结束而关闭,无法起到保护数据库的作用
二级缓存是进程级别的缓存,只要程序不结束,缓存就会存在
26、二级缓存的内存淘汰策略
fifo:先进先出
LRU:时间热度
LFU:次数热度
九、设计模式1、单例模式的特点
保证这个对象在jvm中只有一份
2、单例模式的分类及区别
饿汉式:程序一启动就会生成这个唯一对象(static 代码块生成)线程安全
懒汉式:使用类的静态方法时生成唯一对象(静态方法生成)线程不安全
3、静态代理的缺点
会造成代理类过多,不好管理
静态代理种类:
接口方式:target和代理类实现同一接口
继承方式:代理类是target的子类
4、动态代理实现方案
jdk自带代理工厂:target和代理类实现同一接口
cglib第三方代理工厂:代理类是target的子类
5、什么是代理模式 6、设计模式六大基本原则
单一原则
开闭原则
里氏替换原则
依赖倒置原则
迪米特原则
接口隔离原则
十、数据结构一、Hash1.什么是hash算法
散列算法
作用:快速存取
2. 一个对象默认用什么作为hashcode
用在内存中的地址作为hashcode
3. 以下哪些话是对的,为什么
两个对象如果用equals 比较相等,那么这两个对象必须有相同的hashcode 对的
如果两个对象用equals比较不想等,那么hashcode 也要不想等 错的
如果两个对象用equals比较不想等,那么hashcode可以相等,可以不相等
如果两个对象Hashcode 相等,equals可以不想等 对的
4. HashSet 或者 HashMap 是怎样判断两个对象是否是同一对象的
首先比较hashcode 然后再用equals比较链表上的对象,如果产生hashcode碰撞,equals比较也相等,那么hsahmap就会认为这两个对象是同一对象,不会放进去
5. 一个对象放到HashMap 中的过程
首先,用hashcode来计算数组的下标,如果数组中已经有值了,相当于产生了hash碰撞,那么在再用equals比较对象是否相等,如果不同,则放入当前坐标下的链表中,如果equals比较也相等,那么hsahmap就会认为这两个对象是同一对象,不会放进去
6. HashMap 和 hashSet的数据结构
hashmap:数组 + 链表
hashSet:是hashmap的key部分
7. 什么叫做Hash碰撞
hashcode计算出相同数组下标
8. 怎样优化HashMap
增加数组的长度,减少hash碰撞
9.什么是HashMap的扩展因子,为什么扩展因子是0.75
正好找到hash碰撞和内存占用的折中值
10. HashTable,HashMap,和concurrenthashmap的原理和数据结构和区别
HsshTable:线程安全
Hashmap:线程不安全
11. HashMap 1.7 和 1.8的区别12. 使用HashSet 或者 HashMap 什么情况下可能照成内存泄漏
如果我们重写了hashcode和equals 把这个对象放入hsahmap或hashset之后,再改变了这个类的某个成员的值,导致hashcode值变化,hashmap找不到该对象,就会造成内存泄漏
13. 什么是内存泄漏,什么是内存溢出
内存泄漏:用完的对象已经变成垃圾了,但是回收不到
内存溢出:直到我们以后要分配新的对象内存,但是又没有内存分配了,就叫内存溢出
14、为什么我们重写了equals就必须重写hashcode
1.提高效率。hash类型的存储结构,添加元素重复性校验的标准就是先取hashCode值,后判断equals()。重写后,使用hashcode方法提前校验,可以避免每一次比对都调用equals方法。
2.保证是同一个对象。如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。
15、ConcurentHashMap的原理
分段锁,把底层数组分成16段,在其中一段中操作时,只在这一段枷锁,其他部分可以继续操作
16、ConcurentHashMap 1.7 和 1.8 的 区别
1.7 分段后是链表 时间复杂度是O(n)
1,8 分段后是平衡搜索二叉树 时间复杂度 log2n 原理是cas+sync
17、verctor ArrayList CopyOnWriteArrayList 的区别
verctor:在读写操作中加了锁,线程安全但是性能低
ArrayList:不安全但是性能好
CopyOnWriteArrayList 性能可以 保证安全 写加锁,读不加锁
18、说说可能会发生java.util.ConcurrentModificationException的场景
并发修改异常 多线程操作线程不安全的集合时产生
19、说一下hashset和hashmap的数据结构20、ArrayList的初始化容量
ArrayList是Java中一个动态数组类,它的初始化容量默认为10
可以使用带有参数的构造函数来指定初始容量
ArrayList list = new ArrayList(20);
21、ArrayList的扩容机制
当向ArrayList添加新元素时,如果当前ArrayList的大小已经达到了其容量限制,ArrayList会自动进行扩容,将容量增加50%。
ArrayList会创建一个新的数组,将原有数组中的元素复制到新数组中,并将新元素添加到新数组的末尾。新数组的容量为原有数组容量的1.5倍。
22、HashMap可以存放建值都为null的元素吗
HashMap可以存放key和value都为null的元素。
HashMap中每个键值对都是由一个键对象和一个值对象组成的,这两个对象都可以为null。如果将一个键映射到null值,则在HashMap中就会存储一个键为null,值为null的键值对。
需要注意的是,在HashMap中只能有一个键为null的键值对,因为键必须唯一。
十一、Spring1、spring是什么框架
管理框架[容器]:管理bean 的 生命周期(创建 初始化 形态【单例和多例】 销毁)
核心特点:ioc、AOP
2、spring 是什么 使用它的优点是什么
优点:像胶水一样 把符合java 规范的产品 融合在一起
低耦合,高复用,代码污染低
3、什么是ioc 什么是di
ioc:控制反转,把创建对象的权利交给spring容器来实现
di:依赖注入,在Spring创建对象的同时,为其属性赋值
4、常见的di 方式有哪些
构造方法注入
属性注入
接口注入(用于注入复杂引用类型,如自定义对象等)
5、什么叫做循环依赖
A的Bean有B成员属性,B的Bean有A的成员属性
解决循环依赖:三级缓存
6、怎样给bean 注入一个集合类型的值
注入list 和 set
1 3注入map
7、spring bean 的作用域
单例bean
多里bean
8、spring bean 的生命周期
创建、set方法注入、初始化、销毁
9、BeanFactory 和 ApplicationContext 和 ClassPathXmlApplicationContext 和 AnnotationConfigApplicationContext 和 webapplicationcontext 的关系
BeanFactory 最上层 接口
**ApplicationContext** 子接口区别:
BeanFactory 是 ApplicationContext 的父接口
BeanFactory 产生的bean默认是懒加载的,ac 的bean 是及时加载
ac 的bean 支持aop
ac 的bean 支持国际化
ClassPathXmlApplicationContext: 通过xml配置的spring容器
AnnotationConfigApplicationContext:通过注解配置的spring容器
webapplicationcontext:bean容器 依赖web存在
10、BeanFactory 和 FactoryBean 的区别
BeanFactory:创建规范的bean,有构造方法
FactoryBean:创建一些复杂的bean,有自己的初始化方法
例子:mybatis中的mapperbean
11、@Component、@Controller、@Repository、@Service的区别
@Component:注解方法配置普通bean
@Controller:注解方法配置控制层bean
@Repository:注解方法配置持久层bean
@Service:注解方法配置业务层bean
12、@autowired和@resource的区别
都是依赖注入
@autowired:通过类型注入
@resource:通过名字注入
13、@postconstruct注解 的作用是
配置init-method
调用构造方法创建bean之后,调用init方法
14、spring ioc 实现的原理(实现机制)
工厂方法 + 反射
15、什么是springAOP,什么时候用它?
AOP:面向切面,spring两大特点之一
作用:进行公共增强操作
16、springAOP的底层原理
动态代理,springAOP默认的动态代理用的是jdk的代理工厂
17、spring整合mybatis的四个步骤
把数据源配置成bean
把spring自带的session工厂配置成bean
配置mapper扫描bean,扫描mapper接口
把事务切面配置成bean
18、target,aspect joinpoint pointcut weaving advice proxy 分别指的是什么
target:目标
aspect:切面
joinpoint:特指具体进入的切入点
pointcut:泛指满足条件的就是切入点
weaving:织入
advice:增强
proxy:代理
19、aop 中 advice 的 5种类型
前置
后置
环绕
异常
正常
20、spring 的 aop 的原理是默认用什么方式实现的
springAOP默认的动态代理用的是jdk的代理工厂实现
21、怎么实现spring 动态代理的切换方式
spring4.0在xml文件中配置代理自动切换,5.0不用配置,自动切换
22、你们的项目中 使用到aop 了没有,说一说使用的场景
自定义事务注解,加上这个注解的方法,就会进行事物的增强
权限验证
重试
23、事务的传播行为
18、应用层协议
http
dubbo
jdbc
19、hystrix 中断路器的3个状态是什么
关闭(closed)
关闭状态(断路器关闭):默认情况是此状态,所有请求都正常访问
开启(open)
开启状态(断路器打开):所有请求都会被降级。
半开(half open)
半开状态,open状态不是永久的,打开后会进入休眠时间(默认时5s),随后断路器会进入半开状态,此时会释放1次请求通过,若这个请求时健康的,则会关闭断路器,否则继续保持打开状态,再次进行5秒休眠计时
20、http2和http3的区别
http2基于tcp
http3基于udp
21、什么是feign feign 的工作原理是
是一个伪http客户端,让调用远程服务和调用本地服务一样简单,集成了rabbon+resttemplete(urlconnection)
给请求发给代理对象
代理对象通过Contract把springmvc的注解转成feign的注解找到具体方法
feign中有拦截器(编码,解码),内置rabbin负载均衡,调用远程http服务
22、两个进程远程调用 接口调用失败,参数没收到等问题 我们怎样解决问题
配置feign日志
日志级别:
NONE:性能好,适用于生产,不记录日志
BASIC
HEADERS
FULL
23、feign的拦截器配置
自定义拦截器类实现requestInterceptor接口,重写apply方法
写拦截器配置类
配置拦截器
24、客户端组件的配置
feign中默认使用jdk原生的urlconnection 发送http请求,但我们可以集成别的组件来替换掉urlconnection 比如Apache HttpClient,OKHttp
25、微服务解决的问题
进程和进程间的通信
服务间的治理
容灾
链路追踪
统一网关
分布式事务
分布式锁
26、什么是客户端负载均衡 什么是 服务器端负载均衡
服务器端的负载均衡:客户端发送请求,由Nginx服务器接收,根据使用的负载均衡算法,再将请求发送给相应的应用服务器。
客户端的负载均衡:服务消费方(客户端)先从服务注册中心获取服务列表,再通过ribbon的负载均衡算法,分发请求到不同的服务提供方
27、如果注册中心挂了,服务之间还能相互调用吗
可以的,项目启动时,服务调用者会从注册中心拉取注册的服务提供者的接口等数据,缓存到本地。每次调用时,按照本地存储的地址进行调用。
29、什么是base?
base:专门指导分布式事务
Base 理论 在cap 的基础上 完全指导分布式事务
30、feign如何提升网络传输效率
传输数据时可以使用gzip压缩,但只有使用OKHttp时才可以做到
31、什么叫做服务雪崩
即由于一个服务影响到其他服务,从而这一整条服务链都处无法未响应的状态的情况
比如下单业务,首先在订单服务保存订单,其次仓库服务减少库存,当库存服务减少库存时,仓库服务发生bug或阻塞或宕机,由于服务于服务调用之间使用http完成,则订单服务会一直阻塞状态下等待仓库服务的响应,由于tomcat线程池中线程数量有限,当线程池中线程全被占用,并且都处于阻塞状态时,其他的访问无法正常连接至服务器
如何解决:
服务降级
服务熔断
32、常见的容错策略有哪些
隔离
超时
限流
熔断
降级
33、什么叫做 QPS RT
都是服务器性能指标
QPS:每秒钟的查询次数
TPS:每秒钟完成的事务个数
RT:响应时间
34、什么叫做峰值qps,峰值qps的计算公式是什么,横向扩展需要多少台机器的计算公式是
峰值qps:刚上线高峰期的时候的每秒查询率
峰值qps:一天的总流量*0.8/3600*24*0.2 能够估算出每天大致的峰值qps
一台机器虽大的qps=300
35、常见服务器性能指标有哪些36、springcloud中hystrix的熔断和降级的区别及作用
熔断:一次连接抛出异常或超时了,会调用备用逻辑
降级:在n次请求中的超时比例
37、sentinel中抛出和容错相关的异常该怎么处理
BlockException:该异常表示触发了Sentinel的限流或者熔断规则,此时可以通过编写BlockException处理函数来实现对异常的处理。
fallback:该异常表示业务方法执行出现异常,此时可以通过编写fallback函数来实现对异常的处理。
38、hystrix 中断路器的3个状态是什么39、什么是api 网关 主要起什么作用
后台程序的入口
作用:路由,限流,认证,鉴权
40、你们项目的入口是什么。。。
整个项目入口:nginx
后台程序的入口:网关
41、springcloud gateway 中以下配置的意义是什么
id:路由id
uri:nacos服务器上的名称
predicate:断言
filters:过滤器
42、什么是springcloud gateway 的断言 怎样自定义一个断言43、springcloud gateway 中 的过滤器有几种类型
局部 全局
44、怎样自定义一个 springcloud gateway 的全局过滤器45、zuul 的过滤器有几种类型
pre
routing
post
error
oedered:过滤器中的配置,数字越小越先执行
46、什么是单点登录 ,你们公司的单点登录是怎么做的
1;专门单点登录服务 2: 登陆成功 把jwt放在前端保存 ,前端以后发出任何请求都会在header中 携带jwt 3: 在网关中解析jwt
47、你们公司的权限验证是怎么做的
权限验证 放在网关
48、zuul 过滤器执行的顺序
前置过滤器(Pre Filters):在路由之前执行,用于处理身份验证、参数验证等操作。
路由过滤器(Route Filters):用于将请求发送到服务实例中,执行路由操作。
后置过滤器(Post Filters):在路由之后执行,用于处理响应结果,如添加响应头、记录日志等。
错误过滤器(Error Filters):在发生错误时执行,用于处理错误情况,如记录错误日志、返回错误信息等。
49、xxl-job
xxl-job是一个分布式任务调度平台
高可靠性:支持多种任务执行器和任务路由策略,保证任务的高可用和稳定性。
高可扩展性:支持动态扩容和缩容,根据任务流量自动调整任务调度集群的规模,满足不同任务的需求。
分布式任务调度:支持分布式任务调度,可以将任务分配到多个执行器上执行,提高任务执行效率。
50、怎样让客户没感觉到就升级了
蓝绿部署 滚动部署 灰度部署
51、什么叫做增量部署 什么叫做全量部署
增量部署(Incremental Deployment):金丝雀部署,灰度部署
指在更新软件时,只更新发生变化的部分,而不是全部更新。例如,当更新一个Web应用程序时,只需要更新修改的代码文件和配置文件,而不需要重新安装整个应用程序。增量部署可以减少部署时间和成本,同时减少风险和影响。
全量部署(Full Deployment):蓝绿部署
指在更新软件时,需要更新全部内容,包括代码、配置文件、库文件等。例如,当更新一个桌面应用程序时,需要卸载旧版本,重新安装新版本。全量部署通常需要更多的时间和资源,并且可能会影响到服务的可用性和稳定性。
52、常见限流算法
计数限流:系统能同时处理100个请求,保存一个计数器,处理了一个请求,计数器加一,一个请求处理完毕之后计数器减一。每次请求来的时候看看计数器的值,如果超过阈值要么拒绝
固定窗口限流:
假设单位时间是1秒,限流阀值为3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值3,后续的请求全部拒绝。等到1s结束后,计数器清0,重新开始计数
缺点:假设限流阀值为5个请求,单位时间窗口是1s,如果我们在单位时间内的前0.8-1s和1-1.2s,分别并发5个请求。虽然都没有超过阀值,但是如果算0.8-1.2s,则并发数高达10,已经超过单位时间1s不超过5阀值的定义啦,通过的请求达到了阈值的两倍。
滑动窗口限流:
记录每次请求的时间
统计每次请求的时间 至 往前推1秒这个时间窗口内请求数,并且 1 秒前的数据可以删除。
统计的请求数小于阈值就记录这个请求的时间,并允许通过,反之拒绝。
缺点:对于固定窗口,滑动窗口除了需要引入计数器之外还需要记录时间窗口内每个请求到达的时间点,因此对内存的占用会比较多。
令牌桶算法:将请求看作一个令牌,在桶中存储一定数量的令牌,每个请求需要消耗一个令牌,如果桶中没有足够的令牌,则拒绝请求。可以通过调整令牌的生成速率和桶的大小来控制请求流量
漏桶算法:将请求看作一个固定大小的漏桶,当请求进入漏桶时,会以固定速率流出,如果漏桶中没有足够的空间存储请求,则拒绝请求。可以通过调整漏桶的大小和流出速率来控制请求流量。
53、什么是ci cd ,好处是什么
ci:持续集成
cd:持续交互
好处:大大降低项目风险
54、简述一下你们公司的项目开发流程 多长时间上一次线
1-2个礼拜
55、你们公司加班多吗 一般什么时候加班
上线的那天加班
56、有什么好办法能在用户感觉不到的情况下把咱的WEB系统升级了呢?
蓝绿部署
金丝雀部署
灰度部署
57、项目组多少人 组成结构是58、前端后端怎么合作59、开发人员和测试怎么合作60、什么是单元测试 什么是结合测试 测试案例谁写的 给你写你会写吗二十一、JVM调优1、jvm jre jdk的区别
JVM:Java 虚拟机,是 Java 程序运行的基础。它负责解释 Java 代码并将其转化为计算机能够理解的指令,使得 Java 程序能够在不同的平台上运行。
JRE:Java 运行环境,包含了运行 Java 程序所必需的所有组件,包括 JVM、Java 类库和其他支持文件。如果只需要运行 Java 程序而无需进行开发,则只需要安装 JRE 即可。
JDK:Java 开发工具包,包含了开发、编译和调试 Java 程序所需的所有组件。除了包含 JRE 的所有组件外,还包括了编译器、调试器、工具库等,用于开发和构建 Java 应用程序。
因此,简单来说,JDK 包含了 JRE 和一些开发工具,而 JRE 则包含了 JVM 和 Java 类库,而 JVM 是 Java 运行的基础。
2、jvm 的内存划分
堆(Heap):用于存储对象实例以及数组等数据。堆是 Java 程序中最大的一块内存区域,也是垃圾回收机制的主要工作区域。
方法区(Method Area):用于存储已加载的类的信息、常量池、静态变量、即时编译器编译后的代码等。方法区属于堆的一部分,但是它具有独立的特性,因为它不是用于存储对象实例的。
虚拟机栈(Java Virtual Machine Stacks):用于存储程序在执行过程中的方法调用和局部变量等信息。每个线程都有一个虚拟机栈,它们的生命周期与线程相同。
本地方法栈(Native Method Stack):用于存储 Java 虚拟机使用的本地方法(Native Method)的信息。
程序计数器(Program Counter Register):记录当前线程正在执行的字节码指令地址,也就是下一条指令的位置。
3、堆是不是越大越好,栈是不是越大越好4、程序计数器干什么用的
记录代码运行到哪一行了
5、对象一定分配在堆中吗
栈中也有可能
经过逃逸分析有些对象可以放在栈中(jdk1.6优化)
放入栈中的好处 对象生命周期结束时,不需要经过垃圾回收
6、jvm1.7 和 1.8 的区别
方法区:常量、静态变量、字节码对象
jvm1.7的方法区叫做永久代 在堆中
jvm1.8的方法区叫做元空间 在物理内存中
7、串池的数据结构是什么? 怎样优化串词
串池:字符串常量池:HashMap
优化:增加数组长度,减少hash碰撞
8、怎样查找死锁问题 线程死锁
jps查看当前操作系统中的所有java进程
jstack看指定线程的栈的情况
9、堆的内存划分
新生代
伊甸区
幸存区:
from
to
from:to = 1:1
伊甸区:幸存区 = 8:2
老生代
新生代和老生代的默认比例是1:2
调优:修改老生代和新生代的比例
10、一次垃圾回收的过程
如果是超大对象,新生代直接就放不下了,就会放入老生代,如果老生代也放不下,就直接变成垃圾
如果是普通对象:
首先进入新生代
在经历过一次YungGC后依然存活,就会放入幸存区from,然后每次经历YungGC都会在from和to中来回传递,直到经历过15次YungGC,如果还是存活就会放入老生代
进入老生代后进行OldGC,如果变成垃圾,就被回收
一次完整的YongGC+OldGC就叫做FullGC
FullGC是面向整个堆空间的
11、oom之前一定会产生一次fullgc 这句话对不对
对的
产生oom一定经历过YungGC和OldGC
12、怎样判断一个对象是垃圾
引用计数法
gcroot可达性分析算法
13、引用计数法的缺点是什么 或者 为什么jvm 不是通用引用计数法
引用计数法技术在循环依赖的时候没有办法起作用
所以jvm使用gcroot可达性分析算法来判断对象是否为垃圾
14、哪些东西可以作为gcroot
栈中变量 线程
常量
元空间中的字节码对象和静态变量
15、常见的垃圾回收算法 以及特征
标记清除法
特点:会产生大量的碎片
17、请描述cms一次回收的过程
初始标记、并发标记、重新标记、并发清理、重置线程
18、cms的优点 和 缺点
优点:低时延、适合高并发场景
缺点:标记清除算法,会产生大量碎片、低吞吐量、并发模式失败
cms可能会产生浮动垃圾,也就是在进行并发清理的过程中可能产生新的垃圾,这就是浮动垃圾,所以如果老生代使用cms做垃圾回收器,都会预留8%的空间给浮动垃圾
如果产生的浮动垃圾大于预留的空间,就会产生并发模式失败异常,此时老生代的垃圾回收器就会回退到串行回收期
19、cms垃圾回收器使用的算法是什么?
标记清除算法
20、xss xms xmx xmn 分别代表什么?
-Xms:指定 Java 虚拟机堆的初始大小,即在启动时分配给 Java 堆的内存大小。例如:-Xms512m 表示初始分配 512MB 的内存空间。
-Xmx:指定 Java 虚拟机堆的最大可用内存大小,即 Java 堆能够使用的最大内存大小。例如:-Xmx1g 表示最大可以使用 1GB 的内存空间。
-Xss:指定每个线程的堆栈大小,即一个线程的最大可用内存大小。例如:-Xss256k 表示每个线程栈的大小为 256KB。
-Xmn:指定年轻代堆的内存大小,一般情况下建议将其设置为整个堆内存的 1/3 或者 1/4。例如:-Xmn256m 表示设置年轻代堆为 256MB。
21、以下参数是啥意思
-XX:-PrintGCDetails
-XX:+PrintGCDetails
-XX:MetaspaceSize=512m
-XX:NewRatio=n
-XX:ParallelGCThreads=n
-XX:MaxGCPauseMillis=n
-XX:+PrintCommandLineFlags
22、什么是 Thread dump
Thread dump 中包含了每个线程的堆栈信息,即线程正在执行的方法调用链和当前线程所持有的锁信息等,以及一些统计信息,如线程数、CPU 占用率等。通过分析这些信息,可以确定应用程序中存在的性能瓶颈和异常情况,并进行相应的优化和修复。
23、怎样获得Thread dump
在 Java 应用程序中,可以使用 jstack 命令来生成 Thread dump。jstack 可以输出当前 Java 虚拟机上所有线程的状态信息,并将其打印到控制台或者输出到文件中,方便进行后续的分析和处理。
24、什么是 heap dump
Heap dump(堆转储)指的是将 Java 应用程序中当前的内存快照保存到一个文件中,以便进行分析和调试。它可以记录当前应用程序中所有对象的状态信息,包括每个对象的类型、大小、引用关系等,以及统计信息,如内存使用情况、对象数量等。
25、怎样获得heap dump
在 Java 应用程序中,可以使用 jmap 命令生成 Heap dump。
26、调优的目的
让fullGC的时间变短
让fullGC的频度更大
27、导致Full GC的原因
堆空间不足
元空间不足
28、请描述企业中jvm 调优的步骤
监控(jvisualVM)
cpu占用
频繁GC
堆空间的大小
生成堆快照(二进制文件)和栈快照(文本文件)
使用工具打开堆快照(jvisual VM)
分析结果
fullGC的次数越来越频繁
fullGC的时间由0.5秒到四五秒
常见的优化手段
初始化堆空间和最大堆空间设置一样大
选择合适的垃圾回收器
高并发的情况下选择cms或者G1,这两个是主打低时延的垃圾回收期
如果是高并发的情况,一般会把新生代和老生代的比例调整为2:1,目的是把大量生成的对象在新生代就变成垃圾销毁
29、什么是sharing-jdbc 或者 mycat30、什么是mycat的分片策略,常见的分片策略有哪些 你用过哪些分片策略31、mycat的自增长主键生成策略?32、使用mycat的缺点33、mysql主从复制的原理和过程34、主从复制的好处,读写分离的好处,分表分库的好处?35、读写分离怎么配置的36、常见的sql优化手段37、常见的数据库优化手段38、描述一下数据库业务的需求39、优惠券业务的数据结构40、优惠券业务的亮点