美团面试题集:Java虚拟机、JVM、并发编程与数据库深度解析

需积分: 5 0 下载量 53 浏览量 更新于2024-08-04 收藏 1.62MB PDF 举报
"该资源为程序员面试相关的PDF文档,涵盖了Java虚拟机内存模型、动态加载类、垃圾回收机制、字符串处理、数据结构、并发编程、数据库优化、Web通信及会话管理等多个Java和Web开发的核心知识点。" 以下是相关知识点的详细说明: 1. **Java虚拟机内存模型**: - Java内存模型分为堆内存、栈内存、方法区(在Java 8之后被元空间取代)、程序计数器和本地方法栈。内存溢出通常发生在堆内存,永久代(或元空间)过度使用也可能导致问题。 2. **动态加载类的框架**: - 常见的有Spring框架、OSGi、PicoContainer等,它们允许在运行时动态地发现和加载新的类和组件。 3. **动态代理**: - 主要有两种实现方式:JDK动态代理(基于接口的代理)和CGLIB动态代理(基于类的代理)。应用场景包括AOP(面向切面编程)、事务处理、日志记录等。 4. **栈溢出**: - 栈溢出是可能发生的,通常抛出`StackOverflowError`异常。JVM可以通过`-Xss`参数设置栈的大小。 5. **查看JVM状态和堆栈信息的命令**: - `jstat`用于收集JVM各种统计信息;`jmap`用于映射堆内存;`jstack`用于打印线程堆栈跟踪;`jinfo`提供配置信息;`jconsole`和`VisualVM`则是图形化工具。 6. **JVM垃圾回收机制**: - 包括Minor GC、Major GC和Full GC,通过不同的垃圾收集器(如Serial、Parallel、G1等)进行自动内存管理。 7. **类加载机制**: - 类加载由引导类加载器、扩展类加载器和应用程序类加载器完成,用户可以通过自定义类加载器实现特定的加载逻辑。`findClass`和`loadClass`都是类加载方法,但`loadClass`会先尝试父加载器。 8. **String、StringBuffer和StringBuilder**: - String是不可变对象,适合少量字符串操作;StringBuffer和StringBuilder可变,线程安全性和性能上有所不同,后者更适合单线程环境下大量字符串拼接。 9. **不可变类的实现**: - 通过私有构造函数、final字段、不提供修改方法等方式确保对象创建后无法修改。 10. **浅复制和深复制**: - 浅复制只复制对象本身,深复制还复制对象引用的对象。深复制可通过序列化和反序列化、拷贝构造函数或Cloneable接口实现。 11. **HashMap、HashTable、ConcurrentHashMap**: - HashMap非线程安全,效率高;HashTable线程安全,但效率低;ConcurrentHashMap是线程安全且高效的并发容器。 12. **CAS同步机制**: - CAS(Compare and Swap)是无锁算法,通过原子性地比较并更新内存值来实现同步。 13. **NIO原理**: - NIO(Non-blocking I/O)包含通道、缓冲区和选择器等组件,支持非阻塞I/O操作,提高系统并发性能。 14. **Java反射机制**: - 反射允许运行时访问、创建、修改类的属性和方法,广泛应用于插件、序列化、动态代理等场景。 15. **Spring加载Bean的流程**: - 从配置文件解析Bean定义,实例化Bean,依赖注入,然后初始化Bean。 16. **Java线程池**: - ExecutorService接口和ThreadPoolExecutor类用于创建线程池,构造参数包括核心线程数、最大线程数、线程存活时间(keepAliveTime)等。 17. **并发编程场景**: - 使用并发包中的Semaphore、ExecutorService、CountDownLatch、CyclicBarrier等工具类可以实现多接口调用和数据合并。 18. **CountDownLatch和CyclicBarrier**: - CountDownLatch用于等待多个任务完成,计数一次后不能重置;CyclicBarrier允许一组线程等待其他线程到达屏障点后继续执行,可重用。 19. **线程加锁方式**: - synchronized是内置锁,简单易用;Lock接口提供了更灵活的加锁机制,如ReentrantLock。 20. **volatile关键字**: - volatile确保多线程环境下变量的可见性和有序性,但不保证原子性。 21. **MySQL存储引擎**: - 包括InnoDB(事务支持)、MyISAM(快速查询)、Memory(数据存储在内存中)等。 22. **SQL优化**: - 着手点包括合理创建索引、避免全表扫描、减少JOIN操作、优化子查询等。最左前缀原则是指组合索引仅在查询条件匹配最左边列时有效。 23. **Spring MVC处理请求流程**: - 从DispatcherServlet接收请求,通过HandlerMapping找到处理器,调用HandlerAdapter处理,最后返回View给客户端。 24. **Spring事务管理**: - 可以通过编程式(手动管理事务)或声明式(基于注解或XML配置)方式实现。事务回滚通过异常触发,自定义异常需配置为回滚异常。 25. **脏读、幻读**: - 脏读是未提交的数据被其他事务读取;幻读是在范围查询中,事务看到的数据前后不一致。 26. **TCP四次挥手**: - 断开连接需要四次交互,TIME_WAIT至少设置两倍MSL(报文段最大生存时间)是为了确保旧数据在网络中消亡。 27. **GET和POST请求**: - GET用于获取资源,数据在URL中;POST用于提交数据,数据在请求体中。 28. **Cookie和Session**: - Cookie是客户端存储,用于跟踪用户状态;Session是服务器端存储,同样用于管理用户会话。 29. **开源中间件**: - 缓存如Redis、Memcached;消息中间件如RabbitMQ、Kafka;分布式框架如Dubbo、Spring Cloud等。