面经

一面

问题0:自我介绍

项目:背景;解决的问题;系统框架;业务架构;用到的技术,缓存服务器选型?难点;留几个坑让面试官发问(3-5个)

  • 用户权限问题(用户--角色--权限--页面)
  • redis(为什么不选memcache
    • 缓存击穿(不存在的数据,可以在redis中存null)
      • 数据库水平切分,或者读写分离
      • 分布式锁,读数据库,然后把数据加载到缓存
      • 熔断、降级
      • 布隆过滤器
    • 缓存雪崩
      • 过期时间加上一个随机数
      • 备份缓存:缓存a有超时,缓存b没有超时
      • 分布式锁:每次只能使用限个数据库连接
    • 缓存并发
      • 分布式的话:用分布式锁
      • 单个服务器的话:用synchronize,lock等保证线程安全
  • 定时线程池同步数据
  • 多数据库源问题的解决
  • 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就开始工作,性能会降低
  • 使用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
    • 栈溢出(只有栈)递归没返回,或者循环调用造成
    • 内存泄漏:解决办法一般就是根据垃圾回收前后情况对比,同时根据对象引用情况常见的集合对象引用)分析,基本都可以找到泄漏点
  • 垃圾回收算法:

    • 标记-清除:碎片,所以尽量不要
    • 标记-整理
    • 复制算法
    • 分代收集算法
  • 垃圾回收器分类: 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新人手册
    • 海报实验室,小分队,命题,实战按时,评审
    • 技术,场景,环境项目,方案,解决问题猜踩的坑
posted @ 2020-02-25 01:43  御心飞行  阅读(182)  评论(0编辑  收藏  举报