zoukankan      html  css  js  c++  java
  • 面经

    一面

    问题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新人手册
      • 海报实验室,小分队,命题,实战按时,评审
      • 技术,场景,环境项目,方案,解决问题猜踩的坑
  • 相关阅读:
    @codeforces
    @总结
    @总结
    @codeforces
    @topcoder
    @codeforces
    @codeforces
    @codeforces
    @codeforces
    @codeforces
  • 原文地址:https://www.cnblogs.com/a1225234/p/12359808.html
Copyright © 2011-2022 走看看