一、问题抽象

问题并非 OOM,而是:

  • JVM 堆未限制

  • MySQL Buffer Pool 偏大

  • 插件引入常驻内存结构

  • swap 参与度过低

这是一个典型的“资源边界缺失”问题


二、内存结构分析(2GB)

组件

默认行为

问题

JVM

自适应堆

吃满系统

MySQL

中等配置

与 JVM 竞争

插件

常驻监听

累积内存

swap

默认策略

过早抖动


三、关键设计决策

1. JVM 必须硬限制

-Xmx256m

这是唯一能确保 Java 不突破系统边界 的手段。


2. 插件即“长期驻留对象”

搜索、互动、AI 类插件,本质是:

  • 索引

  • 监听器

  • 任务调度

在小内存环境中,应视为高风险组件


3. swap 是兜底,不是扩容

通过:

vm.swappiness=10

让 swap 成为“最后保险”,而非日常资源。


四、稳定态验证

稳定态特征:

  • available >30%

  • swap 使用量 <5%

  • Java RSS <400MB

  • GC 不出现 Full GC 风暴


五、工程结论

小内存服务器不是性能问题,
是资源治理问题。

只要边界清晰,
Halo + Spring Boot 完全可以长期稳定运行。