Skip to content

feat(perf): cap Java agent heap and large result memory across all db…#2253

Open
lzero07 wants to merge 1 commit into
t8y2:mainfrom
lzero07:feat/memory-backstop
Open

feat(perf): cap Java agent heap and large result memory across all db…#2253
lzero07 wants to merge 1 commit into
t8y2:mainfrom
lzero07:feat/memory-backstop

Conversation

@lzero07

@lzero07 lzero07 commented Jun 30, 2026

Copy link
Copy Markdown

针对实际反馈(单个 DBX 会话 java agent 约 4.5GB、WebView 约 4.6GB)做最坏情况内存兜底,覆盖所有数据库类型(原生 + agent/JDBC),不依赖用户手动配置环境变量。

第一层 — Java agent 堆上限(所有 JDBC/agent 库):

  • agent_java_args 启动时强制注入 -Xmx(默认 512m),非法值回退默认
  • JavaRuntimeConfig.max_heap 可配置,DriverStoreDialog 新增「最大堆内存」输入框,保存即 stop_daemons 重启 JVM
  • native/Go agent(oracle-go、xugu)走旁路,不受影响

第二层 — 后端结果集硬上限(所有类型):

  • enforce_result_limits 在 do_execute 全类型汇合点:行数 + 字节(64MB)双截断,防大 BLOB 行
  • resolve_query_timeout 禁止 Some(0)(原为无限挂起),封顶 3600s
  • data_compare:20 万行预检 + 50 万行 fetch 上限,启用预留的 source_truncated/target_truncated
  • 导出 MAX_EXPORT_ROWS=100万 后端硬上限

第三层 — 前端大数据量兜底:

  • 结果缓存按 300MB 字节预算 + tab 数双上限淘汰(原只数 tab)
  • 大结果(50MB/10万行)主动 toast 告警
  • page size 硬顶 10万→5万,导出默认开 row limit(10万)
  • QueryChart 加 5000 点采样

@lzero07
lzero07 force-pushed the feat/memory-backstop branch from 6d7de43 to 67c903d Compare June 30, 2026 15:36
针对实际反馈(单个 DBX 会话 java agent 约 4.5GB、WebView 约 4.6GB)做最坏情况内存兜底,覆盖所有数据库类型(原生 + agent/JDBC),不依赖用户手动配置环境变量。

第一层 — Java agent 堆上限(所有 JDBC/agent 库):
- agent_java_args 启动时强制注入 -Xmx(默认 512m),非法值回退默认
- JavaRuntimeConfig.max_heap 可配置,DriverStoreDialog 新增「最大堆内存」输入框,保存即 stop_daemons 重启 JVM
- native/Go agent(oracle-go、xugu)走旁路,不受影响

第二层 — 后端结果集硬上限(所有类型):
- enforce_result_limits 在 do_execute 全类型汇合点:行数 + 字节(64MB)双截断,防大 BLOB 行
- resolve_query_timeout 禁止 Some(0)(原为无限挂起),封顶 3600s
- data_compare:20 万行预检 + 50 万行 fetch 上限,启用预留的 source_truncated/target_truncated
- 导出 MAX_EXPORT_ROWS=100万 后端硬上限

第三层 — 前端大数据量兜底:
- 结果缓存按 300MB 字节预算 + tab 数双上限淘汰(原只数 tab)
- 大结果(50MB/10万行)主动 toast 告警
- page size 硬顶 10万→5万,导出默认开 row limit(10万)
- QueryChart 加 5000 点采样

同步更新受新默认值影响的测试;附带修复 3 个预存的 Windows/locale 测试失败(startup_error #[cfg(unix)]、manifest 路径、ai.spec locale mock)。
@lzero07
lzero07 force-pushed the feat/memory-backstop branch from 67c903d to 5ddd02b Compare June 30, 2026 16:33
@t8y2

t8y2 commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Thanks for the detailed PR! This touches a lot of core areas (agent JVM, result limits, frontend memory). I'll need some time to review it carefully before merging. Will get back to you soon.

@onceMisery

onceMisery commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

我认为是个不错的思路,有几个点探讨下:

  1. 512m 默认值偏保守,如果是重型数据库DM、Kingbase 会导致直接OOM,应该分档设置吧。
  2. 重启策略过于粗暴, oracle-go、xugu 等 native agent 也会被杀掉并重建
  3. 64MB 字节截断实现难度比想象大,Rust 侧的 query result 是逐步构建的,你需要在序列化或累积过程中做 running byte count
  4. 导出 100万行应该需要区分格式,XLSX100万行可能导致内存飙升到数GB,应该还需要加上内存缓冲区的限制
  5. QueryChart 5000 点采样的算法是什么?
    可以先走个PIP 流程 ,给出你详细的设计方案

@t8y2 t8y2 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

内存保护方向没问题,但目前有三个阻塞问题。

  1. 64MB 限制是在 Agent 已经读取并推进 ResultSet 游标后才由 Rust 裁剪的。比如一页请求 1000 行、每行约 100KB,Agent 会消费完整 1000 行,Rust 只返回约 640 行,但下一页会从第 1001 行继续,页尾约 360 行被永久跳过。这个问题也会让 Agent 流式导出的 CSV/XLSX 静默缺行。字节预算需要在 Agent 的逐行读取过程中执行,或者协议必须提供可恢复的 continuation,不能在游标推进后删除行。

  2. enforce_result_limits() 在完整 QueryResult 构建、Agent JSON 序列化和 Rust 反序列化之后才运行,因此无法限制峰值内存。超大 BLOB/TEXT 页仍可能先占用数百 MB,甚至让默认 512MB JVM 在返回结果前 OOM。建议参考现有 fetch size/max rows 机制,把字节/行限制下推到驱动读取或流式序列化过程,而不是返回后裁剪。

  3. validate_max_heap() 只校验“数字 + 单位”,会接受 0m1k 等 JVM 无法启动的值。保存后又立即停止所有 daemon,用户会失去所有 Java Agent 连接。我本机验证 java -Xmx0m -versionjava -Xmx1k -version 都直接启动失败。请解析并限制合理范围,最好先用当前 Java 验证参数可启动,再持久化并重启 Agent。

请补充大单元格游标分页、截断后的下一页、Agent 导出行完整性,以及最小/无效 JVM heap 参数的回归测试。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants