字节跳动前段时间听很多朋友分享自己最近不好但是对自己的职业很有帮助的面试经历,在这里分享给大家,说说:字节跳动头条有三个技术方面,然后是HR面试,面试格式是视频,感觉很棒。时间控制在1小时。第一面:第一面主要考察基础知识。首先是简单的自我介绍和项目介绍,然后开始考察基础。以下是字节跳动调查:JVM+Spring+MySQL+线程池+锁题目,鼓励大家~JVM内存结构根据JVM规范,JVM内存分为虚拟机栈、堆、方法区五部分、程序计数器和本地方法堆栈。1、Java虚拟机栈:threadprivate;每个方法在执行时都会创建一个栈帧,存放局部变量表、操作数栈、动态连接、方法返回地址等;每个方法从调用到执行,对应虚拟机栈中一个栈帧的入栈和出栈。2.堆:由线程共享;所有线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例。3、方法区:线程共享;所有线程共享的内存区域;用于存放已经被虚拟机加载的类信息、常量、静态变量等。4.程序计数器:线程私有;它是当前线程执行的字节码的行号指示符。每个线程必须有一个独立的程序计数器。这种类型的内存也称为“线程专用”内存。5、native方法栈:threadprivate;主要服务于虚拟机使用的Native方法。为什么要使用线程池?首先了解什么是线程池。线程池是指在多线程应用程序的初始化过程中创建线程集合,然后在需要执行新任务时重新使用这些线程而不是创建新线程。使用线程池的好处线程池可以缩短应用程序的响应时间。由于线程池中的线程已经准备好等待分配任务,应用程序可以直接使用它们而无需创建新线程。线程池为CLR节省了为每个短期任务创建完整线程的开销,并且可以在任务完成后回收资源。线程池根据系统当前运行的进程优化线程时间片。线程池允许我们启动多个任务而无需为每个线程设置属性。线程池允许我们传递一个对象引用,其中包含正在执行的任务的程序参数的状态信息。线程池可以用来解决限制处理特定请求的最大线程数的问题。Msyql优化经验1、优化查询,应该尽量避免全表扫描。首先,您应该考虑在where和orderby涉及的列上建立索引。2、尽量避免在where子句中使用!=或<>运算符,否则引擎会放弃使用索引而进行全表扫描。3.尽量使用数字字段。尽量不要将只包含数字信息的字段设计为字符类型。这将降低查询和连接性能并增加存储开销。这是因为引擎在处理查询和连接时,会把字符串中的每个字符一个一个地进行比较,但是对于数字类型,只需要一个比较就可以了。4、不要在任何地方使用selectfromt,将""替换为特定的字段列表,不返回任何没有使用的字段。5、避免频繁创建和删除临时表,减少系统表资源的消耗。blahblahblahblah...什么是线程死锁?死锁是如何产生的?如何避免线程死锁?死锁介绍:线程死锁是指两个或多个线程持有彼此需要的资源,导致这些线程处于等待状态,无法执行。当线程进入对象的synchronized代码块时,会占用资源,直到退出代码块或调用wait方法后才释放资源。在此期间,其他线程将无法进入代码块。当线程持有彼此需要的资源后,就会互相等待对方释放资源。如果线程不主动释放自己占用的资源,就会发生死锁。产生死锁的一些具体条件:互斥条件:进程对分配的资源具有排他性,即一个资源只能被一个进程占用,直到被进程释放。请求和持有条件:当一个进程因为请求资源被占用而阻塞时,它会持有它已经获得的资源。非剥夺条件:任何资源在被进程释放之前不能被任何其他进程剥夺。循环等待条件:当死锁发生时,等待的过程必须形成一个循环(类似于死循环),导致永久阻塞。如何避免:1.加锁顺序:当多个线程需要同样的锁,但加锁顺序不同时,很容易发生死锁。如果能保证所有线程以相同的顺序获取锁,那么就不会发生死锁。当然,这种方法需要你事先知道所有可能用到的锁,但有时又是不可预知的。2.加锁时限:增加一个超时时间,如果一个线程在给定的时限内没有成功获取到所有需要的锁,它会回滚并释放所有已经获取到的锁,然后等待一段随机时间重新启动尝试之前的时间。但是如果同时有很多线程在竞争同一批次的资源,即使有超时和回滚机制,仍然可能会导致这些线程反复尝试却始终无法获得锁。3、死锁检测:死锁检测是指每当线程获取到锁时,都会在线程和锁相关的数据结构(map、graph等)中记录下来。另外,每当一个线程请求锁的时候,也需要记录在这个数据结构中。死锁检测是一种更好的死锁预防机制。主要针对那些无法实现顺序锁,锁超时不可行的场景。spring中Bean的范围1.单例:SpringIoC容器中只会有一个共享的Bean实例,无论有多少个Bean引用它,它总是指向同一个对象。单例作用域是Spring中的默认作用域。2.prototype:每次通过Spring容器获取prototype定义的bean,容器都会创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,单例全局只有一个对象。3.request:在一个Http请求中,容器会返回同一个Bean实例。不同的Http请求会生成一个新的bean,这个bean只在当前的HttpRequest内有效。4.session:在一个HttpSession中,容器会返回相同的bean实例。不同的Session请求都会创建一个新的实例,这个bean实例只在当前Session内有效。5.GlobalSession:在一个全局的HttpSession中,容器会返回相同的Bean实例,只有在使用portletcontext时才有效。Spring框架中使用了哪些设计模式?1.代理模式:在AOP和remoting中使用较多。2、单例模式:spring配置文件中定义的bean默认为单例模式。3、模板方法模式:用于解决代码重复问题。4、前端控制器模式:Spring提供了DispatcherServlet来分发请求。5.依赖注入模式:贯穿于BeanFactory/ApplicationContext接口的核心概念。6.工厂模式:BeanFactory用于创建对象的实例。springmvc的核心是什么,请求过程是如何处理的,控制反转是如何实现的?)决定选择哪个页面控制器进行处理,并将请求委托给它,即前一个控制器的控制逻辑部分;页面控制器收到请求后,进行功能处理。首先需要将请求参数收集并绑定到一个对象上,并进行校验,然后将命令对象委托给业务对象处理;处理后返回一个ModelAndView(模型数据和逻辑视图名);前端控制器收回控制权,然后根据返回的选择相应的逻辑视图名称进行视图渲染,并传入模型数据供视图渲染;前端控制器再次收回控制权并将响应返回给用户。如何实现控制反转:我们每次使用spring框架,都需要配置xml文件,其中配置了bean的id和class。spring中默认的bean是单实例模式,可以通过bean类引用反射机制来创建这个实例。所以spring框架通过反射为我们创建实例,并为我们维护。A需要引用B类,spring框架会将B实例的引用通过xml传递给A的成员变量。BAT大厂Java高级面试题常见30题SpringDAO中最常用的类是什么?如何在Spring应用中使用SLF4J?Springbean的默认作用域是什么?用@Required注解setter方法而不是关联bean,会发生吗?鉴于一棵二叉树的前序遍历和中序遍历分别是ABDEGCFH和DBGEACHF,那么二叉树的后序遍历是什么?volatile关键字能保证线程安全吗?Java可以创建没有构造函数的对象吗?Java程序的并发机制是什么?resume()方法负责恢复哪些线程的执行?什么是链接哈希集?什么是可变参数?断言有什么用?什么时候使用断言?什么是垃圾收集?用例子解释垃圾收集?垃圾回收什么时候运行?垃圾收集的最佳实践?什么是初始化数据块?什么是静态初始化器?什么是实例初始化块?什么是正则表达式?什么是代币化?举个代币化的例子?如何使用扫描仪类(ScannerClass)标记化?如何将小时(小时)添加到日期对象(DateObjects)?如何格式化日期对象?Java中日历类的用途是什么?如何在Java中获取日历类的实例?解释一下Calendar类中的一些重要方法?数字格式类的目的是什么?读者受益由于篇幅有限,部分答案不会全部展示。我把这些面试题的答案整理成了PDF文档,也整理了一些对问题的详细解释;虽然花费了一点时间,但我愿意把它免费分享出来,希望能帮助到有需要的Java工程师朋友,省去大家花时间上网找资料的时间。需要我整理的字节跳动面试题+答案,以及BAT大厂Java高级面试题的:需要获取资料文档的朋友可以关注+转发点此领取更多免费笔记分享
