文章目录
new一个对象涉及到哪些内存区域?
比如写了一行代码:A a = new A()
,涉及到的内存区域如下:
- 方法栈:引用
a
存放于对应的方法栈里 - 堆:
new A()
在堆上创建了一个类A的实例 - 方法区:类A的类信息、常量、静态变量等存储于方法区
除了new一个对象会涉及到对象的创建之外,还有什么方式会创建对象?
new、反射、反序列化、Object的clone方法
慢sql是什么?如何排查项目里的慢sql
- 慢sql顾名思义是指查询时间较长的sql语句。
这个时间多长才算慢呢,每个业务或者每个公司的定义可能都不一样,mysql
的慢查询日志有个参数叫做long_query_time
,这个参数定义了多长时间视为慢查询,默认是10秒,但是怎么可能等待一个sql等10秒!!!!一般都是毫秒级别的吧。 -
- 开启慢查询日志:
# 是否开启慢查询日志,1表示开启,0表示关闭 slow_query_log=1
,要设置参数long_query_time
,一般可设置为1 - 使用监控工具来监控慢查询:比如skywalking
- 使用
explain
分析执行计划,查看sql是否命中索引,explain各个字段含义:
- 开启慢查询日志:
列名 | 含义 |
---|---|
id | select查询的序列标识符 |
select_type | select关键字对应的查询类型 |
table | 查询的表名 |
partitions | 匹配的分区,对于未分区的表,值为null |
type | 表的访问方法 |
possible_keys | 可能用到的索引 |
key | 实际用到的索引 |
key_len | 所选索引的长度 |
ref | 当使用索引等值查询时,与索引作比较的列或常量 |
rows | 预计要读取的行数 |
filters | 按表条件过滤之后,留存的记录数的百分比 |
Extra | 附加信息 |
详细可以参考这篇文章 MySQL执行计划
重点关注type和key
这两列,type
常见的值有ref、range、all等,分别表示用到了普通索引、索引范围查询和全表扫描;key的话就是列出实际用到的索引字段。
大型项目如何应对可能出现的异常,比如空指针等
我回答的是写一个拦截器,像spring mvc里可以写一个handler来统一处理控制器返回的所有异常(当然也可以处理指定的异常类),面试官说这种只能处理http内的异常,如果不是http协议呢,比如mq这种?
这个我也不太清楚,后面想了想写个注解拦截也可以吧
mybatis-plus是如何提供单表的增删改查的
我们知道,使用mybatis的时候,即使是很简单的单表操作也需要写对应的xml文件和对应的sql语句,这样很麻烦,但是mybatis-plus为我们提供了单表的基础CRUD操作,不再需要手动写xml,可以像调用对象方法那样完成对数据库的操作。
这一切都得益于mybatis-plus中的BaseMapper接口
这里提供了多种单表的CRUD操作,可以看到,BaseMapper是基于mybatis的Mapper动态代理实现的,这也应证了官方说的,myabtis-plus只是在myabtis的基础上做了增强。运行的时候myabtis-plus会动态生成BaseMapper的实现类,通过java的反射机制来调用相应的操作方法,这些方法在实现时会自动生成对应的sql语句,然后通过mybatis的sql执行引擎去执行。