你平时是怎么使用多线程的
- 我认为多线程使用我们可以就是你手动的,最初始学多线程就是可以去new Thread,然后去创建别的线程去异步执行一些任务,但是多线程的话最多使用可能在线程池这块会用到吧
- 多线程技术就是创建线程池,然后由线程池对我们这种线程一个这种更合理更可控的一个把控吧,多线程就是一个线程池技术的使用吧
- Runnable接口就是一个执行单元,它就是java几之后,反正就是将这个执行机制和一个这种执行单元分隔看一下runnable,callable,它就是作为一个执行单元的任务体,然后传到那个thread里面去执行嘛
简化mysql索引的最左前缀如何优化orderby语句
- 首先要对sql进行分析检查必要的查询字段,过滤字段和排序字段,是否按顺序建立索引
- 如果查询字段不再索引中可能会产生回表操作会导致filesort,降低性能
- 一定要有过滤字段不然不能使用索引
- 排序字段和索引顺序不一致会导致filesort,降低性能
- 多个字段排序时如果方向不一致也会导致filesort,降低性能
- 使用explain观察查询类型和索引利用情况
- 尽可能减少不必要的filesort
JVM内存模型中,为什么要区分新生代和年老代?在新生代中,为什么要区分eden区和survival区
- 主流垃圾回收器cms g1都使用了分代收集算法
- 正常系统运行时会产生大量临时对象,这些对象短期内大部分会失效,对于这些对象我们把他们临时放到新生区
- 新生代满了之后需要清理垃圾对象,我们会把有效对象复制到老年代,以便后续继续使用
- 为了更有效的区分哪些对象应该被复制到老年代,所以在新生代划分出了eden,s0和s1区
细化后的新生代内部会被再次划分以便保证高速读写同时内存连续
新对象被会被保存到eden区(开始是空的,所以内存连续),eden区满了会把有效对象复制到s0(s0也是空的所以也是连续空间)
- 清空eden区(再次写入时又是连续空间)
- s0和s1在命名上互换 原来的s1等待写入(空的)
- eden区再次满了,重复上述步骤
eden区通过复制/清除算法保证了读写连续性(因为新生代的对象产生和销毁非常频繁,所以采用了清空的方式)
典型的JDBC按顺序编写
- 注册JDBC Driver
- 获得与数据库的物理连接
- 创建不同类型的Statement
- 执行SQL命令
- 如果有结果集,处理结果集
- 释放资源
事务重点:不能在类上使用@Transactional注解,默认开启了全局读写事务
springboot是如何管理版本依赖的
springboot底层使用maven管理依赖,通过控制pom.xml父子关系来完成细节配置,在父pom中定义具体框架和版本号以及具体信息
提供了很多场景的spring-boot-starter的pom.xml文件,来标准化的引入依赖避免冲突
数据库索引的原理
- 以mysql为例,默认引擎innodb使用了b+树实现索引,在索引查找时实现了log(n)的时间复杂度
- 聚簇索引记录了主键id(完整数据),非聚簇索引的索引树中记录数据(索引字段+主键)
- 在聚簇索引的叶子节点中记录了完整的值,非聚簇索引的叶子节点记录的是主键以及索引字段,如果需要完整值的话需要回表操作,即使用主键去聚簇索引中再次查找完整数据
- 索引的叶子节点以链表的形式存储,方便顺序查找和排序
创建索引的缺点
会占用空间、更新时会级联更新索引、高并发写影响性能
什么情况索引失效
- 计算、函数导致索引失效
- like以%开头索引失效
- 不等于索引失效
- IS NOT NULL 可能会索引失效
- 类型转换索引失效
优化数据库的方法有哪些
- 硬件 主要在存储层优化
- 网络
- 操作系统调优
- 表结构设计优化
- sql优化
- 减少函数使用
- 索引优化
- 大字段及全文检索优化
- 连接池优化
- 事务优化
- 数据库集群化
- 加入缓存
- 冷热存储
- 分库分表
Integer和int区别
- Integer是int的包装类,int则是java的一种基本数据类型
- Integer实际是对象的引用,当new一个Integer,实际上生成一个指针指向对象,而int直接存储数值
- Integer的默认值是null,而int的默认值是0
jsp八大隐含对象
pageContext、request、session、application、response、out、config、page
Spring的依赖注入
依赖注入是指将依赖的对象实例交给spring帮我们注入管理,从而释放到对象的管理权,比如可以统一替换接口的实现,更高效的开发程序
set方法注入、构造方法注入、autowire自动注入