首批通过分布式安全可靠测评,为关键业务系统打造
ARM 平台下使用 HMS Catalog 创建外部表导致 OBServer 进程退出
更新时间:2026-07-07 12:56
问题现象
在 ARM 平台下,使用 HMS Catalog 创建外部表后,执行查询操作会导致 OBServer 进程退出。
进程退出前,日志中可能打印如下错误信息:
Error occurred during initialization of VM
java.lang.StackOverflowError
at java.util.HashMap.(java.base/HashMap.java:280)
at java.util.HashSet.(java.base/HashSet.java:106)
at java.lang.ClassLoader.(java.base/ClassLoader.java:2730)
at java.security.AccessController.doPrivileged(java.base/Native Method)
at java.lang.reflect.AccessibleObject.(java.base/AccessibleObject.java:499)
进程退出后,通过系统命令(如 ps)检查,确认 OBServer 进程已不存在。
关键信息
- OBServer 进程可能生成 core 文件,也可能不生成,这取决于操作系统的相关配置。
- 进程退出前,日志中会打印
Error occurred during initialization of VM和java.lang.StackOverflowError错误。 - 错误堆栈通常指向 Java 基础类库(如
HashMap、HashSet、ClassLoader)的初始化过程。
问题原因
在 ARM 平台下,默认的栈空间设置(stack_size)为 320 KB。此空间对于启动和执行 JVM 调用(例如 HMS Catalog 相关操作)而言过小。JVM 在初始化时认为分配的栈空间不足,导致 OBServer 进程因栈溢出(StackOverflowError)而退出。
问题的风险及影响
OBServer 进程退出,导致数据库服务中断。
适用版本
OceanBase 数据库 V4.x 版本。
解决方法
登录到数据库,执行以下 SQL 命令,将
stack_size参数修改为1M:ALTER SYSTEM SET stack_size = '1M';重启 OBServer 进程,使配置生效。
规避方式
在 ARM 平台的 OceanBase 数据库部署或初始化阶段,建议预先将 stack_size 参数设置为 1M 或更大值,以避免在执行涉及 JVM 调用的操作(如使用 HMS Catalog)时发生进程退出。