一面
问题0:自我介绍
项目:背景;解决的问题;系统框架;业务架构;用到的技术,缓存服务器选型?难点;留几个坑让面试官发问(3-5个)
- 用户权限问题(用户–角色–权限–页面)
- redis(为什么不选memcache)
- 缓存击穿(不存在的数据,可以在redis中存null)
- 数据库水平切分,或者读写分离
- 分布式锁,读数据库,然后把数据加载到缓存
- 熔断、降级
- 布隆过滤器
- 缓存雪崩
- 过期时间加上一个随机数
- 备份缓存:缓存a有超时,缓存b没有超时
- 分布式锁:每次只能使用限个数据库连接
- 缓存并发
- 分布式的话:用分布式锁
- 单个服务器的话:用synchronize,lock等保证线程安全
- 缓存击穿(不存在的数据,可以在redis中存null)
- 定时线程池同步数据
- 多数据库源问题的解决
- XXX 不足:并发问题
我的收获是:
- 独立完成后台项目的搭建和编写,对于搭建项目的流程有了更加清晰的理解,增加了自信心
- 自学了redis,做到学以致用;aop的应用,原理,减少功能代码的编写,维护项目更加容易
- 业务抽象能力的提高
- 增强了团队合作意识,锻炼了表达沟通能力
问题1、String, StringBuilder, StringBuffer的区别、使用场景
- String数据内部结构用的是private final char[],是不可变的
- 其实被private final修饰的是引用对象,只要引用不变,char[]数组中的内容是可以变的,但是String没有提供方法修改String,所以String是不可变的。但是,可以用反射把value的访问权限
valueField.setAccessible(true);
,那么外部就可以对value进行修改了。 - 对String进行 “+=”操作 时,会生成一个新的String对象,让引用指向新的对象。如果经常改变String内容的场景,不要用String类型,内存中无引用的对象多了,容易造成内存泄漏,GC就开始工作,性能会降低。
- 其实被private final修饰的是引用对象,只要引用不变,char[]数组中的内容是可以变的,但是String没有提供方法修改String,所以String是不可变的。但是,可以用反射把value的访问权限
- 使用String类的concat与replace方法时,不会对原来的对象产生影响,他们会返回一个全新的对象
- StringBuilder线程不安全,性能较好
- StringBuffer线程安全,加了Synchronized同步锁,保证取数据或者修改数据时的线程安全性,性能较差
StringBuilder, StringBuffer的实现原理:
- 用char[]存储数据,当char[]盛不下时,进行扩容,2倍扩容,避免总是扩容,默认数组的长度是16,如果能够预测char[]的长度的话,如果长度小于16,那么可以不设置,如果比16长的话,应该尽量设置长度,不然的话,会进行扩容,导致性能降低。
问题2、类加载过程,假如自己定义了一个String类,且String在的包也是java.util.String,在这个String中只写main方法,main方法中打印一句“hello world”,那么程序运行的结果是?
类加载过程: 加载class文件;验证;准备;解析(将常量池内的符号转换成直接引用);初始化
初始化过程: 为类变量进行初始化,执行类构造器<clinit>方法
,
<clinit>方法
的特点:
- 内容:包括变量的赋值操作和静态语句块(执行顺序,源文件中出现的顺序)
<clinit>方法
和实例构造器<init>方法
不同,不需要显示调用父类构造器,jvm会保证执行子类的<clinit>方法
前,父类的<clinit>方法
已经被执行了,因此object的<clinit>方法
最先执行- 如果一个类没对变量的赋值操作和静态代码块,就可以不为该类生成
<clinit>方法
- 只有一个线程执行
<clinit>方法
,其他线程阻塞
判断2个类是否相同:
首先看他们的类加载器是不是一样的,如果不一样,那么肯定不是同一个类
★ java 自定义一个类java.lang.System/String会发生什么
问题3、HashMap底层原理介绍
问题4:JVM调优?或者做过关于性能提高的工作吗
-
内存分配策略:
- 对象优先分配在新生代
- 大对象直接进入老年代
- 大年龄的对象进入老年代
- 动态年龄分配
- 分配担保机制
-
堆、栈、方法区会出现的异常:
- 内存溢出
- 方法区 PermGen space:Perm被占满,无法为新的class分配存储空间而引发的异常
- 主要原因:就是大量动态反射生成的类不断被加载
- 解决方法:
-XX:MaxPermSize=16m
,用完时,进行GC
- 方法区 PermGen space:Perm被占满,无法为新的class分配存储空间而引发的异常
- 栈溢出(只有栈):递归没返回,或者循环调用造成
- 内存泄漏:解决办法一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。
- 内存溢出
-
垃圾回收算法:
- 标记-清除:碎片,所以尽量不要
- 标记-整理
- 复制算法
- 分代收集算法
-
垃圾回收器分类: JDK1.7和1.8(默认parallel scavenge,parallel old),1.9(默认G1)
-
1、串行处理器(单线程):serial,serial old
-
2、并行处理器(多线程):ParNew,parallel scavenge,parallel old
适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
缺点:垃圾收集过程中应用响应时间可能加长 -
3、并发处理器(多线程):cms,G1;特点:对响应时间有高要求(低停顿)
-
★★★★★ 重点说下G1的垃圾回收过程:初始标记;并发标记;最终标记;选择回收(CMS是并发回收,G1相对于CMS的优点)
-
-
热点的检测:
- CPU热点:检查系统哪些方法占用的大量CPU时间
- 内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)
这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行所有代码的优化。
-
利用redis缓存;集群(负载均衡);数据库的水平、垂直分表;解决性能问题
问题5:秒杀思路
- 秒杀系统与原有电商系统分开部署
- 商品页面 进行静态化缓存,只访问服务器中商品的动态数据
- 读写分离是用来解决数据库的读性能瓶颈的(主从集群)
- 但是解决读性能问题首选缓存,因为读写分离存在(主从一致性;如何实现故障自动转移)问题
- 商品列表页 进行缓存
- 下订单时,查看是否重复下单,查看redis,key为userId,value为用户下单的商品id集合
- 如果已经买过,就不让在买
- 如果没有买过,检查redis缓存的商品库存是否为0
- 如果库存不为0,则在redis中预减库存,然后把购买请求加入到rabbitmq中,把并发请求串行化
- 如果库存为0,则告诉用户卖完了
问题6:怎么让方法区溢出 方法区存的是 类加载信息、静态变量、常量、常量池
- 静态块中写while循环,调用String的intern。intern()方法设计的初衷:重用String对象,以节省内存消耗,使用intern的话,时间会比不适用intern的时间稍微长点,但是如果不适用intern的话,GC花费的时间更长。intern()方法是把String对象的value放入常量池中
- 动态发射会加载很多类信息,也会造成方法区溢出
问题7:java自评,实习后该加强什么?
问题8:最近在学什么?
- 多线程的AQS
- redis底层原理
- XXX 消息队列:秒杀系统视频,使用场景,原理
1、部门是做:(淘宝)用户增长和会员数据分析相关
2、技术栈:高并发;大数据离线,实时计算;分布式;jvm调优;
3、转正答辩:
- 素质,潜力
- 当成正式员工培养,接触到的技术的深度、广度和理解
- 实习的产出物(3-6个月)
- 小组讨论,思考:稳定性和架构
4、阿里实习生量身定制培养计划:
- 1:1指导
- 技术集训
- 技术分享
- 社区挖掘新技术(自学)
有什么想问的?
- 作为刚毕业的、做开发的学生,适合女生的、比较优秀的发展轨迹是什么样的?达到这个高度需要具备什么?学习什么?
- 性别?年龄?如何像老中医那样,越老越吃香?
- 房地产行业下滑对公司的影响
- 分公司搬到高新区的计划(我在高新区,公司不在,路上时间很长)
- 公司内部技术人员的上升通道?评级周期?评级标准?
本地内存;直接内存
redis 3.0
二面
1、简单自我介绍,重点项目介绍(如上)
2、项目考虑除业务外的因素了吗?比如:
- 安全性(医院内网?权限判断?)
- 网站的可用性(系统的稳定性?会挂掉吗?高并发时数据一致性问题?)这里详细问了CAP原理?分布式锁的替代方法?
3、读过哪些源码?
Spring的AOP的实现?集合类的实现原理?AQS的独占和共享模式的实现?
4、有什么要问的吗?
-
facebook的黑客增长
-
实习生转正看重的点:
- 面试考察基础掌握的深度,所以实习更看中实操如何?
- 是否好学?
- 知识面的深度?
- 实习过程中,具体事情,解决问题思路,执行率,协同配合,能力。结果,并且能讲清楚,个人起到的核心的
- 短时间,表现非常好的潜质特质,上升空间
-
实习生培养
- java新人手册
- 海报实验室,小分队,命题,实战按时,评审
- 技术,场景,环境项目,方案,解决问题猜踩的坑