高级java面试宝典

1.spring事物的配置

spring事物分为俩种,一种是注解事物,一种是AOP事物
注解事物的配置: 事物的隔离级别,事物的传播性,事物的超时回滚,哪些异常回滚,哪些不回滚,有默认的回滚规则
注解事物的启动不是由@Transactional该注解启动的,而是由<tx:annotation-driven/>元素的出现 开启 了事务行为。

AOP事物的配置:在xml中配置,配置某些方法的隔离性,传播性,回滚等.需要声明切面表达式来声明在那些包下启动事物.

2.事物

事物的四大特性
1.原子性,2.一致性,3.隔离性.4.持久性.

事物的隔离级别
1.读未提交
2.读已提交
3.可重复读
4.序列化
大多数的数据库系统的默认事务隔离级别都是:Read committed (读已提交)
而MySQL的默认事务隔离级别是:Repeatable Read (可重复读)


3.垃圾回收机制

年轻代(Young Generation)
1.新生成的对象首先都放到年轻代,年轻代的目标就是尽可能快的回收那么声明周期短的对象.
2.新生代按照8:1:1的内存比例将内存划分为三个不同区域,一个eden区和俩个幸存者区域,一般对象都在eden区域生成,
回收时先将eden区域存活的对象放到幸存者区,如此反复,当eden区和幸存者区域都放满是,将eden和幸存者存活的对象放到幸存者1区,然后清空eden和幸存者一区,然后将幸存者1区和幸存者区交换,保证幸存者1区为空,如此反复!
3.当幸存者1区不足已存放eden和幸存者区的对象是,将直接将存活对象放到年老区.若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收.
4.新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发).

年老代(Old Generation)
1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

持久代(Permanent Generation)
用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。


4.HashMap

HashMap是由数组和链表组合而成.
HashMap是在bucket中储存键对象和值对象,作为Map.Entry。
HashMap将键值对存储在静态内部类Entry中,Entry中定义了Key和Value.
正常情况下讲该数据存储在bucket(Entry)数组中.
当HashCode值相同时,将不同键值对存放在链表中.
取值的时候,通过先调用HashCode方法获取bucket位置,然后再通过key.equals()方法获取链表中正确的节点.

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度依然为O(1),因为最新的Entry会插入链表头部,急需要简单改变引用链即可,而对于查找操作来讲,此时就需要遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

5.同步关键字加在静态方法和非静态方法的区别

同步分为俩种: 同步方法,同步代码块,各有利弊
同步方法也分为两种: 静态同步方法和非静态同步方法

所有的非静态同步方法用的都是同一把锁——实例对象本身
而所有的静态同步方法用的也是同一把锁——类对象本身

非静态方法同步是对类的实例对象进行加锁,也就是说,当实例对象对该类的非静态方法进行加锁是,该实例对象的其他非静态方法必须等待该非静态方法释放锁,才可以获取锁. 而不会影响其他实例对象的操作.

静态方法同步是对类对象本身进行加锁,首先,静态方法同步和非静态方法同步是不存在竞争关系的,因为他们锁的对象不同. 其次,静态方法获取锁时,该类的其他静态方法必须等待该方法释放锁才可以获取锁.
而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!


6.数据库索引

数据库建立索引的原则:
1.在经常当条件查询的字段上加索引
2.在经常分组和排序的字段上加索引.
3.组合索引是指特定条件的组合一起使用的时候,索引才会生效

索引失效:
1.like%号在前
2.<> , is null, is not null,都会引起索引失效


7.MyIsam 和 InnoDB的区别

前者不支持事物,外键,以及行级锁等数据库高级功能
InnoDB 直接 事物,外键,行级锁, Myisam效率比较高


8.ConcurrentHashMap原理

一个ConcurrentHashMap由多个segment(段)组成,每一个segment都包含了一个HashEntry数组的hashtable, 每一个segment包含了对自己的hashtable的操作,比如get,put,replace等操作,这些操作发生的时候,对自己的hashtable进行锁定。由于每一个segment写操作只锁定自己的hashtable,所以可能存在多个线程同时写的情况,性能无疑好于只有一个hashtable锁定的情况


9.常见的提高高并发下访问的效率的手段

像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器。
负载均衡,前置代理服务器nginx、apache等等
数据库查询优化,读写分离,分表等等


10.JVM

堆,(存放对象实例)栈(局部变量,),方法区(常量,静态属性)
jvm调优,有具体的工具可以 查看堆信息,对堆内存中的空间大小分配进行监控, 垃圾监控(长时间监控回收情况)查看堆内类、对象信息查看:数量、类型等
线程监控,
线程信息监控:系统线程数量。
线程状态监控:各个线程都处在什么样的状态下
内存泄漏检查


11.redis集群
数据结构, String,List,set,hash
官方推荐奖节点设置成主从结构,也就是一个主节点,多个从节点,如果一个主节点挂掉的话,会根据选举算法在从节点中升一个为主节点.继续提供服务.
Redis Cluster 官方给出的集群方案
Redis Sharding集群 分片的集群方案, Jedis集成
利用代理中间件实现大规模Redis集群 (twemproxy) 代理中间件
走中间件再到redis

12.dubbo
1、服务注册中心
2、集群容错
3、直连提供者
4、负载均衡
5、服务版本,服务分组
6、多协议

13.ES (实时分析的分布式搜索引擎)。

Es 是分布式的,不需要任何组件,其次ES是实时建立索引的,而Solr的实时性比较差,会遇到io阻塞的问题.而ES不会有.
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。

优点
Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。


Elasticsearch与Solr的比较*
当单纯的对已有数据进行搜索时,Solr更快。
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。

Elasticsearch 与 Solr 的比较总结
二者安装都很简单;
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。

14.MQ

RocketMQ:
可集群
1.单机支持1W以上的持久化队列
2.刷盘策略
异步刷盘,rocketmq中的所有消息都是持久化的,先写入系统pagecache,然后刷盘,可以保证内存与磁盘都有一份数据,访问时,可以直接从内存读取
3.消息查询
4.服务器消息过滤
5.消息堆积问题解决办法

原文地址:https://www.cnblogs.com/dj66194/p/7659799.html