-
JVM新生代为什么要有两个Survivor区?参考答案1:用复制算法回收的效率会更高,也不会产生内存碎片。而复制算法的代价就是要将内存折半。(我:为什么标记-整理算法不行?)
-
-Xms:堆的最小值。-Xmx:堆的最大值。-Xss:栈容量
-
G1的优点?答:更短的停顿时间,以及可预测的停顿时间。
G1在后台维护了⼀个优先列表,每次根据允许的收集时间,优先选择回收价值最⼤的Region。这种使⽤ Region 划分内存空间以及有优先级的区域回收⽅式,保证了 G1 收集器在有限时间内尽可能⾼的收集效率。 -
当查找hashmap的元素时,是如何使用equals和hashcode这两个方法的?
答:定位到数组中的位置后,先比较hashcode,若相同再比较key是否==,若key==再看equals是否为true。一处相关源码如下:
first.hash == hash && // first node为链表头
((k = first.key) == key || (key != null && key.equals(k)))
-
Concurrenthashmap的写方法是怎么利用CAS和synchronized来加锁的?
CAS:当判断数组中当前位置为空,使用CAS来把这个新的Node写入;
synchronized :否则,用synchronized对链表头加锁
Resource定位 (将指定位置的资源文件解析转化为Resource)。
将Resource解析为BeanDefinition。(BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。)
将BeanDefinition注册到IOC容器,最终保存在map中,即this.beanDefinitionMap.put(beanName, beanDefinition);
相关方法: loadBeanDefinitions(beanFactory)
,registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
-
Mybatis的Mapper为什么只定义了接口,却可以被@Autowired注入?
Mapper接口没有被实例化,是通过 FactoryBean 调用其getObject方法生成对象的4 -
Servlet规范定义的Filter与Spring的Interceptor有什么区别?
Interceptor的拦截范围其实就是Controller方法,它实际上就相当于基于AOP的方法拦截。因为Interceptor只拦截Controller方法,所以要注意,返回ModelAndView后,后续对View的渲染就脱离了Interceptor的拦截范围。5 -
java中注解的作用
-
Netty的原理
-
SpringCloud用过哪些组件
Feign: 提供声明式服务绑定功能来实现对该服务接口的调用6,7
Ribbon:客户端负载均衡
Hystrix:客户端的限流、熔断、降级8 -
比较zookeeper,Eureka作为注册中心的优缺点
答:zk保证CP,而不保证可用性,如我在腾讯面试篇最后的总结中提到:Leader 宕机会导致不可用,leader选举期间不可用,选举时间还长;发生网络分区时,节点数少的那个分区的zk不可用。
而Eureka保证AP。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或如果发现连接失败,则会自动切换至其它节点。只不过查到的信息可能不是最新的(不保证强一致性)
向注册中心查询服务列表时,我们可以容忍返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。11 -
Seata-TCC中的Confirm 和Cancel操作都需满足幂等性12
-
采用何种分库分表的规则?id取余,或者按时间范围
-
怎么保证数据库连接池中的连接是可用的?知道mysq的wait_timeout参数吗?
wait_timeout:The number of seconds the server waits for activity on a noninteractive connection before closing it.13
方法1:调大wait_timeout。不佳,wait_timeout过大会造成Mysql的空闲连接堆积,甚至达到MySQL的连接数上限。14,15
方法2:添加空闲检测,目的是保活,即在连接空闲时间超过wait_timeout之前,向MySQL发送一个类似心跳的查询语句,让MySQL不会主动断开它。16 -
mysql有哪些常用的log, 以及它们的作用。答:binlog、redo log和undo log。问:redo log与binlog的区别?
下表参考17,18:
redo log | binlog |
---|---|
记录事务对数据页做了哪些修改 | binlog是逻辑日志,其记录是写的SQL语句,即使操作本身并没有导致数据库发生变化 |
redo log 适用于崩溃恢复(crash-safe) | binlog 适用于主从复制 |
redo log 是 InnoDB 引擎层实现的,并不是所有引擎都有。 | 所有引擎都可以使用 binlog 日志 |
redo log 采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。 | binlog通过追加的方式记录,当文件大小大于给定值后,后续的日志会记录到新的文件上 |
- 问:怎样查看sql执行计划?答:explain。问:结果中type列对应哪些类型的索引扫描?
参考答案19的一部分:依次从好到差:
const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件
range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中
index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
all: 全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。