Java内存泄漏求助:大量未知String对象占用700MB内存
排查与解决建议
- 先定位引用链:在JProfiler里选中占内存大的String对象,查看它们的引用路径——看是被MySQL的
ConnectionImpl/ResultSetImpl持有,还是HttpServer的HttpExchange对象,或是JSONObject实例,这是找到根因的关键。 - 启用连接池:如果目前是直接创建
Connection,立刻换成HikariCP或Druid连接池。连接池会复用连接及相关的元数据字符串,大幅减少重复对象的生成。 - 规范资源关闭:用
try-with-resources语法确保ResultSet、Connection、Statement等资源被及时关闭,避免驱动内部缓存的字符串被长期持有。 - 优化JSON与字符串使用:
- 把重复使用的JSON键名定义为
static final String常量,避免每次生成新实例; - 不要长期持有
JSONObject对象,用完后让它失去引用以便GC回收。
- 把重复使用的JSON键名定义为
- 处理异常逻辑:如果
CJCommunicationsException频繁触发,先排查数据库连接稳定性(比如网络问题、服务器配置);异常处理后不要持有异常对象的引用,尤其是堆栈信息。 - 谨慎池化重复字符串:对于自己代码中高频出现的重复字符串,可以用
String.intern()或自定义缓存池,但注意intern()会把字符串放入永久代/元空间,不要过度使用。
内容的提问来源于stack exchange,提问作者cplusplus
相关产品推荐
相关产品推荐

