树码科技 | 技术博客

企业社招真题 Java 内存问题

2026/04/05
18
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序列化自带压缩。核心技巧:流式处理大文件、选择适配业务的算法、避免内存加载全量数据,兼顾速度与内存占用。