高级程序员(JAVA)面试必知必会二(问题+答案)

1.业务介绍,场景描述,负责模块

2.数据库隔离级别,分别会避免什么样的错误,默认隔离级别。

read_uncommited,read_commited,repeatable_read,serializable_read,脏读,可重复读,幻读

3.IOC的原理

对象实例化的工作从开发者转移到容器。

applicationContext常用接口哪些,都有什么作用。

  • MessageSource———为应用提供国际化访问功能
  • ResourceLoader———提供资源(如URL和文件系统)的访问支持
  • ApplicationEventPublisher———引入事件机制,包括启动事件、关闭事件等,让容器在上下文中提供了对应用事件的支
  • ApplicationContext的主要实现类有

  • ClassPathXmlApplicationContext(从类路径加载IoC配置文件);
  • FileSystemXmlApplicationContext(从文件系统加载IoC配置文件)。

4.AOP原理

动态代理。cglib和jdk的原理。

  JDK动态代理只能对实现了接口的类生成代理,而不能针对类

  CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)

5.happenBefore偏序规则

https://blog.csdn.net/u010031673/article/details/48153797

6.多线程相关

volatile定义与功能。

wait和notify notifyall实践

https://www.cnblogs.com/moongeek/p/7631447.html

被wait的线程,想要继续运行的话,它必须满足2个条件:

  1. 由其他线程notify或notifyAll了,并且当前线程被通知到了
  2. 经过和其他线程进行锁竞争,成功获取到锁了

2个条件,缺一不可。其实在实现层面,notify和notifyAll都达到相同的效果,都只会有一个线程继续运行。但notifyAll免去了,线程运行完了通知其他线程的必要,因为已经通知过了。什么时候用notify,什么时候使用notifyAll,这就得看实际的情况了。

7.爬虫框架原理

8.垃圾回收

垃圾收集器,作用,垃圾回收算法,新生代suvivor和eden占比调节参数

https://blog.csdn.net/lojze_ly/article/details/49456255

1)-XX:NewSize和-XX:MaxNewSize

用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。

2)-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,这个值也比较重要。

3)-XX:+PrintTenuringDistribution

这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。

4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold

用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。

G1和CMS的区别

https://blog.csdn.net/qq_25396633/article/details/72972008

9.IO相关

突然中断会怎样。

10.redis

常用应用场景

https://blog.csdn.net/u012743772/article/details/78212719

11.消息队列

https://blog.csdn.net/seven__________7/article/details/70225830

拉模式:

点对点消费,如果没有消费者在监听队列,消息将保留在队列中,直至消费者连接到队列,在这种模型中,消息不是自动推动给消费者的,而是要由消费者从队列中请求活动(拉模式)。 优点: 1.保证每条消息都被接收。 2.消息不会丢失。

推模式

消息会自动广播,消息消费者无需主动请求或轮询主题的方法来获得新消息。 对比: 1.不保证每条消息都会被消费, 2.发布消息时,只有正在监听该topic的能够接收,如果没人监听,则会消息丢失。

https://blog.csdn.net/heyutao007/article/details/50131089

加大点难度:

Dubble通信机制,抛开注册中心,如果调用不到,可能会出现什么问题,如何定位

负载均衡策略

dubbo负载均衡策略:

        在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。

    RandomLoadBalance

随机,按权重设置随机概率。

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

    RoundRobin LoadBalance

轮循,按公约后的权重设置轮循比率。

存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

    LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

   ConsistentHashLoadBalance

一致性Hash,相同参数的请求总是发到同一提供者。

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

https://www.cnblogs.com/leeSmall/p/7620467.html

锁降级:

锁降级指的是写锁降级成为读锁。锁降级是指把持住当前拥有的写锁的同时,再获取到读锁,随后释放写锁的过程。

https://www.jianshu.com/p/0f4a1995f57d

可重入锁:

https://blog.csdn.net/lzwglory/article/details/80016497

熔断机制

https://blog.csdn.net/world_snow/article/details/79080314

https://blog.csdn.net/isitman/article/details/81184868

数据库相关,b树b+树还有哈希索引有啥区别

http://uule.iteye.com/blog/2429508

Rehash啥原理

https://blog.csdn.net/qq_27093465/article/details/52270519

Ioc都用了哪些设计模式,怎么用的

https://blog.csdn.net/liagnzi1259/article/details/77520181

双亲委派机制碰见重复类怎么办

能不能自己写个类叫java.lang.System?

      答案:通常不可以,但可以采取另类方法达到这个需求。

      解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。

锁降级,锁升级相关

平常都有用到哪些jdk自带的工具,都用来做什么了

如果出现outOfMemery,可以从哪些地方来定位这个问题

如果出现stackoverFlow,可以从哪些地方来定位问题

其实上面两个问题都可以从原理方面来展开:

java虚拟机中,五个区得知道吧,程序计数器,虚拟机栈,本地方法栈,堆,方法区,除了程序计数器,其他区都可能发生OutOfMemory。比如:

虚拟机栈扩展时无法申请到足够的内存时将会跑出OOM异常。

本地方法栈和虚拟机栈差不多,所以也会出现同样的问题。

堆的话主要是存放对象的,如果GC后,仍然没有足够的内存分配,也不能扩展,将会抛出OutOfMemoryError:Java Heap Space异常,如果不是真的有逻辑问题(莫名创建了大量的对象),那可以尝试下调整下虚拟机的默认内存空间大小,vm arguments框里输入一些简单的参数配置,

各个参数的含义为:

  • -Xms,表示程序启动时,JVM 堆的初始化最小尺寸参数;
  • -Xmx,表示程序启动时,JVM 堆的初始化最大尺寸参数;
  • -XX:PermSize,表示程序启动时,JVM 方法区的初始化最小尺寸参数;
  • -XX:MaxPermSize,表示程序启动时,JVM 方法区的初始化最大尺寸参数。

方法区的话,如果它使用的内存超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。permGen代表的是permanent generation,永久代的意思。PermGen 空间的使用量, 与JVM加载的 class 数量有很大关系,随着生成的class越来越多,将会占满Permgen空间

https://blog.csdn.net/renfufei/article/details/77994177

栈溢出的相关参考这个

一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。

二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。

三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

解决这类问题的办法有两个,

      一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。 

 

B树和hash的应用场景是什么样子的

SpringBoot了解

https://www.cnblogs.com/wmyskxz/p/9010832.html

数据库的有什么了解

https://blog.csdn.net/chuangsun/article/details/78013537

limit优化方案

http://www.cnblogs.com/beynol/p/mysql-optimization-limit.html

CGlib比JDK的性能对比??

一般情况下还是选择jdk代理,jdk代理比较快。

  (1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。

  (2)在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,JDK7及8的动态代理性能比CGlib要好20%左右。

最新的版本mysql多少,有什么新特性?

社区版已经到8.0.12https://www.jb51.net/article/137123.htm

最新的版本Spring多少,有什么新特性?

Spring5https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html

最新的版本jdk多少,有什么新特性?

JDK9https://www.cnblogs.com/yif0118/p/8319837.html

localdate新的日期类https://blog.csdn.net/wyz0516071128/article/details/80834107

date -> LocalDate(例如2018-09-18)
time -> LocalTime(例如12:20:25.000000040)
timestamp -> LocalDateTime(例如2018-09-18T09:35:47.335)

流式处理https://www.cnblogs.com/shenlanzhizun/p/6027042.html

lamda表达式https://www.hhfate.cn/t/536

optional类https://blog.csdn.net/sun_promise/article/details/51362838

接口中的默认方法https://www.cnblogs.com/luozhiyun/p/7999705.html

单点登陆系统如何实现?

https://blog.csdn.net/u011530389/article/details/50680873

.说一下TreeMap的实现原理?红黑树的性质?红黑树遍历方式有哪些?如果key冲突如何解决?setColor()方法在什么时候用?什么时候会进行旋转和颜色转换?

手写RPC

https://blog.csdn.net/lovoo/article/details/78108938

bean的生命周期

https://blog.csdn.net/fuzhongmin05/article/details/73389779

https://blog.csdn.net/Adrian_Dai/article/details/79444753

Dubbo超时重试;Dubbo超时时间设置

Dubbo超时和重连配置示例

    <!-- 服务调用超时设置为6秒,超时不重试--> 
    <dubbo:service interface="com.provider.service.DemoService" ref="demoService"  retries="0" timeout="5000"/>

Dubbo消费者端统一的超时和重连配置

    <!--统一的消费者配置-->
    <dubbo:consumer timeout="30000" retries="0" version="1.0.0"/>

dubbo在调用服务不成功时,默认会重试2次。
Dubbo的路由机制,会把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。
但是如果不合理的配置重试次数,当失败时会进行重试多次,这样在某个时间点出现性能问题,调用方再连续重复调用,
系统请求变为正常值的retries倍,系统压力会大增,容易引起服务雪崩,需要根据业务情况规划好如何进行异常处理,何时进行重试。

如何保障请求执行顺序

为了简单轻量级的可以考虑使用 Redis. 借助 Redis 的list结构, Producer 调用 Redis 的 lpush 往特定key里添加消息, Consumer 调用 brpop 去不断监听该key.
如果需要实现复杂功能的, 那么可以考虑使用 RabbitMQ 或 ActiveMQ 等之类的专门的消息队列.

http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/

执行某操作,前50次成功,第51次失败

a全部回滚

父类方法加事务PROPAGATION_REQUIRED 

b前50次提交第51次抛异常,ab场景分别如何设置Spring(传播性)

父类方法加事务PROPAGATION_REQUIRED ,子类方法加事务PROPAGATION_REQUIRES_NEW

Zookeeper有哪些用

https://mp.weixin.qq.com/s/J8erMBhiogXoQcn91SJcbw

数据库垂直和水平拆分

案例: 
以mysql为例,简单购物系统暂设涉及如下表: 
1. 产品表(数据量10w,稳定)   
2. 订单表(数据量200w,且有增长趋势)   
3. 用户表 (数据量100w,且有增长趋势)  
垂直拆分: 
  解决问题: 表与表之间的io竞争 
  不解决问题: 单表中数据量增长出现的压力 
  方案:

  1. 把产品表和用户表放到一个server上
  2. 订单表单独放到一个server上

水平拆分: 
  解决问题: 单表中数据量增长出现的压力 
  不解决问题: 表与表之间的io争夺 
  方案:

  1. 用户表通过性别拆分为男用户表和女用户表;   
  2. 订单表通过已完成和完成中拆分为已完成订单和未完成订单;  
  3. 产品表未完成订单放一个server上;   
  4. 已完成订单表盒男用户表放一个server上;   
  5. 根据新用户和老用户,因为新用户相应的活跃度高;

MyBatis如何分页;如何设置缓存;MySQL分页

https://blog.csdn.net/wangpei555/article/details/52829194

熟悉IO么?与NIO的区别,阻塞与非阻塞的区别

https://blog.csdn.net/hxpjava1/article/details/56282385

https://www.cnblogs.com/orez88/articles/2513460.html

阻塞队列了解多少

https://www.cnblogs.com/tjudzj/p/4454490.html

接口如何处理重复请求?

http://pengl.com.cn/2017/09/26/%E4%BD%BF%E7%94%A8Redis%E8%AE%A1%E6%95%B0%E5%99%A8%E9%98%B2%E6%AD%A2%E5%B9%B6%E5%8F%91%E8%AF%B7%E6%B1%82/

设计一个对外服务的接口实现类,在1,2,3这三个主机(对应不同IP)上实现负载均衡和顺序轮询机制(考虑并发)

jvm,jre以及jdk三者之间的关系?

总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。 
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。 其中的开发工具包括编译工具(javac.exe)打包工具(jar.exe)等

JVM可以理解为是一个虚拟出来的计算机,具备着计算机的基本运算方式,它主要负责将java程序生成的字节码文件解释成具体系统平台上的机器指令。让具体平台如window运行这些Java程序。 

三者之间关系 

JDK 包含JRE,JRE包含JVM。

我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

AQS原理?

https://www.cnblogs.com/daydaynobug/p/6752837.html

Dubbo负载均衡算法

https://www.cnblogs.com/leeSmall/p/7620467.html

Zookeeper底层原理

https://blog.csdn.net/qiangcuo6087/article/details/79042035

mybatis底层原理

https://www.cnblogs.com/luoxn28/p/6417892.html

https://www.jianshu.com/p/8d1f499063a1

Mybatis动态SQL底层工作原理

https://blog.csdn.net/zhangdongnihao/article/details/80347772

bean的生命周期

https://blog.csdn.net/fuzhongmin05/article/details/73389779

锁优化策略

https://blog.csdn.net/stackflow/article/details/79455880

CAS原理

https://blog.csdn.net/mmoren/article/details/79185862

BIO NIO AIO的区别

https://blog.csdn.net/qq_33665647/article/details/54584988

ELK

http://1028826685.iteye.com/blog/2306570

序列化与反序列化框架

https://blog.csdn.net/earbao/article/details/46914407

REDIS常见应用场景

https://blog.csdn.net/HD243608836/article/details/80216982

猜你喜欢

转载自blog.csdn.net/q957967519/article/details/82491957