BAT面试必备:Java多线程、JVM、Spring深度解析

需积分: 9 0 下载量 118 浏览量 更新于2024-08-05 收藏 133KB MD 举报
"这是一份全面的BAT(百度、阿里巴巴、腾讯)面试题汇总,涵盖了Java多线程、JVM、Java扩展、Spring框架以及中间件等多个方面的知识点,旨在帮助求职者准备大厂面试。" ### 一、Java多线程 1. **线程池的原理**:线程池通过预创建线程来减少频繁创建和销毁线程的开销,提高系统性能。创建线程池的方式包括使用`Executors`提供的工厂方法,如`newFixedThreadPool`、`newCachedThreadPool`等。 2. **线程生命周期**:线程经历新建、就绪、运行、阻塞和死亡五个阶段。僵死进程是指已结束但其父进程未回收其资源的线程。 3. **线程安全**:当多个线程访问共享数据时,如果不正确处理可能导致数据不一致。实现线程安全可以通过同步机制(`synchronized`)、锁(`Lock`)、原子变量(`Atomic`类)等。 4. **线程池核心参数**:包括核心线程数、最大线程数、线程存活时间、工作队列容量等。合理配置线程池大小应考虑系统资源和任务特性。 5. **volatile、ThreadLocal**:volatile确保变量在多线程环境中的可见性,ThreadLocal为每个线程提供独立的变量副本,避免线程间的数据干扰。 6. **ThreadLocal OOM**:当线程池中的线程长期存在且每个线程持有大量ThreadLocal变量时,可能导致内存溢出。 ### 二、JVM相关 1. **JVM内存模型**:包括堆、方法区、栈、本地方法栈和程序计数器。**GC**(Garbage Collection)是自动回收不再使用的内存空间的过程。 2. **GC类型与算法**:分为Minor GC和Full GC,Full GC通常在堆内存不足、方法区清理、System.gc()调用等情况触发,使用不同算法如复制、标记-清除、标记-整理等。 3. **ClassLoader**:JVM中有Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader,以及用户自定义类加载器。 4. **双亲委派机制**:类加载请求先向上委托给父类加载器,只有父类无法加载时才尝试自己加载,防止类重复加载和安全问题。 5. **破坏双亲委派**:自定义类加载器或使用`Class.forName()`指定加载路径可打破此机制。 6. **JVM调优**:调整JVM内存分配、设置垃圾回收器、优化代码、监控工具等,具体参数如-Xms、-Xmx、-XX:NewRatio等。 ### 三、Java扩展篇 1. **红黑树**:一种自平衡的二叉查找树,应用于`HashMap`和`TreeSet`等数据结构中,保证插入、删除和查找操作的时间复杂度近似O(logn)。 2. **NIO**(Non-blocking Input/Output):提供了一种基于通道和缓冲区的I/O方式,适用于高并发、低延迟的场景。 3. **Java9改进**:模块化系统、JShell(REPL)命令行工具、HTTP客户端API等。 4. **HashMap**:使用数组+链表实现,JDK 8引入红黑树减少冲突。`ConcurrentHashMap`、`HashTable`等各有其并发控制策略。 5. **反射**:运行时获取类信息并动态操作对象,用于插件、序列化等,虽然性能较低,但在某些场景下必不可少。 6. **自定义注解**:自定义元数据,可用于编译时检查、运行时处理等,通过`@Retention`和`@Target`控制注解生命周期和应用范围。 7. **List和Map**:List是有序的元素集合,Map是键值对的集合。`ArrayList`与`LinkedList`的区别在于查找和插入操作效率,`ArrayList`与`Vector`的区别在于线程安全。 ### 四、Spring相关 1. **Spring AOP**:面向切面编程,实现横切关注点的分离,常用于日志、事务管理等,基于动态代理实现。 2. **Spring Bean作用域**:单例、原型、请求、会话、全局会话,生命周期包括初始化、活跃、销毁。 3. **Spring Boot改进**:简化Spring应用的启动和配置,自动配置、起步依赖、内嵌容器等。Spring5与Spring4的改进涉及响应式编程、WebSocket支持、错误处理等。 4. **自定义SpringBoot Starter**:定义`autoconfigure`模块配置自动配置类,`starter`模块包含依赖信息。 5. **Spring IOC**:控制反转,将对象的创建和管理交给Spring容器,提高了组件间的解耦。 6. **Spring相关原理**:包括依赖注入、动态代理、AOP、事务管理,隔离级别包括读已提交、可重复读、序列化等。 ### 五、中间件篇 1. **Dubbo调用链路**:涉及服务注册、发现、路由、负载均衡、调用、超时、重试、熔断等。 2. **Dubbo负载均衡**:随机、轮询、最少活跃调用数、一致性哈希等策略。 3. **其他中间件问题**:可能涵盖RabbitMQ、Kafka、Redis、Zookeeper、MyBatis等,涉及它们的使用场景、原理和最佳实践。 以上是面试题的主要知识点,掌握这些内容将有助于理解和解答面试中遇到的相关问题。