You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成Oracle连接池堆内存异常及相关技术问询

Spring Boot应用堆内存占用疑问

我们有两个Spring Boot应用,均连接Oracle数据库、包含9个实体,VM启动参数为-Xmx250M -Xms10M:

  • 采用自定义Hikari连接池配置的应用,启动后堆内存稳定在101MB
  • 采用Spring Data默认数据源配置的应用,堆内存约为58MB

自定义Hikari配置如下:

allowPoolSuspension.............false
autoCommit......................true
catalog.........................none
connectionInitSql...............none
connectionTestQuery............."SELECT 1 FROM DUAL"
connectionTimeout...............6000000
dataSource......................none
dataSourceClassName.............none
dataSourceJNDI..................none
driverClassName................."oracle.jdbc.OracleDriver"
healthCheckProperties...........{}
healthCheckRegistry.............none
idleTimeout.....................600000
initializationFailTimeout.......1
isolateInternalQueries..........false
jdbcUrl.........................jdbc:oracle:thin:@10.20.0.8:1521/BBB
leakDetectionThreshold..........0
maxLifetime.....................0
maximumPoolSize.................30
metricRegistry..................none
metricsTrackerFactory...........none
minimumIdle.....................5
readOnly........................false
registerMbeans..................false
scheduledExecutor...............none
schema..........................none
threadFactory...................internal
transactionIsolation............default
validationTimeout...............5000

疑问点

  1. 同类Spring Boot应用的正常堆内存占用水平是多少?
  2. 内嵌Tomcat的Spring Boot应用是否比部署在外部Tomcat的同类应用占用更多堆内存?

问题解答

1. 同类Spring Boot应用的正常堆内存占用水平

Spring Boot应用的堆内存没有绝对的“标准值”,但针对这类包含9个实体、连接Oracle的简单应用:

  • 采用默认配置(含默认Hikari池,默认maximumPoolSize=10)的情况下,启动后堆内存通常在50-80MB区间,和你提到的58MB情况吻合。
  • 自定义Hikari配置后内存涨到101MB,核心原因是maximumPoolSize=30+minimumIdle=5:Oracle JDBC连接本身比较重,每个连接会占用几MB内存,30个最大连接数比默认10个多占用不少堆空间;另外connectionTestQuery="SELECT 1 FROM DUAL"会额外生成查询相关对象,而默认Hikari针对Oracle会自动适配,无需指定该参数。
    如果把maximumPoolSize调回默认的10,同时移除connectionTestQuery,内存占用应该会接近默认配置的水平。

2. 内嵌Tomcat vs 外部Tomcat的堆内存对比

内嵌Tomcat的Spring Boot应用不一定比外部Tomcat的同类应用占用更多堆内存,核心取决于配置:

  • 基础开销对比:内嵌Tomcat是Spring Boot进程的一部分,外部Tomcat是独立进程。如果外部Tomcat仅部署同一个应用,两者堆内存差异不大;若外部Tomcat还部署了其他应用,整体内存占用会更高。
  • 关键影响因素:
    • 若内嵌Tomcat的线程池、连接池配置和外部Tomcat一致,堆内存占用基本持平。
    • 外部Tomcat可能存在全局数据源、额外Web应用等系统级配置,会额外占用内存;而内嵌Tomcat仅加载当前应用资源,更轻量化。
    • 类加载机制上,外部Tomcat的类加载器层级更多,会有少量额外内存开销,但这个差异通常可忽略。

简单说:仅跑同一个应用且配置相同时,两者堆内存差异很小;外部Tomcat有其他负载时,内嵌Tomcat反而更省内存。


内容的提问来源于stack exchange,提问作者user666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:43:25