每个活动连接独占30–60MB JVM堆空间,含连接池、结果集缓存、语法树等;10个闲置连接即占500MB+且不被JVM及时回收,多标签页共享连接更导致内存叠加驻留,需右键断开连接而非仅关标签页。

为什么多个连接会推高Navicat内存占用
每个活动连接在Navicat中不是轻量级句柄,而是独占约30–60MB JVM堆空间——含连接池、结果集缓存、语法树解析器、元数据快照。10个闲置连接就能稳占500MB+,且JVM不会主动回收这些“看似空闲”的资源。更关键的是,多个标签页若共享同一连接(比如都连着prod_mysql),它们的结果缓存和编辑状态会叠加驻留,不是线性增长,而是指数级争抢。
关闭未使用的连接比关标签页更重要
右键连接 →「断开连接」才是真释放;只关查询标签页或表设计页,连接本身仍在后台维持心跳、缓存、游标。尤其Oracle TNS连接,“断开”后建议等10秒再重连,否则可能残留未清理的会话上下文。
- 检查当前活跃连接:任务管理器中观察
navicat.exe的“工作集”内存是否随打开/关闭连接明显波动 - 批量断开:按住
Ctrl多选左侧连接列表 → 右键 →「断开所有连接」 - 禁用自动重连:工具→ 选项 → 常规 → 取消勾选「连接丢失时自动重连」,避免网络抖动触发反复建连+缓存堆积
限制最大并发连接数要设在连接级别而非全局
很多人去改Navicat.ini里的-Xmx,但真正有效的是在每个连接的「高级」设置里压上限。MySQL和PostgreSQL默认允许100并发连接,Navicat会按需拉满,而日常开发8个足够。
- 路径:右键某个连接 →「编辑连接」→「高级」选项卡 → 勾选「使用连接池」→ 设置「最大连接数」为
8、「最小连接数」为1 - 别忽略「连接超时」:设为
30秒(默认常是0,即永不超时),防止异常连接长期占坑 - Oracle用户注意:
Connection Pooling在Oracle连接中默认关闭,必须手动开启才生效
容易被忽略的跨连接内存污染点
即使你只打开1个连接,只要之前用过其他连接执行过大型同步或ER图生成,其元数据缓存、临时AST对象、未释放的INFORMATION_SCHEMA查询结果仍驻留在进程内——Navicat不按连接隔离内存,而是整个进程共享一个JVM堆。
- 清缓存不靠重启:右键任意连接 →「复制连接」→ 删除原连接 → 把副本重命名为原名,这会强制重建连接上下文并丢弃旧缓存
- 禁用全局功能:工具→ 选项 → 编辑器 → 关闭「启用代码自动完成」,它会在首次连接时预加载全部库表元数据,多个连接叠加后极易突破200MB
- 历史记录按连接独立存储:工具→ 选项 → 环境 → 历史记录 → 把「最大历史记录数」设为
100,否则每个连接都在本地存1000条SQL+执行摘要,累积几GB也不奇怪
test_db的窗口,但它参与过的数据传输任务残留的Fetch Size配置、上次同步用的临时表映射关系,仍会影响prod_db的查询渲染行为。这种非显式依赖,往往要靠“复制连接”操作才能彻底剥离。


















