阿里巴巴蚂蚁金服 Java 面试经历包含答案解析
快排的时间复杂度,冒泡时间复杂度,快排是否稳定,快排的过程
讲一下 spring 的启动流程
spring 启动有几种方法,通过 web.xml 的监听器,或者 ClassPathXmlApplicationContext,
FileSystemXmlApplicationContext,它启动的核心目标是构建 spring 容器,构建容器需要做以下几个工作 ,实例化对象,
加载配置,装配 bean 对象,
首先根据路径加载配置文件,也叫元数据 和 pojo 对象, 根据对应的模板表情进行初始化操作,通过元数据和反射的方式生成对象放入容器中,load 的配置也进行初始化,后面会有 bean 的装配工作和回调工作,
比如实现了 InitializingBean 会在容器所有需要设置属性的 bean 设置完以后调用 afterPropertiesSet
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
AOP 是怎么实现的?两种动态代理的应用场景?
通过动态生成字节码,增强代码业务功能,
JDK 动态代理, 需要代理的类必须要实现接口
cglib 无需实现接口 速度快
javaassist 也无需实现接口
Java 中的新生代和老年代的垃圾回收算法,对应的垃圾收集器
谈谈 synchronized、ReenTrantLock、volatile 三者的区别
synchronized 互斥锁,
即操作互斥,并发线程过来,串行获得锁,串行执行代码。就像一个房间一把钥匙,一个人进去后,下一个人得等第一个人出来得到钥匙才能进入。如果代码写的不好(A),可能出现死锁!(A 得到锁,B 等待 A 释放锁,A 不释放,B 死锁).
ReenTrantLock 重入锁
在 JDK 优化之后 synchronized 和 reentrantLCOK 锁的性能其实差不多
唯一的区别是
ReenTrantLock 可以指定是公平锁还是非公平锁。而 synchronized 只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。 ReenTrantLock 提供了一个 Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像 synchronized 要么随机唤醒一个线程要么唤醒全部线程。 ReenTrantLock 提供了一种能够中断等待锁的线程的机制,通过 lock.lockInterruptibly()来实现这个机制。
如果需要使用 reentrantlock 的这三种独立功能可以使用这个锁 并且 ReenTrantLock 的力度更细
volatile 是一个关键字 对虚拟机声明标识有该关键字的遍历 不允许重排序和修改马上刷新内存~
示例代码:
蚂蚁金服二面
[Linux]命令 统计,排序,前几问题等
wc、sort、uniq 这三个命令都是用于排序。
wc 命令很简单,在 linux 中用来统计文件中的字节数、字数、行数,并且将结果返回
格式:wc [-clmwL] file
-c:统计字节数
-l:统计行数
-m:统计字符数
-w:统计字数,一个字被定义为由空白、跳格或换行字符分隔的字符串
-L:打印最长行的长度
full gc 的发生有哪几种情况?
触发 MinorGC(Young GC)
虚拟机在进行 minorGC 之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间 1、如果大于的话,直接执行 minorGC 2、如果小于,判断是否开启 HandlerPromotionFailure,没有开启直接 FullGC 3、如果开启了 HanlerPromotionFailure, JVM 会判断老年代的最
大连续内存空间是否大于历次晋升的大小,如果小于直接执行 FullGC 4、如果大于的话,执行 minorGC
触发 FullGC
老年代空间不足 如果创建一个大对象,Eden 区域当中放不下这个大对象,会直接保存在老年代当中,如果老年代空间也不足,就会触发 Full GC。为了避免这种情况,最好就是不要创建太大的对象。
持久代空间不足
如果有持久代空间的话,系统当中需要加载的类,调用的方法很多,同时持久代当中没有足够的空间,就出触发一次 Full GC
YGC 出现 promotion failure
promotion failure 发生在 Young GC, 如果 Survivor 区当中存活对象的年龄达到了设定值,会就将 Survivor 区当中的对象拷贝到老年代,如果老年代的空间不足,就会发生 promotion failure, 接下去就会发生 Full GC.
统计 YGC 发生时晋升到老年代的平均总大小大于老年代的空闲空间
在发生 YGC 是会判断,是否安全,这里的安全指的是,当前老年代空间可以容纳 YGC 晋升的对象的平均大小,如果不安全,就不会执行 YGC,转而执行 Full GC。
显示调用 System.gc
Netty 内部结构
mysql 有几种引擎,区别?
innodb 中聚集索引,非聚集索引
分布式下 redis 如何保证线程安全
MySQL、Redis、MongoDB 各自的应用场景
Redis 的存储数据结构,以及持久化区别
蚂蚁金服三面
什么情况索引不会命中,会造成全表扫描
1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
4.in 和 not in 也要慎用,否则会导致全表扫描
5.'%abc%' like 全匹配查询也会导致
评论