乐趣区

关于java:9月字节面经分享面试官从JVM问到线程池你遭得住吗

字节跳动

前段时间听很多敌人分享了他们最近蹩脚却又对职业生涯很有帮忙的的面试经验,在这里分享给大家,咱来讲讲:字节跳动

头条技术面共三面,之后是 HR 面,面试模式是视频,感觉很高大上。工夫均管制在 1 个小时。

第一面:

第一面次要考查根底,先简略自我介绍,以及介绍一下我的项目,而后开始考查根底,以下是在字节跳动考查的:JVM+Spring+MySQL+ 线程池 + 锁的题目,和大家共勉~

JVM 的内存构造

依据 JVM 标准,JVM 内存共分为虚拟机栈、堆、办法区、程序计数器、本地办法栈五个局部。

1. Java 虚拟机栈:线程公有;每个办法在执行的时候会创立一个栈帧,存储了局部变量表,操作数栈,动静连贯,办法返回地址等;每个办法从调用到执行结束,对应一个栈帧在虚拟机栈中的入栈和出栈。

2. 堆:线程共享;被所有线程共享的一块内存区域,在虚拟机启动时创立,用于寄存对象实例。

3. 办法区:线程共享;被所有线程共享的一块内存区域;用于存储已被虚拟机加载的类信息,常量,动态变量等。

4. 程序计数器:线程公有;是以后线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程公有”的内存。

5. 本地办法栈:线程公有;次要为虚拟机应用到的 Native 办法服务。

为什么要用线程池

那先要明确什么是线程池

线程池是指在初始化一个多线程应用程序过程中创立一个线程汇合,而后在须要执行新的工作时重用这些线程而不是新建一个线程。

应用线程池的益处

  1. 线程池改良了一个应用程序的响应工夫。因为线程池中的线程曾经筹备好且期待被分配任务,应用程序能够间接拿来应用而不必新建一个线程。
  2. 线程池节俭了 CLR 为每个短生存周期工作创立一个残缺的线程的开销并能够在工作实现后回收资源。
  3. 线程池依据以后在零碎中运行的过程来优化线程工夫片。
  4. 线程池容许咱们开启多个工作而不必为每个线程设置属性。
  5. 线程池容许咱们为正在执行的工作的程序参数传递一个蕴含状态信息的对象援用。
  6. 线程池能够用来解决解决一个特定申请最大线程数量限度问题。

msyql 优化教训

1. 对查问进行优化,应尽量避免全表扫描,首先应思考在 where 及 order by 波及的列上建设索引。

2. 应尽量避免在 where 子句中应用!= 或 <> 操作符,否则引擎将放弃应用索引而进行全表扫描。

3. 尽量应用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会升高查问和连贯的性能,并会减少存储开销。这是因为引擎在解决查问和连贯时会一一比拟字符串中每一个字符,而对于数字型而言只须要比拟一次就够了。

4. 任何中央都不要应用 select from t,用具体的字段列表代替“”,不要返回用不到的任何字段。

5. 防止频繁创立和删除长期表,以缩小零碎表资源的耗费。诸如此类,等等等等 ……

什么是线程死锁?死锁如何产生?如何防止线程死锁?

死锁的介绍:

线程死锁是指因为两个或者多个线程相互持有对方所须要的资源,导致这些线程处于期待状态,无奈返回执行。当线程进入对象的 synchronized 代码块时,便占有了资源,直到它退出该代码块或者调用 wait 办法,才开释资源,在此期间,其余线程将不能进入该代码块。当线程相互持有对方所须要的资源时,会相互期待对方开释资源,如果线程都不被动开释所占有的资源,将产生死锁。

死锁的产生的一些特定条件:

  1. 互斥条件:过程对于所调配到的资源具备排它性,即一个资源只能被一个过程占用,直到被该过程开释。
  2. 申请和放弃条件:一个过程因申请被占用资源而产生阻塞时,对已取得的资源放弃不放。
  3. 不剥夺条件:任何一个资源在没被该过程开释之前,任何其余过程都无奈对他剥夺占用。
  4. 循环期待条件:当产生死锁时,所期待的过程必定会造成一个环路(相似于死循环),造成永恒阻塞。

如何防止:

1. 加锁程序:当多个线程须要雷同的一些锁,然而依照不同的程序加锁,死锁就很容易产生。如果能确保所有的线程都是依照雷同的程序取得锁,那么死锁就不会产生。当然这种形式须要你当时晓得所有可能会用到的锁,然而总有些时候是无奈预知的。

2. 加锁时限:加上一个超时工夫,若一个线程没有在给定的时限内胜利取得所有须要的锁,则会进行回退并开释所有曾经取得的锁,而后期待一段随机的工夫再重试。然而如果有十分多的线程同一时间去竞争同一批资源,就算有超时和回退机制,还是可能会导致这些线程反复地尝试但却始终得不到锁。

3. 死锁检测:死锁检测即每当一个线程取得了锁,会在线程和锁相干的数据结构中(map、graph 等等)将其记下。除此之外,每当有线程申请锁,也须要记录在这个数据结构中。死锁检测是一个更好的死锁预防机制,它次要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。

spring 中 Bean 的作用域

1. singleton:Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个 Bean 援用它,始终指向同一对象。Singleton 作用域是 Spring 中的缺省作用域。

2. prototype:每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创立一个新的 Bean 实例,每个 Bean 实例都有本人的属性和状态,而 singleton 全局只有一个对象。

3. request:在一次 Http 申请中,容器会返回该 Bean 的同一实例。而对不同的 Http 申请则会产生新的 Bean,而且该 bean 仅在以后 Http Request 内无效。

4. session:在一次 Http Session 中,容器会返回该 Bean 的同一实例。而对不同的 Session 申请则会创立新的实例,该 bean 实例仅在以后 Session 内无效。

5. global Session:在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例,仅在应用 portlet context 时无效。

Spring 框架中都用到了哪些设计模式?

1. 代理模式:在 AOP 和 remoting 中被用的比拟多。

2. 单例模式:在 spring 配置文件中定义的 bean 默认为单例模式。

3. 模板办法模式:用来解决代码反复的问题。

4. 前端控制器模式:Spring 提供了 DispatcherServlet 来对申请进行散发。

5. 依赖注入模式:贯通于 BeanFactory / ApplicationContext 接口的核心理念。

6. 工厂模式:BeanFactory 用来创建对象的实例。

springmvc 的外围是什么,申请的流程是怎么解决的,管制反转怎么实现的

外围:管制反转和面向切面

申请解决流程:

  1. 首先用户发送申请到前端控制器,前端控制器依据申请信息(如 URL)来决定抉择哪一个页面控制器进行解决并把申请委托给它,即以前的控制器的管制逻辑局部;
  2. 页面控制器接收到申请后,进行性能解决,首先须要收集和绑定申请参数到一个对象,并进行验证,而后将命令对象委托给业务对象进行解决;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);
  3. 前端控制器发出控制权,而后依据返回的逻辑视图名,抉择相应的视图进行渲染,并把模型数据传入以便视图渲染;
  4. 前端控制器再次发出控制权,将响应返回给用户。

管制反转如何实现:

  • 咱们每次应用 spring 框架都要配置 xml 文件,这个 xml 配置了 bean 的 id 和 class。
  • spring 中默认的 bean 为单实例模式,通过 bean 的 class 援用反射机制能够创立这个实例。
  • 因而,spring 框架通过反射替咱们创立好了实例并且替咱们保护他们。
  • A 须要援用 B 类,spring 框架就会通过 xml 把 B 实例的援用传给了 A 的成员变量。

BAT 大厂 Java 高级面试题常见 30 问

  1. Spring DAO 中最罕用的类是什么?
  2. 如何在 Spring 利用中应用 SLF4J?
  3. Spring bean 的默认作用范畴是?
  4. 应用 @Required 但不关联 bean 来注解 setter 办法,将会产生?
  5. 已知一棵二叉树前序遍历和中序遍历别离为 ABDEGCFH 和 DBGEACHF,则该二叉树的后序遍历为?
  6. volatile 关键字是否能保障线程平安?
  7. Java 能不能不通过构造函数创建对象?
  8. Java 程序的并发机制是?
  9. 办法 resume()负责复原哪些线程的执行?
  10. 什么是 LinkedHashSet?
  11. 什么是可变参数?
  12. 断言的用处?
  13. 什么时候应用断言?
  14. 什么是垃圾回收?
  15. 用一个例子解释垃圾回收?
  16. 什么时候运行垃圾回收?
  17. 垃圾回收的最佳做法?
  18. 什么是初始化数据块?
  19. 什么是动态初始化器?
  20. 什么是实例初始化块?
  21. 什么是正则表达式?
  22. 什么是令牌化?
  23. 给出令牌化的例子?
  24. 如何应用扫描器类(Scanner Class)令牌化?
  25. 如何增加小时 (hour) 到一个日期对象(Date Objects)?
  26. 如何格式化日期对象?
  27. Java 中日历类(Calendar Class)的用处?
  28. 如何在 Java 中获取日历类的实例?
  29. 解释一些日历类中的重要办法?
  30. 数字格式化类(Number Format Class)的用处?

读者福利

因为篇幅无限,局部答案就不做全副展现了,这些面试题的答案我曾经整顿成 PDF 文档了,同时也整顿了一些问题详解;尽管说花了一点工夫,然而我也违心把它收费分享进去,心愿可能帮忙到有须要的 Java 工程师敌人,也省的大家再去网上花工夫找材料。

须要我整顿的字节跳动面试题目 + 答案、以及 BAT 大厂 Java 高级面试题的:

须要获取材料文档的敌人 能够关注+转发后点击这里收费支付

更多笔记分享

退出移动版