目录
DDD架构的使用体验:
层级对象特别多,比较方便后期切换数据库或者表结构做改动不会牵扯到外层对象改造,对前端渲染所需对象字段无影响。
JVM
线程私有的:
虚拟机栈、本地方法栈、程序计数器
虚拟机栈中包含栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等。
线程共享的:
堆内存、方法区。
方法区存放类信息、静态变量、常量、运行时常量池等信息。
JVM中的垃圾回收算法:
标记清除算法、复制算法、标记整理算法、引用计数法、可达性分析算法。
标记清除算法:标记不需要回收的对象、清除掉未标记的对象,会有内存碎片
复制算法:用在新生代,将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。
标记整理算法:用在老年代,与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。
引用计数法:为每个对象添加引用计数器,引用为0时判定可以回收,会有两个对象相互引用无法回收的问题。
可达性分析算法:从GCRoot开始往下搜索,搜索过的路径称为引用链,若一个对象GCRoot没有任何的引用链,则判定可以回收。
GCRoot中有虚拟机栈中引用的对象,方法区中静态变量引用的对象,本地方法栈中引用的对象
JVM内存参数:
-Xmx[]:堆空间最大内存
-Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的
-Xmn[]:新生代的最大内存
-xx:[survivorRatio=3]:eden区与from+to区的比例为3:1,默认为4:1
-xx[use 垃圾回收器名称]:指定垃圾回收器
-xss:设置单个线程栈大小
一般设堆空间为最大可用物理地址的百分之80
数据库
MySql:
1.MyIsAm和InnoDB的区别
InnoDB有三大特性,分别是事务、外键、行级锁,这些都是MyIsAm不支持的,
另外InnoDB是聚簇索引,MyIAm是非聚簇索引,
InnoDB不支持全文索引,MyIAm支持
InnoDB支持自增和MVCC模式的读写,MyIAm不支持
MyIsAM的访问速度一般InnoDB快,差异在于innodb的mvcc、行锁会比较消耗性能,还可能有回表的过程(先去辅助索引中查询数据,找到数据对应的key之后,再通过key回表到聚簇索引树查找数据)
2.mysql事务特性
原子性:一个事务内的操作统一成功或失败
一致性:事务前后的数据总量不变
隔离性:事务与事务之间相互不影响
持久性:事务一旦提交发生的改变不可逆
3.事务的隔离级别
在高并发情况下,并发事务会产生脏读、不可重复读、幻读问题,这时需要用隔离级别来控制
读未提交: 允许一个事务读取另一个事务已提交的数据,可能出现不可重复读,幻读。
读提交: 只允许事务读取另一个事务没有提交的数据可能出现不可重复读,幻读。
可重复读: 确保同一字段多次读取结果一致,可能出现欢幻读。
可串行化: 所有事务逐次执行,没有并发问日
Inno DB 默认隔离级别为可重复读级别,分为快照度和当前读,并且通过间隙锁解决了幻读问题。
4.MySQL如何做慢SQL优化
可以查看执行计划分析数据的扫描类型、索引是否生效,常见的慢查询优化有:
(1)尽量减少select的数据列,尽量使用覆盖索引
(2)orderby查找时使用索引进行排序,否则的话需要进行回表
(3)groupby查询时,同样要用索引,避免使用到临时表
(4)分页查询时,如果limit 后面的数字太大,可以使用子查询查出主键,再limit主键后n条数据就能走覆盖索引
(5) 使用复杂查询时,使用关联查询来代替子查询,并且最好使用内连接
(6)使用count函数时直接使用count的话count(*)的效率最高
count(*)或count(唯一索引)或count(数字):表中总记录数,count(字段)不会统计null
(7) 在写update语句时,where条件要使用索引,否则会锁会从行锁升级为表锁
(8)表中数据是否太大,是不是要分库分表
5.索引失效情况:
(1)where条件中有or,除非所有查询条件都有索引,否则失效
(2)like查询用%开头,索引失效
(3)索引列参与计算,索引失效
(4)违背最左匹配原则,索引失效
(5)索引字段发生类型转换,索引失效
(6)mysql觉得全表扫描更快时(数据少),索引失效