2019蚂蚁金服Java必问面试题及答案

2019蚂蚁金服Java必问面试题及答案


2024年4月27日发(作者:)

2019蚂蚁金服Java必问面试题及答案

一面

1、自我介绍、自己做的项目和技术领域

开放题

2、项目中的监控:那个监控指标常见的有哪些?

答:CPU、内存、IO 等等。建议下载个nmon工具,里面有各个

指标。

数据库:Mysql(缓存命中、索引、单条SQL性能、数据库线程

数、数据池连接数)

中间件:1.消息2、负载均衡3、缓存(包括线程数、连接数、日

志)。

网络:吞吐量、吞吐率

应用:jvm内存、日志、Full GC频率

3、微服务涉及到的技术以及需要注意的问题有哪些?

4、注册中心你了解了哪些?

答:Consul 、Eureka、ZooKeeper

5、consul 的可靠性你了解吗?

6、consul 的机制你有没有具体深入过?有没有和其他的注册中

心对比过?

7、项目用Spring 比较多,有没有了解Spring 的原理?AOP 和

IOC 的原理

答:(1). IoC(Inversion of Control)是指容器控制程序对象之间

的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代

码中转到了外部容器,控制权的转移是所谓反转。对于Spring而言,

就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另

外一个名字——“依赖注入(Dependency Injection)”。从名字上

理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,

即由容器动态地将某种依赖关系注入到组件之中。

(2). 在Spring的工作方式中,所有的类都会在spring容器中登

记,告诉spring 这是个什么东西,你需要什么东西,然后spring会

在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给

其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就

是说控制对象生存周期的不再是引用它的对象,而是spring。对于某

个具体的对象而言,以前是它控制其他对象,现在是所有对象都被

spring控制,所以这叫控制反转。

(3). 在系统运行中,动态的向某个对象提供它所需要的其他对象。

(4). 依赖注入的思想是通过反射机制实现的,在实例化一个类时,

它通过反射调用类中set方法将事先保存在HashMap中的类属性注入

到类中。总而言之,在传统的对象创建方式中,通常由调用者来创建

被调用者的实例,而在Spring 中创建被调用者的工作由Spring来完

成,然后注入调用者,即所谓的依赖注入or控制反转。注入方式有两

种:依赖注入和设置注入;IoC的优点:降低了组件之间的耦合,降低

了业务对象之间替换的复杂性,使之能够灵活的管理对象。AOP

(Aspect Oriented Programming)

(1). AOP面向方面编程基于IoC,是对OOP的有益补充;

(2). AOP利用一种称为“横切”的技术,剖解开封装的对象内部,

并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名

为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业

务无关,却为业务模块所共同调用的逻辑或责任封装起来,比如日志

记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未

来的可操作性和可维护性。

(3). AOP代表的是一个横向的关系,将“对象”比作一个空心的

圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,

就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而剖开

的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这

些剖开的切面复原,不留痕迹,但完成了效果。

(4). 实现AOP的技术,主要分为两大类:一是采用动态代理技术,

利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执

行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而

使得编译器可以在编译期间织入有关“方面”的代码。

(5). Spring实现AOP:JDK动态代理和CGLIB代理JDK动态代

理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一

个接口的实现类来完成对目标对象的代理;其核心的两个类是

InvocationHandler和Proxy。CGLIB代理:实现原理类似于JDK动

态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。

CGLIB是高效的代码生成包,底层是依靠ASM(开源的java 字节码编

辑类库)操作字节码实现的,性能比JDK强;需要引入包和

。使用AspectJ注入式切面和@AspectJ注解驱动的切面

实际上底层也是通过动态代理实现的。

(6). AOP使用场景:

Authentication 权限检查

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 延迟加载

Debugging 调试

logging, tracing, profiling and monitoring 日志记录,跟踪,

优化,校准Performance optimization 性能优化,效率检查

Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务管理

另外Filter的实现和struts2的拦截器的实现都是AOP思想的体

现。

8、Spring Boot除了自动配置,相比传统的Spring 有什么其他

的区别?

为Spring 生态系统的开发提供一种更简洁的方式,提供了很多非

功能性特性,例如:嵌入式Server,Security,统计,健康检查,外

部配置等等,主要体现在以下几点:

Boot可以建立独立的Spring应用程序;

2.内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说

可以直接跑起来,用不着再做部署工作了;

3.无需再像Spring那样搞一堆繁琐的xml文件的配置;

4.可以自动配置Spring。SpringBoot将原有的XML配置改为

Java配置,将bean注入改为使用注解注入的方式(@Autowire),并

将多个xml、properties 配置浓缩在一个配置文件

中。

5.提供了一些现有的功能,如量度工具,表单数据验证以及一些

外部配置这样的一些第三方功能;

6.整合常用依赖(开发库,例如spring-webmvc、jackson-json、

validation-api 和tomcat等),提供的POM可以简化Maven的配

置。当我们引入核心依赖时,SpringBoot会自引入其他依赖。

9、Spring Cloud 有了解多少?

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的

开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注

册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以

用Spring Boot的开发风格做到一键

启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前

各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通

过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最

终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发

工具包。

10、Spring Bean 的生命周期

一个Bean从创建到销毁,如果是用BeanFactory来生成,管理

Bean的话Spring上下文中的Bean也类似,如下

1、实例化一个Bean--也就是我们常说的new;

2、按照Spring上下文对实例化的Bean进行配置--也就是IOC

注入;

3、如果这个Bean已经实现了BeanNameAware接口,会调用

它实现的setBeanName(String)方法,此处传递的就是Spring配置文

件中Bean的id值

4、如果这个Bean已经实现了BeanFactoryAware接口,会调用

它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是

Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring

配置文件中配置一个普通的Bean就可以);

5、如果这个Bean已经实现了ApplicationContextAware接口,

会调用setApplicationContext(ApplicationContext)方法,传入

Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,

因为ApplicationContext是BeanFactory的子接口,有更多的实现方

法);

6、如果这个Bean关联了BeanPostProcessor接口,将会调用

postProcessBeforeInitialization(Object obj, String s)方法,

BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个

是在Bean 初始化结束时调用那个的方法,也可以被应用于内存或缓存

技术;

7、如果Bean在Spring配置文件中配置了init-method属性会

自动调用其配置的初始化方法。

8、如果这个Bean关联了BeanPostProcessor接口,将会调用

postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是

一个Singleton 的,所以一般情况下我们调用同一个id的Bean会是

在内容地址相同的实例,当然在Spring配置文件中也可以配置非

Singleton,这里我们不做赘述。

9、当Bean不再需要时,会经过清理阶段,如果Bean实现了

DisposableBean 这个接口,会调用那个其实现的destroy()方法;

10、最后,如果这个Bean的Spring配置中配置了destroy-

method属性,会自动调用其配置的销毁方法。

另外我们这里描述的是应用Spring上下文Bean的生命周期,如

果应用Spring 的工厂也就是BeanFactory的话去掉第5步就Ok了

11、HashMap 和hashTable 区别?

区别:Hashtable是线程安全的,效率比较低

Hashtable既不支持Null key也不支持Null value。Hashtable

的put()方法的注释中有说明

Hashtable默认的初始大小为11,之后每次扩充,容量变为原来

的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量

变为原来的2倍Hashtable在计算元素的位置时需要进行一次除法运

算,而除法运算是比较耗时的

HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,

这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法

的效率要高很多。HashMap是继承自AbstractMap类,而

HashTable是继承自Dictionary类。不过它们都实现了同时实现了

map、Cloneable(可复制)、Serializable(可序列化)这三个接口

12、Object 的hashcode 方法重写了,equals 方法要不要改?

不需要,Ojbect类中有两个方法equals、hashCode,这两个方

法都是用来比较两个对象是否相等的,如果两个对象相等(equal),

那么必须拥有相同的哈希码(hash code)

即使两个对象有相同的哈希值(hash code),他们不一定相等

重写equals()方法就必须重写hashCode(),但重写hashcode方

法不一定要重写equals方法

13、Hashmap 线程不安全的出现场景

用ConcurrentHashMap 线程安全

多线程处理时hashmap线程不安全

首先hashmap里这个size没有用volatile关键字修饰,代表这

不是一个内存可见的变量,线程操作数据的时候一般是从主存拷贝一

个变量副本进行操作,操作完成过后在把size的值写回到主存size的

线程不安全问题应该属于并发问题之一的,属于相对高级的问题

了。这个时候的问题已经不仅仅局限于代码层面了,很多时候需要结

合JVM一起分析了14、线上服务CPU 很高该怎么做?有哪些措施可

以找到问题

定位出现问题的堆栈信息排查具体问题

1、top命令:Linux命令。可以查看实时的CPU使用情况。也可

以查看最近一段时间的CPU使用情况。

2、ps命令:Linux命令。强大的进程状态监控命令。可以查看进

程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。

3、jstack: Java提供的命令。可以查看某个进程的当前线程栈运

行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运

行状态、运行代码,以及是否死锁等等。

4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情

15、JDK 中有哪几个线程池?顺带把线程池讲了个遍

JUC提供了调度器对象Executors来创建线程池,可创建的线程

池有四种

1、newFixedThreadPool创建一个指定工作线程数量的线程池。

每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程

池初始的最大数,则将提交的任务存入到池队列中。

2、newCachedThreadPool创建一个可缓存的线程池。这种类型

的线程池特点是:

1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为

Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。

2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了

指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果

你又提交了新的任务,则线程池重新创建一个工作线程。

3、newSingleThreadExecutor创建一个单线程化的Executor,

即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会

有另一个取代它,保证顺序执行(我觉得这点是它的特色)。单工作线程

最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不

会有多个线程是活动的。

4、newScheduleThreadPool创建一个定长的线程池,而且支持

定时的以及周期性的任务执行,类似于Timer。(这种线程池原理暂还


发布者:admin,转转请注明出处:http://www.yc00.com/news/1714167249a2394566.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信