字节跳动Java研发面试99题(含答案):JVM+Spring+MySQL+线程池+锁

JVM的内存结构

根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。前端

1. Java虚拟机栈:线程私有;每一个方法在执行的时候会建立一个栈帧,存储了局部变量表,操做数栈,动态链接,方法返回地址等;每一个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。面试

2. 堆:线程共享;被全部线程共享的一块内存区域,在虚拟机启动时建立,用于存放对象实例。正则表达式

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

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

5. 本地方法栈:线程私有;主要为虚拟机使用到的Native方法服务。安全

为何要用线程池

那先要明白什么是线程池session

线程池是指在初始化一个多线程应用程序过程当中建立一个线程集合,而后在须要执行新的任务时重用这些线程而不是新建一个线程。数据结构

使用线程池的好处多线程

  1. 线程池改进了一个应用程序的响应时间。因为线程池中的线程已经准备好且等待被分配任务,应用程序能够直接拿来使用而不用新建一个线程。
  2. 线程池节省了CLR 为每一个短生存周期任务建立一个完整的线程的开销并能够在任务完成后回收资源。
  3. 线程池根据当前在系统中运行的进程来优化线程时间片。
  4. 线程池容许咱们开启多个任务而不用为每一个线程设置属性。
  5. 线程池容许咱们为正在执行的任务的程序参数传递一个包含状态信息的对象引用。
  6. 线程池能够用来解决处理一个特定请求最大线程数量限制问题。

MySQL优化经验

  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工程师朋友,也省的你们再去网上花时间找资料。

领取方式,公众号后台回复【面试】,便可免费领取

相关文章
相关标签/搜索