源本科技 | 码上会

企业社招真题 Java 内存问题

2026/04/05
4
0

内存泄漏与内存溢出的区别

内存泄漏和内存溢出是 Java 内存问题的两种核心场景,存在因果关系。内存溢出(OOM) 是程序运行时需要的内存超出了 JVM 分配的最大内存,导致无法分配新内存,程序直接崩溃。内存泄漏是程序中不再使用的对象,因为被意外持有引用,无法被 GC 回收,长期占用内存空间。少量泄漏会浪费资源,大量持续泄漏最终会耗尽内存,引发内存溢出。简单说:泄漏是无用对象占着内存不放,溢出是内存真的不够用了

内存泄漏的原因、定位及解决方法

内存泄漏最常见原因:静态集合 / 单例持有长生命周期引用、IO/ 连接未关闭、ThreadLocal 未调用 remove、缓存未设置过期策略、内部类持有外部类引用。定位工具:命令行用 jmap 导出堆快照,JVisualVM、MAT 分析对象引用链,Arthas 在线排查生产环境。解决方法:及时清空集合、用 try-with-resources 自动关闭资源、用完 ThreadLocal 手动清理、给缓存加过期机制、避免长生命周期持有短引用,从根源切断无效引用。

Java 程序性能优化实战技巧

Java 性能优化从代码、JVM、并发、IO 四大方向入手。代码层:减少临时对象创建、用 StringBuilder 拼接字符串、避免频繁反射 / 异常捕获。JVM 层:合理设置堆内存、元空间大小,选用 G1/ZGC 低延迟垃圾收集器。并发层:使用线程池复用线程、用无锁编程(CAS/volatile)、ThreadLocal 隔离数据。IO 层:用 NIO 替代 BIO、内存映射处理大文件。同时善用缓存、池化技术(连接池 / 线程池),避免重复计算,大幅提升程序运行效率。

高并发下数据库访问性能优化

高并发数据库优化核心是减少查询压力、提升查询速度。首先优化索引,为查询字段建合适索引,杜绝全表扫描。其次优化 SQL,避免 select *、减少子查询、使用批量操作。引入 Redis 做热点数据缓存,减轻数据库读压力。采用数据库连接池,避免频繁创建连接。架构层做读写分离、分库分表,分散请求压力。事务优化为短事务,减少锁持有时间,避免锁竞争。组合这些方案,能支撑高并发场景下数据库的稳定高效运行。

数据压缩和解压的高效实现

Java 实现高效压缩解压,优先选用高性能方案。原生 JDK 提供 GZIPInputStream/ZipInputStream,适合通用文本压缩,简单无依赖。高性能场景用Snappy、LZ4 算法,压缩速度极快,适合日志、网络传输。大文件处理用NIO 内存映射文件,避免将整个文件加载到内存。第三方工具如 Commons Compress 支持更多格式,Protobuf/JSON 序列化自带压缩。核心技巧:流式处理大文件、选择适配业务的算法、避免内存加载全量数据,兼顾速度与内存占用。