**十一、Mybatis用到的设计模式:
工厂模式:SqlSessionFacoty
构建者模式:SqlSessionFactory Builder构建SqlSession工厂
代理模式:使用了JDK动态代理
单例模式:向configuration这个配置里面都是单例的(配置信息)
**十二、微服务(SpringCloud)
springcloud的应用微服务的一个实现框架之一, Spring Cloud 是一系列框架的集合。利用Spring Boot 开发简化了分布式系统的开发,如服务发现与注册、配置中心、消息总线、负载均衡、断路器、数据监控;Spring Cloud 讲各公司成熟经得起考验的框架组合起来,最终开发出一套简单易懂、易部署和易维护的分布式系统开发工具。
SpringBoot 专注于快速方便的开发单个个体微服务;而SpringCloud关注全局微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供配置管理、服务发现、断路器、路由、事件总线、分布式系统、等等集成服务。总的来说:SpringBoot专注于快捷、方便的开发单个微服务个体、SpringCloud关注全局的服务治理组件的集合。
springcloud五大组件:1、Eureka实现服务治理;2、Ribbon主要提供客户侧的软件负载均衡算法;3、Hystrix断路器,保护系统,控制故障范围;4、Zuul,api网关,路由,负载均衡等多种作用;5、Config配置管理。其中除了config都是Netflix的。
目前五大组件,部分逐渐被替换
Eureka:注册中心 —> Nacos(阿里)
Zuul:服务网关 —>GetWay
Ribbon:负载均衡
Feign:服务调用 –>OpenFeign
Hystix:熔断器 –> Sentinel (阿里)
Config: 配置中心—> Nacos(阿里)
**十三、Nacose与Eureka区别



健康检查:通过心跳来维持,客户端端每隔5秒发送一个心跳包,告诉注册中心自己还活着,超过30秒没有收到心跳,直接剔除该实例
拉取服务:客户端会向注册中心定时拉去服务(每隔30s)
**十四、Zuul与GateWay网关
网关的作用,其实就是对所有微服务的保护
统一入口,作为微服务框架下的对外门户
解耦:后端服务可以独立扩展、部署、修改
安全性:进行身份认证
路由转发
负载均衡
限流
GateWay:
优点
是Spring家族中的一员,可以无缝集成到SpringCloud中与其他Spring组件协同工作
采用了响应式编程模型,可以更好的处理大规模并发请求
缺点:
- 是一个年轻的项目,在某些方面缺乏成熟性和稳定性
Zuul:
优点:
是Netflix下的组件,由于应用比较早,具有较高的稳定性
提供简单易用的配置和扩张机制,开发人员可以快速上手
缺点:
不支持响应式编程,处理高并发的情况下,性能较差
2.0后已经不开源了
目前由于zuul的闭源,SpringCloud生态下逐步去netflix生态化,使的gateWay逐步被企业采用
**十五、JVM
Jvm是java虚拟机,java的运行环境,jvm实现了java一次编译,处处运行。JVM只需要保证能够正确执行.class文件,就可以运行在诸如Linux、Windows、MacOS等平台上了

堆、方法区:线程共享
本地方法栈、虚拟机栈、程序计数器线程私有
堆:用于存放java对象实例、数组等数据。可以通过Xmx、Xms设置堆内存的大小
方法区:1.8中只是个概念上的东西,元空间是方法区的实现,主要存放类的元数据信息,加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据
类型信息:class、interface、enum、annotation
程序计数器:记录每个线程当前执行jvm指令的地址指针
本地方法栈:为虚拟机使用本地native方法服务的,是指调用非java的方法,比如c、c++方法
虚拟机栈:描述java方法线程执行线程私有区域,每个java方法执行都会创建一个栈桢。局部变量、操作数栈、动态链接、方法出口等,Xss设置大小
元空间:永久代导致内存溢出,频繁垃圾回收,元空间不在受限jvm可用内存限制,而是由操作系统的可用内存限制,使得java程序可以处理更大的类,更大的对象,而不会出现永久代的内存溢出问题。
元空间:
解决永久代内存受限的问题
元空间使用了堆外内存,避免了jvm堆内存的复制和移动操作,提高程序的性能
元空间的大小不受jvm内存的限制,可以更好的利用操作系统的内存资源
元空间由java本地接口(JNI)负责管理,使得java开发人员更好的控制类元数据的创建和销毁
年轻代:采用标记复制算法 分Eden、Survivor0、Survivor1,内存占比:8:1:1
老年代:采用标记清除算法
堆内存: 默认为物理内存的1/64(小于1GB),其中年轻代与年老代所占内存比值为1:4
**十六、GC算法
标记清除算法:给存活的对象打上标记,没有标记的对象全部被回收
标记复制算法:把内存为两等份,每次只使用其中一等份,等正在使用的这一等份内存满了,它就会把标记存活的对象拷贝到另一份闲置的内存中,被留在开始的一份内存中对象被垃圾回收,开始闲置的内存变成正在使用的状态,被垃圾回收的内存就会闲置出来。
标记整理算法---将标记的对象整理到另一端,没有标记的对象可以被覆盖或回收
年轻代:采用标记复制算法。主要是因为年轻代存活几率不大
老年代:采用标记清除算法
GC采用的可达性分析法来判断对象是不是存活(GCRoot)
**十七、JVM中类加载机制
Bootstrap ClassLoader :引导类加载器
Extension ClassLoader:扩展类加载器
Application ClassLoader:系统类加载器
**十八、JVM双亲委派机制
加载某个类的class文件时,不会自己先加载,而是把这个请求委托给父类加载器执行,如果父类加载器存在父类加载器,则进一步向上委托,依次递归,最终将到达顶层的启动类加载器。如果父类加载器不能完成加载,就会自己加载。
**十九、JVM调优
调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。
JVM调优时,我们要遵循一些原则:
1.大多数的Java应用不需要进行JVM优化;
2.大多数导致GC问题的原因是代码层面的问题导致的(代码层面);
3.上线之前,应先考虑将机器的JVM参数设置到最优;
4.减少创建对象的数量(代码层面);
5.减少使用全局变量和大对象(代码层面);
6.优先架构调优和代码调优,JVM优化是不得已的手段(代码、架构层面);
7.分析GC情况优化代码比优化JVM参数更好(代码层面);
通过以上原则,我们发现,其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”。
下面展示了一些JVM调优的量化目标参考实例:
Heap 内存使用率 <= 70%;
Old generation内存使用率<= 70%;
avgpause <= 1秒;
Full gc 次数0 或 avg pause interval >= 24小时 ;
-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15
参数解析及调优

-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15
参数解析:
-Xmx4g:堆内存最大值为4GB。
-Xms4g:初始化堆内存大小为4GB。
-Xmn1200m:设置年轻代大小为1200MB。增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss512k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1MB,以前每个线程堆栈大小为256K。应根据应用线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=8:设置年轻代中Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:PermSize=100m:初始化永久代大小为100MB。
-XX:MaxPermSize=256m:设置持久代大小为256MB。
-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
**二十、Spring事务隔离级别
1、Read Uncommitted(读未提交):一个事务可以操作另外一个未提交的事务,不能避免脏读,不可重复读,幻读,隔离级别最低
2、Read Committed(读已提交):一个事务不可以操作另外一个未提交的事务, 能防止脏读,不能避免不可重复读,幻读。Oracle默认隔离级别
3、Repeatable Read(可重复读):保证一个事务多次读到的数据是没有变化的。MySQL的默认隔离级别。
4、Serializable(串行化):一个事务执行完后,另一个事务才能执行。最严格的级别
脏读:读取到了别的事务回滚前的数据,例如事务1修改某值,事务2读取该值,后面事务1放弃此次修改,导致事务2读取该值的数据是无效的。
不可重复读:一个事务在两次读取同一个数据的值不一致。例如A事务读取X,在中间过程中B事务修改了X的值,事务A再次读取X时值发生了改变。
幻读:查询得到的数据条数发生了改变,例如A事务搜索数据时有10条数据,在这时B事务插入了一条数据,A事务再搜索时发现数据有11条了。