面试题目

1.说一下jdk的对空间的内存划分

  分为程序计数器 java常量池  java堆 java栈  方法区, 本地方法栈


 在JVM运行时内存区域中,PC寄存器(程序计数器)、虚拟机栈和本地方法栈是线程独享的
 

 2.AVL  红黑树 B树

AVL 二叉平衡树  如果场景中对插入删除不频繁  只是对查有要求  AVL优先

红黑树 近乎平衡 他的旋转保持平衡次数比较少 插入删除次数多的情况就可以使用红黑树

B树层次少 分支多  可以有效减少磁盘频繁的查找  


3.堆和栈(虚拟机栈)是完全不同的两块内存区域,一个是线程独享的,一个是线程共享的,二者之间最大的区别就是存储的内容不同:
堆中主要存放对象实例。
栈(局部变量表)中主要存放各种基本数据类型、对象的引用

5. ConcurrentHashMap
而JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组+链表+红黑树数据结构和CAS原子操作实现ConcurrentHashMap
在ConcurrentHashMap中,定义了一个Segment<K, V>[]数组来将Hash表实现分段存储,从而实现分段加锁;而么一个Segment元素则与HashMap结构类似,其包含了一个HashEntry数组,用来存储Key/Value对。Segment继承了ReetrantLock,表示Segment是一个可重入锁,因此ConcurrentHashMap通过可重入锁对每个分段进行加锁。

6.redis cluster3.0自带的集群
redis内存回收LRU 算法

7.StackOverflowError和OutOfMemeryError的区别
StackOverflowError:递归过深,递归没有出口。
OutOfMemoryError:JVM空间溢出,创建对象速度高于GC回收速度


8.Mybatis使用了动态代理,自动生成了接口的实现类。这个类是MapperProxy

9.dubbo本质是一个jar包,是一个分布式框架,一个远程服务调用的框架。

好处:透明化的远程方法调用,就像调用本地方法一样,只需要简单配置,没有任何API侵入
服务注册与发现

   推荐zookeeper做服务注册中心 zookeeper保证数据的最终一致性。zookeeper是一个中间件。


10.rabbitmq
Exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息
fanout:所有bind到此exchange的queue都可以接收消息(纯广播的,所有消费者都能收到消息)
direct:通过routingKey和exchange决定的那个唯一的queue可以接收消息
topic:所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息
headers:通过headers 来决定把消息发给哪些queue(这个很少用,一般情况下,我们用不到)

direct效率比较高  但是topic支持统配符,比较灵活。

实现延迟队列,可以设置队列的TTL,来控制消息的生存时间,如果超时了,就会变成死信。

11.
redis 缓存穿透:是指查询一个一定不存在的值,
redis缓存雪崩是指在一定时间段内:缓存集中失效过期
缓存击穿:一个key非常热门,在某段时间内失效,会导致数据库压力

怎么保证缓存和数据库数据的一致性

1. 对删除缓存进行重试,数据的一致性要求越高,我越是重试得快。
2. 定期全量更新,简单地说,就是我定期把缓存全部清掉,然后再全量加载。
3. 给所有的缓存一个失效期


用redis实现分布式锁

12 。集合不被修改
 Collections.unmodifiableList(List)
Collections.unmodifiableSet(Set)

13.spring bean的五钟作用域
1.singleton
2.prototype
3.request
4.session
5.globalsession

no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系
byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配
byType:根据bean的类型进行装配,当一个bean的属性类型与其他bean的属性的数据类型一致,则自动装配
constructor:根据构造器进行装配,与 byType 类似,如果bean的构造器有与其他bean类型相同的属性,则进行自动装配
autodetect:如果有默认构造器,则以constructor方式进行装配,否则以byType方式进行装配
事务特性(4种): 
原子性 (atomicity):强调事务的不可分割. 
一致性 (consistency):事务的执行的前后数据的完整性保持一致. 
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰 
持久性(durability) :事务一旦结束,数据就持久到数据库
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生 
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生 
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生. 
串行化的 (serializable) :避免以上所有读问题. 
Mysql 默认:可重复读 
Oracle 默认:读已提交


14.spring cloud 的五大核心组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config

15.事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。


16.JVM

答案就是GC roots ,也就是根对象,如果从一个对象没有到达根对象的路径,或者说从根对象开始无法引用到该对象,该对象就是不可达的

17.CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝

悲观锁

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制 (也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

在数据库中,悲观锁的流程如下:

在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。

如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。

如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。

其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常

相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值