JUC(java.util.concurrent)提供原子类、锁/Condition、线程池、阻塞队列、并发容器及同步器等工具,支撑高效并发。AQS 是构建锁、Semaphore、读写锁等同步组件的骨架,管理状态、等待队列和线程阻塞/唤醒。LongAdder 通过分段计数单元降低 CAS 冲突,适用于高并发计数。ThreadLocal 为每个线程提供独立的变量存储,内部采用 ThreadLocalMap 并用线性探测处理哈希冲突。线程池通过复用线程提升性能,包含核心/最大线程数、任务队列、五种状态(RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED)及四种拒绝策略,并根据 CPU/IO 密集度调节队列大小和线程数。

JVM(Java Virtual Machine)是执行Java程序的虚拟计算机系统,其核心组成部分包括类加载器(ClassLoader)、运行时数据区(Runtime Data Area,包含堆、栈、方法区等)、执行引擎(Execution Engine)和本地接口(Native Interface)。 JVM运行Java程序的过程是:首先,类加载器将编译后的.class字节码文件加载到运行时数据区;然后,执行引擎将字节码翻译成操作系统指令执行,过程中可能调用本地接口提供的功能。 JVM的启动过程包括装入环境和配置、装载JVM、初始化JVM以及运行Java程序(jar包或class文件)。Java程序的运行依赖于程序计数器、虚拟机栈、本地方法栈、Java堆和方法区等内存区域,这些区域在不同的阶段负责存储不同的数据。 理解JVM的内存分布和类加载过程对于优化Java程序性能和解决内存问题至关重要。 Java代码的编译过程包括准备、注解处理和字节码生成等阶段。

JVM在垃圾回收(GC)中,当Eden区满时触发Minor GC,老年代不足时触发Full GC。减少Full GC次数的方法包括增加各区域空间、禁止System.gc()、使用标记-整理算法和排查大对象。 对象可回收性判断主要有两种算法:引用计数算法(已较少使用,难以解决循环引用问题)和可达性分析算法(主流方法,通过GC Roots追踪对象是否可达)。 对象晋升老年代需要经历年龄计数,达到阈值(默认15)后会被晋升。老年代不适合标记-复制算法,因为它在对象存活率高时效率低。新生代分为Eden和Survivor,比例通常为8:1,利用“Appel式回收”优化内存使用,减少碎片化。 GC算法包括标记-清除(效率不稳定,产生碎片)、标记-复制(效率高,但浪费空间)、标记-整理(减少碎片,但效率较低)。不同区域采用不同算法以兼顾效率和空间利用率。G1和CMS是两种重要的垃圾收集器,各有优缺点。 内存泄漏是指未及时回收的内存占用,而内存溢出则是申请内存超出系统限制。解决内存泄漏需避免长生命周期对象持有短生命周期对象的引用,解决内存溢出则需分析原因并调整JVM参数或优化代码。

SQL是用于管理和操作数据库的标准化语言。文章涵盖了SQL的分页查询,包括使用`LIMIT`子句及其优化方法,例如利用索引覆盖扫描和延迟关联以提升大偏移量查询的效率,以及使用书签记录位置避免OFFSET带来的性能问题。 此外,文章还介绍了SQL中的聚合函数(`COUNT`、`AVG`、`SUM`、`MAX`、`MIN`)及其与`GROUP BY`的结合使用。表与表之间的关联方式,包括内连接、外连接(左外连接、右外连接)以及等值连接,以及一对多、多对多和自关联等关系也被讨论。 文章还深入探讨了外连接的原理和应用,以及行转列的两种实现方法(`CASE...WHEN...THEN`和`IF()`函数)。最后,文章强调了SQL注入的原理、危害以及通过严格的参数校验和SQL预编译来防御SQL注入攻击的重要性,以及表间数据更新和`WHERE`与`HAVING`子句的区别。

事务是原子、一致、隔离、持久的操作单元,遵循ACID特性。常见类型包括扁平事务、带保存点的事务、链事务、嵌套事务和分布式事务。InnoDB 通过 undo/redo 日志、Buffer Pool、行锁、Next‑Key 锁和 MVCC 实现 ACID,其中默认隔离级别为 REPEATABLE READ,能够防止脏读、不可重复读和幻读。MySQL 不原生支持嵌套事务,可用保存点模拟;回滚使用 ROLLBACK 或 ROLLBACK TO SAVEPOINT。