面试题集合(二)

JVM

JVM调优

JVM线上分析问题

JVM有哪些常用参数配置

-Xms:初始化堆内存大小;
-Xmx:堆内存最大值;
-Xmn:年轻代堆内存大小;
-XX:NewRatio:年轻代和老年代的比例,默认是1:2,也就是说年代代占整个堆内存的1/3;
-XX:SurvivorRatio:Eden区和survivor区的比例,默认是8:1:1,也就是说每个survivor占年轻代内存的1/10;
-XX:MetaSpaceSize:元空间触发Full gc的阈值,默认为21M;
-XX:MaxMetaSpaceSize:元空间的最大内存,默认为物理机内存大小;
@TODO 再补充

synchronized和Lock()有什么区别

Lock可中断阻塞等待,synchronized是非公平锁,Lock可以实现公平锁,Lock()是一个对象,锁的获取和释放都要我们手动操作,synchronized则是JVM帮我们实现的,它是Java关键字,Lock可以唤醒指定线程来执行。

synchronized用在不同地方的区别是什么

用在代码块:用来同步代码块,需要指定加锁对象,在代码块的前后分别加上Monitenter和Monitexit来实现;
用在非静态方法:锁对象,同一对象是互斥的,但是不同对象之间各自拥有各自的锁,互不影响,是通过ACC_SYNCHRONIZED来标记方式是否是同步方法;
用在静态方法:是锁类对象,也就是说,这个类的所有对象都使用同一个锁对象;
用在类上:同样也是锁类对象,这个类的所有对象都是互斥的。

类加载机制(双亲委派机制),什么时候会用到用户自己的classloader?

App classloader加载用户自定义类

AQS的架构

设计模式

平时用到的设计模式有哪些?用到的场景是什么样的?

动态代理

代理模式是一种常用的设计模式,主要用于不对原有接口做修改的同时,增强该接口的功能,在这个层面上它和装饰器模式很相似,实际上我感觉这两种设计模式本来就很相似,只是想表达的侧重点不一样,代理模式的关注点是对象访问的控制,就是说原方法的访问对用户来说是无感知的,而装饰器模式的关注点是原方法功能的增强,扯远了。
代理模式分为静态代理和动态代理,静态代理就是代理类也要我们自己去实现,所以会产生大量的代理类,这个相信大家已经很熟悉了,主要介绍下动态代理。动态代理指的是能在程序运行过程中,根据我们的代码动态地生成代理类,这样我们就不需要去挨个修改我们自己编写的静态代理类了。
动态代理主要分为基于接口的动态代理和基于类的动态代理。基于接口的是JDK自带的实现方式,这个也是今天主要介绍的方式,基于类的有cglib、javassist等基于字节码增强的方式。
参考

创建代理类$Proxy字节码,继承了Proxy类,而我们知道Java是单继承的,所以想要和我们需要代理的类产生联系,就只能采用实现接口的方式。

数据库

B+树和B树的区别

1、非叶子节点的子树指针和关键字个数相同;
2、非叶子节点的子树指针,指向关键字指属于(K[i], k[i+1])的子树,B-树是开区间;
1和2的意思是:如下图,根节点的关键字是(5,28,65),三个关键字分别指向三个子节点,三个子节点分别与5,28,65开头,且每个子节点的范围都在两个值之间,例如,第一个子节点就在5-28之间,第二个子节点在38-65之间。
在这里插入图片描述
3、叶子节点之间增加了一个链指针;
4、所有关键字都会在叶子节点中出现。
B+树特点:
1、不可能在非叶子节点中命中;
2、非叶子节点相当于是叶子节点的索引(稀松索引),叶子节点相当于存储数据的存储层(稠密索引);
3、所有关键字都会在叶子节点中出现,且关键字是有序的,这极大地提高了范围查找的能力。

事务的隔离级别

read uncommitted,读未提交
read committed,读已提交
repeatable read,可重复读(默认级别)
serializable,串行化,
脏读(A读到B更新的数据,但是B之后又回滚了,导致A读到的是脏数据);
不可重复读(行锁)(A先读了数据之后,B去更新,然后A再读,发现和之前读到的不一样了,主要发生在改操作上);
幻读(表锁)(和不可重复读的区别就是幻读针对的是增和删操作)。
解决不可重复读需要锁数据行,解决幻读则需要锁整张表。

RocketMQ

RocketMQ的架构

HashMap

ConcurrentHashMap为什么是线程安全的

ConcurrentHashMap相比HashMap加入了Segment的概念,这也是它实现分段锁的基础,ConcurrentHashMap的数据结构是这样的:
在这里插入图片描述
ConcurrentHashMap是由一个Segment数组组成的,一个Segment又由一个HashEntry数组组成,Segment的数量是固定的,在初始化的时候会被指定长度,同时,每一个Segment都是独立的,它会在自己发生扩容,最关键的是每个Segment都拥有自己的锁,想要在一个Segment里面添加数据,必须要先获取该Segment的锁,这就是分段锁技术的实现了。
Segment是ConcurrentHashMap一个静态内部类,它继承了ReentrantLock,是一种可重入的锁,至于什么是ReentrantLcok,什么是可重入锁,那就只能越说越多了。。。
在这里插入图片描述

算法

动态规划三要素

最优子结构:f(x)
状态转移方程:f(3) = f(2) + f(1)
边界:f(1) = 1, f(2) = 2

Spring

什么是Spring Boot,有什么优点?

Spring Boot是一个框架,它简化了Spring众多框架中所需的大量且繁琐的配置,所以Spring Boot可以说是一个服务于框架的框架,简化框架配置,使我们能快速开发。
Spring Boot优点:
1、可独立运行的Spring项目,可以以jar的形式独立运行;
2、约定大于配置的理念,自动配置Spring,减少了Spring配置过程,使我们能快速开发;
3、简化Maven配置,避免了大量Maven依赖导入和版本冲突;
4、内嵌Servlet容器,不再需要单独的Web服务器;

Spring Boot启动过程

声明式事务的属性

声明式事务通过@Transactional注解实现,主要有以下参数:
1、readOnly,设置当前事务为只读事务,默认式false;
2、RollBackFor,设置一个需要回滚的异常数组,当方法中抛出了此类异常,事务则进行回滚;
3、rollbackForClassName,设置一个需要回滚的异常类名数组,当方法中抛出了此类异常,事务则进行回滚;
4、noRollBackFor,设置一个不需要回滚的异常数组,当方法中抛出了此类异常,事务则进行回滚;
5、noRollbackForClassName,设置一个不需要回滚的异常类名数组,当方法中抛出了此类异常,事务则进行回滚;
6、propagation,事务传播行为,一共有七种,分别是:
a、required:如果当前没有事务,就开启一个事务,如果当前有事务,就加入到这个事务里面,一般是使用这个;
b、support:表示不需要事务,但是当前存在事务的话,就加入到该事务中;
c、mandatory:表示必须要在事务中执行,如果当前不存在事务,则会抛出异常,不会主动开启事务;
d、
7、isolation,事务隔离级别,一般默认使用数据库隔离级别

循环依赖的解决方案

BeanFactory和FactoryBean的区别,作用

Feign的底层实现,负载均衡

Hystrix,服务熔断和服务降级的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值