主要观点:讨论了在 Java 中解决 OutOfMemoryErrors 的多种方法,包括使用特定工具检测和优化内存使用,以及针对不同场景使用不同的技术来减少内存消耗和提高性能。
关键信息:
- 推荐使用 HeapHero 工具检测内存问题并优化资源使用。
- 介绍了多种减少内存使用的方式,如使用 ByteBuffer、Streams 处理数据、使用 Java 21 中的新 MemorySegment 接口、使用 Singleton 对象、在 Spring 应用中使用 Singleton 范围、使用更快更高效的集合替代、及时关闭对象等。
重要细节: - 使用 ByteBuffer 可直接分配内存减少 GC 压力,避免不必要的堆分配,如
ByteBuffer buffer = ByteBuffer.allocateDirect(1024)
。 - 使用 Streams 以块的形式处理数据,避免一次性将大文件读入内存,如分块读取文件并写入
ByteArrayOutputStream
。 - 在 Java 21 中可使用 Foreign Function and Memory (FFM) API 的
MemorySegment
进行内存分配,通过Arena
控制内存段生命周期,如try (Arena arena = Arena.ofConfined()) {...}
。 - 对于一些只需要单个实例的工具类可使用 Singleton 对象,如 JAXB 的
Unmarshallers
和Marshallers
。 - 在 Spring 应用中使用
@Scope("singleton")
创建单例 bean 供整个应用共享。 - 对于小集合可使用
Collections.singletonMap
和Collections.singletonList
,对于快速且内存高效的队列可使用ArrayDeque
替代LinkedList
,对于不需要修改的集合可使用Map.of()
和List.of()
创建不可变集合,对于缓存可使用WeakHashMap
。 - 及时关闭无用的对象,如网络套接字、I/O 流、数据库连接等,以减少资源占用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。