实用指南:解决 SpringBoot 多实例内存不足问题

【SpringBoot】Redis 分布式锁 解决在多实例下数据并发问题 ~ 一定要多思考,如果人永远待在舒适圈的话,人永远不会成长。共勉觉得作者写的不错的,值得你们借鉴的话,就请点一个免费的赞吧!这个对我来说真的很重要。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

2bb0fbb43aba169e16652158520b4d82.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7303862023618707491


在生产环境中我们会遇到一些问题,此文主要记录并复盘一下当时项目中的实际问题及解决过程。

背景简述

最初系统上线后都比较正常风平浪静的。在系统运行了一段时间后,业务量上升后,生产上发现java应用内存占用过高,服务器总共64G,发现每个SpringBoot占用近12G的内存,我们项目采用微服务架构,有多个springboot应用。一下子内存就不够用了,springboot出现假死了。

由于当时生产没有截图,我用本机模拟类似的情况。

8dcc6271920290ca34679c2765cec237.jpeg 769dea3d41ddd9c3a68e0b6ce54f978d.jpeg

可以看到内存基本被使用完了,为什么Java程序会占用这么大内存呢?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

解决步骤

step1:jps查看进程ID或通过top

83220962cc8a4374d428e8db18ac088b.jpeg

step2:jmap -heap 进程ID

7db6148fca7ac7098a8404d66d50875a.jpeg

可以看到Java应用的最大堆内存是4G,当时我们生产是64G的物理内存,生产Java应用的最大堆内存是12G。

a007ac66755f0b2f85b88c32ccb0d74f.jpeg
  • 最大堆大小(-Xmx):通常为物理内存的1/4。

  • 初始堆大小(-Xms):通常为物理内存的1/64。

以下是Oracle官方对JVM默认参数的详细说明:

b029a7fa7ede83c62a4142fe88a95a2a.jpeg

以下是对应的译文:

默认堆大小

除非在命令行中指定了初始堆大小和最大堆大小,否则它们是根据计算机上的内存量计算的。

客户端 JVM 默认初始和最大堆大小

默认最大堆大小是物理内存的一半(物理内存大小不超过 192 兆字节 (MB)),否则为物理内存的四分之一(物理内存大小不超过 1 千兆字节 (GB))。

例如,如果您的计算机有 128 MB 物理内存,则最大堆大小为 64 MB,大于或等于 1 GB 物理内存会导致最大堆大小为 256 MB。

JVM 实际上不会使用最大堆大小,除非您的程序创建了足够的对象来需要它。在 JVM 初始化期间分配的量要小得多,称为初始堆大小。此量至少为 8 MB,否则为物理内存的 1/64,最大物理内存大小为 1 GB。

分配给年轻代的最大空间量是总堆大小的三分之一。

服务器 JVM 默认初始和最大堆大小

默认初始堆大小和最大堆大小在服务器 JVM 上的工作方式与在客户端 JVM 上的工作方式类似,只是默认值可以更高。在 32 位 JVM 上,如果有 4 GB 或更多物理内存,则默认最大堆大小可达 1 GB。在 64 位 JVM 上,如果有 128 GB 或更多物理内存,则默认最大堆大小可达 32 GB。

到这里基本上可以看出是运维人员发布Java应用时并没有设置JVM参数,而是使用默认JVM参数。导致每个Java应用占用过高。虽然是小问题,但生产上每个Java占用12G内存还是比较吓人的。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

复盘

一般内存占用过大的排查思路:

在排查内存占用过大的问题时,一般可以采取以下思路:

  • 检查JVM参数: 如果在生产环境中启动Spring Boot没有设置JVM参数,使用默认的JVM配置,可能会导致性能问题和资源浪费。优化JVM参数,根据应用程序的需求和服务器配置进行调整。

  • 观察内存使用情况: 使用监控工具或者操作系统提供的工具,观察Java应用的内存使用情况,包括堆内存、非堆内存、垃圾回收等。

  • 分析GC: 如果发现内存问题,可以分析GC日志以了解垃圾回收的情况,包括频率、时间等。

  • 合理设置堆内存大小: 根据应用程序的需求和服务器的物理内存,合理设置堆内存的大小,避免过大或过小导致性能问题。

  • 考虑使用内存分析工具: 使用工具如VisualVM、MAT等,对应用程序进行内存分析,找出可能存在的内存泄漏或者大对象。

3edbc4fda9d8b80d7456ac0930ac24c4.jpeg

如果在生产环境中启动springboot没有设置jvm参数,使用默认的JVM配置,可能会有以下几个危害:

  • 默认的JVM配置可能不适合你的应用程序的性能需求和资源限制,导致内存溢出、垃圾回收频繁、性能下降等问题。

  • 默认的JVM配置可能会浪费服务器的内存资源,因为JVM会根据物理内存的大小来分配堆内存的大小,而不是根据应用程序的实际需求。

因此,建议在生产环境中启动springboot时,根据应用程序的特点和服务器的配置,合理地设置JVM参数,以提高应用程序的性能和稳定性,节省服务器的资源。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

668df24ca9f0c05fa1c3d0e5558d2850.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

7506d5aeaec13ecfcd2b8cfa6e258e42.png

d6c23fbe286bb3602f9519b750ebee21.png27aed701a7d347d2418eef085b5a9ed3.pngb852e74a63dba49777ed46a4503a10f1.pngf967856aea7e8ba8f596e91900bfd6e3.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
SpringBoot 使用 @ServerEndpoint 后 @Autowired 失效问题分析和解决 之前的技术博客中记录了 SpringBoot 如何集成 WebSocket 实现消息群发推送,主要构建了基础的框架: SpringBoot 集成 WebSocket 实现消息群发推送 后续发现使用 @ServerEndpoint 后,@Autowired 就失效了,这是为什么呢? 问题描述 在具体的业务场景中,需要等用户连接成功后,从库表中先获取10条数据,作为默认的初始化数据进行显示。 我们想当然的通过 @Autowired 注解将对应 Service 进行依赖注入。却发现报了空指针的异常,也就是说,所需 阅读详情

相关推荐

学习SpringBoot过程中遇到的问题以及解决方式

昨天学了点SpringBoot的内容,感觉超级简单,忍不住就想动手来试试,结果遇到各种问题,所以在此总结一下.......1.我使用的是eclipse自带的模板(需要安装sts插件),创建项目之后,maven开始下载jar包,我手贱,下载到一半把项目删除了,再次创建项目后,pom.xml文件开始疯狂报错,然后update maven和clean project都没效果,无奈之下只好把maven本地...

qq_26392615的博客 4557

简单的springboot应用部署后内存占用量过大问题排查

docker stats 命令查看docker容器内存和CPU使用情况高内存使用量应用,进入容器 jps查询java 进程idjstat 命令查看年轻代和老年代内存使用量和分布。jmap查看内存详情,分析问题原因为:青年代没有设置或者设置的过大了。青年代过大触发GC频率过低。造成大量垃圾对象堆积在青年代不回收。而Eden区多次扩容导致。

d495435207的博客 6178

【SpringBoot】SpringBoot之Bean之多实例选择

当通过接口的方式注入Bean时,如果有多个子类的bean存在时,具体哪个bean会被注入呢?系统中能否存在两个重名的bean呢?如果可以,那么怎么选择引入呢?如果不行的话又该怎么避免上面的问题呢?

九师兄 3818

springboot应用,cpu高、内存高问题排查

回顾一下整个排查过程,有几个点说一下1)、写方法一定要注意动态的情况,比如此例中,数据后期增长的情况,不能只考虑当时的数据。2)、有个疑问,就算对象不可达了,正常来说也可以从MAT里看到点相关东西才对,但是翻了很久,啥也没看到,MAT的使用还要再看看,感觉是遗漏了细节3)、还有个疑问,虽然对象确实很大,但是可以回收,那rancher上看到的内存为啥还会这么高呢?这也是一个疑问点,需要找时间了解一下rancher。

qq_39839075的博客 6800

U-net复现pytorch版本 以及制作自己的数据集并训练

GitHub链接: https://github.com/milesial/Pytorch-UNet 论文链接:

candice5566的博客 3万+

LVGL v9的lv_scale控件实战:5分钟打造动态仪表盘(附完整代码)

本文详细介绍了LVGL v9中lv_scale控件的实战应用,通过5个关键步骤快速打造动态仪表盘。文章涵盖核心特性解析、代码实现、样式定制及性能优化,适用于工业HMI、智能家居等场景,并附完整代码示例。

gin88的博客 262

SpringBoot服务运行时内存占用优化

java项目尤其基于`SpringBoot框架`开发的项目相对于其它一些语言(go语言)占用的`内存`较多,我们一般使用的云服务器资源比较有限(CPU、内存等),如何精简SpringBoot框架项目运行时内存消耗,尤其是项目在启动时,并没有运行业务的情况下,这里简单做一些总结。

dylan的博客 2840

【暂时完结】Prescan学习笔记

Prescan学习记录1. Prescan基础知识1.1 Conventions·坐标1.2 Road segment·道路片段1.2.1 让一个路段连接其他两个路段1.2.2 配置车道线1.2.3 Road marking·道路标志1.3 Trajectory·轨迹1.3.1 建立一个Path·路径1.3.2 配置Speedprofile1.3.3 Synchronization of Trajectories·轨迹同步1.3.4 Multiple trajectories · 多轨迹分配 1. Pres

dreautumn的博客 1万+

掌握 Spring Boot 运行内存及内存参数设置:助力高效应用部署与优化

Java 应用程序通过 Java 虚拟机(JVM)运行。JVM 负责管理 Java 应用程序所需的内存。JVM 内部划分了不同的内存区域,包括堆(Heap)、栈(Stack)、非堆(Non-Heap)等不同类型的内存。其中,堆内存是 Java 程序运行时最常用的内存区域,主要用于存储 Java 对象。Java 堆内存的大小是发生 OutOfMemoryError 错误的主要原因。因此,在部署和优化 Java 应用程序时,正确的内存设置是非常重要的。

陈书予 3万+

机器学习预测材料性能:从特征工程到SHAP可解释性分析

机器学习在材料科学中的应用,核心在于将复杂的材料性能预测问题转化为数据驱动的建模任务。其基本原理是通过算法从历史数据中学习特征与目标属性之间的映射关系。这项技术的价值在于能够大幅加速新材料的发现与设计周期,降低传统“试错法”的高昂成本。在工程实践中,它广泛应用于预测如形成能、带隙、弹性模量以及居里温度等关键材料性能。具体到磁性材料领域,居里温度的准确预测对于永磁体和自旋电子器件设计至关重要。本项目深入探讨了如何利用特征工程从材料成分与结构中构建有效描述符,并借助SHAP这一可解释性工具,揭示模型决策背后的物

weixin_27155667的博客 652

矢量网络分析仪VNA的校准之SOLT方法

作者:杭州冥鸿电子科技有限公司 邮箱:huanglong@deepelec.com S参数的测量方法有两种,一种是基于扫频测量的原理(VNA),另外一种是基于快沿阶跃响应的原理(TDR)。 下图是VNA的原理框图,主要包括以下部分: (1)激励信号源:提供感兴趣的频率范围内的入射信号; (2)信号分离装置:含功分器和定向耦合器,分离出入射,反射和传输信号; (3)接收机:...

u010018619的博客 2万+

SpringBoot 项目启动内存占用过高优化以及内存查看

SpringBoot 项目启动内存占用过高优化以及内存查看

风水道人 8323

Android 14 (AOSP) 源码架构深度解析与开发者指南

Android14源码的仓库指南信息

保持专注,保持热爱 1188

解决:spring.profiles.active=dev 多实例不生效问题

目录问题spring boot 2.x 运行指定配置(application-dev2.yml)文件,没有生效解决spring-boot 2.x 使用mvn spring-boot:run -Dspring-boot.run.profiles=XXX效果解决问题依据多实例配置过程pom.xml 问题 spring boot 2.x 运行指定配置(application-dev2.yml)文件,没...

陈阿刚的博客 1万+

某城商银行生产容器云平台详细设计方案分享及经验总结

AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。

qq_61890005的博客 860

Android 9.0 延时开机动画解决首次开机黑屏和去掉android正在启动的提示框

在9.0的系统产品rom定制化开发中,在一些产品中会出现在首次开机的时候,由于在开机动画播放完以后会出现几秒短暂的黑屏情况,然后进入默认Launcher,这在产品体验上 也是感觉到有点差,所以会要求在去掉这个首次开机黑屏的效果,和在启动过程中的 android is starting这个提示框的这些效果优化,接下来就分析下相关功能, 然后实现这个功能的开发

安卓兼职framework和app工程师的博客 3246

SpringBoot基础篇之重名Bean的解决与多实例选择

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 当通过接口的方式注入Bean时,如果有多个子类的bean存在时,具体哪个bean会被注入呢?系统中能否存在两个重名的bean呢?如果可以,那么怎么选择引入呢?如果不行的话又该怎么避免上面的问题呢? I. 多实例Bean的选择 这个场景可以说是比较常见的,现在提倡面向接口编程嘛,当一个接口有多个实例时,怎么注入和引用就需要我们额外...

weixin_34218890的博客 2671

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringBoot 多实例内存不足问题排查思路

导致每个Java应用占用过高。因此,建议在生产环境中启动springboot时,根据应用程序的特点和服务器的配置,合理地设置JVM参数,以提高应用程序的性能和稳定性,节省服务器的资源。默认的JVM配置可能会浪费服务器的内存资源,因为JVM会根据物理内存的大小来分配堆内存的大小,而不是根据应用程序的实际需求。可以看到Java应用的最大堆内存是4G,当时我们生产是64G的物理内存,生产Java应用的最大堆内存是12G。根据应用程序的需求和服务器的物理内存,合理设置堆内存的大小,避免过大或过小导致性能问题。

qq_30125403的博客 1011

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SpringBoot整合定时任务遇到的多实例问题

SpringBoot整合定时任务遇到的多实例问题

admin_2022的博客 881

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

集成Consul负载均衡多实例注册

SpringBoot2.x 集成Consul负载均衡多实例注册原理解决方案(2种)解决方案一自定义ConsulServiceRegistry开启心跳检测解决方案二直接修改实例ID参考 原理 问题:问题在多个实例注册时出现。如果不解决将会出现实例覆盖的情况,实现不了负载均衡。 原因:根据官网描述:Consul 的注册机制,默认是Spring Cloud Consul在注册的时候实例名(Ins...

天雨流芳 1087

bean覆盖 springboot_SpringBoot基础篇之重名Bean的解决与多实例选择

当通过接口的方式注入Bean时,如果有多个子类的bean存在时,具体哪个bean会被注入呢?系统中能否存在两个重名的bean呢?如果可以,那么怎么选择引入呢?如果不行的话又该怎么避免上面的问题呢?I. 多实例Bean的选择这个场景可以说是比较常见的,现在提倡面向接口编程嘛,当一个接口有多个实例时,怎么注入和引用就需要我们额外关注下了基本使用姿势首先定义一个接口和两个简单的实现类,并演示一下我们通常...

weixin_39819393的博客 1764

SpringBoot使用多实例QUARTZ出现重复执行问题

项目运行了1个多月,多实例的Quartz一直没有问题,今天突然出现一个JOB重复执行了2次。查看日志发现两个实例各执行了一次,但是是偶发现象,也就是一会执行一次,一会执行两次,没有规律。好奇怪,明明用了多实例Quartz。再次查看调度器服务的日志 2017-09-05T11:59:00+08:00 [APP/0] OUT 2017-09-05 11:59:00.004 INFO 14 --...

司马缸砸缸了 2万+

springBoot多实例

应用、保存、启动服务应该就不用多说了。1、显示services操作窗口。2、添加springboot。3、配置单个服务多实例。

weixin_68013612的博客 321

springboot实现多实例crontab抢占定时任务

github:https://github.com/jiasion/eslog wechat:minghui-666 利用redisson实现多实例抢占定时任务 pom.xml <dependency> <groupId>org.redisson</groupId> <artifactId>r...

肿有刁民想呀么想害朕……! 85万+
上一篇: GitHub 账号被盗了
下一篇: 10月面试的兄弟看看吧。。
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值