进入java行业,首先就要过面试这一关,面试通过了,才能胜任java岗位,所以我们要想通过面试,刷面试题还是有必要的,那高级java面试题有哪些?下面来我们就来给大家讲解一下。
1.什么是垃圾回收?
垃圾回收是Java中自动内存管理的另一种叫法。垃圾回收的目的是为程序保持尽可能多的可用堆(heap)。 JVM会删除堆上不再需要从堆引用的对象。
2.用一个例子解释垃圾回收?
比方说,下面这个方法就会从函数调用。
通过函数第一行代码中参考变量calendar,在堆上创建了GregorianCalendar类的一个对象。
函数结束执行后,引用变量calendar不再有效。因此,在方法中没有创建引用到对象。
JVM认识到这一点,会从堆中删除对象。这就是所谓的垃圾回收。
3.Redis的部分复制过程是什么?
部分同步工作原理如下:
Master为被发送的复制流创建一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令;
Master和Slave之间都记录一个复制偏移量(replication offset)和当前Master ID(Master run id);
当出现网络断开,Slave会重新连接,并且向Master请求继续执行原来的复制进程;
如果Slave中断网前的MasterID和当前要连的MasterID相同,并且从断开时到当前时刻Slave记录的偏移量所指定的数据仍然保存在Master的复制流缓冲区里面,则Master会向Slave发送缺失的那部分数据,Slave执行后复制工作可以继续执行。
否则Slave就执行完整重同步操作;
4.spring常用接口有哪些?
ApplicationListener:当需要监听自定义事件时,可以新建一个实现ApplicationListener接口的类,并将该类配置到Spring容器中。
FactoryBean:用于创建特定的对象,对象的类型由getObject方法的返回值决定。
ApplicationContextAware:当一个类需要获取ApplicationContext实例时,可以让该类实现ApplicationContextAware接口。
ApplicationEvent:当需要创建自定义事件时,可以新建一个继承自ApplicationEvent抽象类的类。
5.如何保证消息不被重复消费(如何保证消息消费时的幂等性)?
在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;
在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重的依据,避免同一条消息被重复消费。
6.消息如何分发?
若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。
高级java面试题肯定要比初级面试题难一些,不过这也没关系,我们就当做是在拓展知识,提高技能,毕竟面试中技术重要!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。
推荐阅读: