为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案

news2024/12/24 11:41:00

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

背景简述

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

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

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

解决步骤

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

step2:jmap -heap 进程ID

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

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

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

以下是对应的译文:

默认堆大小

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

客户端 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内存还是比较吓人的。

复盘

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

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

  1. 检查JVM参数: 如果在生产环境中启动Spring Boot没有设置JVM参数,使用默认的JVM配置,可能会导致性能问题和资源浪费。优化JVM参数,根据应用程序的需求和服务器配置进行调整。
  2. 观察内存使用情况: 使用监控工具或者操作系统提供的工具,观察Java应用的内存使用情况,包括堆内存、非堆内存、垃圾回收等。
  3. 分析GC: 如果发现内存问题,可以分析GC日志以了解垃圾回收的情况,包括频率、时间等。
  4. 合理设置堆内存大小: 根据应用程序的需求和服务器的物理内存,合理设置堆内存的大小,避免过大或过小导致性能问题。
  5. 考虑使用内存分析工具: 使用工具如VisualVM、MAT等,对应用程序进行内存分析,找出可能存在的内存泄漏或者大对象。

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

  • 默认的JVM配置可能不适合你的应用程序的性能需求和资源限制,导致内存溢出、垃圾回收频繁、性能下降等问题。
  • 默认的JVM配置可能会浪费服务器的内存资源,因为JVM会根据物理内存的大小来分配堆内存的大小,而不是根据应用程序的实际需求。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1237129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益(2023.11)

接入穿山甲SDK的app 全屏文字滚动APP 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK,实现app流量变现 接入穿山甲SDK app示例: android 数独小游戏 经典数独休闲益智 2023.11.11 ~ 2023.11.22 app接入上架有一段时间了,接…

毕业设计2049网上选课系统JSP【程序源码+文档+调试运行】

摘要 本文详细介绍了一个网上选课系统的设计与实现过程。该系统主要分为学生用户、管理员和教师用户三个模块,涵盖了用户登录、在线选课、信息管理、密码修改等功能。通过对系统功能的分析,进行了数据库设计和界面设计,并进行了测试和优化。…

5G将如何改变我们的生活和工作方式?

本文翻译自 How Will 5G Transform the Way We Live and Work?,作者:Ansam Yousry, 略有删改。 5G有潜力为所有人创造一个更加互联、高效和可持续的世界。 欢迎来到5G革命! 想象一下这样一个世界,您可以在几秒钟内下…

人在国企,年薪30w,每天工作1小时,觉得没意思,要不要走?

精彩回顾:进了央企,拿了户口,却感觉被困住了。 我们经常对自己的掌握的技能视若无睹,认为那不过是寻常之物,但是对于不懂的人来说,那就是宝藏啊。就好像,你可能会做一个超级棒的PPT,…

上海站活动回顾 | 聚焦私募视野,助力量化投研交易

11月16日下午,DolphinDB 携手华金证券,在上海成功举办了 D-Day 私募行业交流会,为大家带来了详实的私募行业场景解析、功能介绍、案例分享及现场演示。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场,深…

迎接“全全闪”时代 星辰天合发布星海架构和星飞产品

11 月 17 日,北京市星辰天合科技股份有限公司(简称:XSKY星辰天合)在北京首钢园举办了主题为“星星之火”的 XSKY 星海全闪架构暨星飞存储发布会,到场嘉宾共同见证了全新的分布式全闪架构“星海(XSEA&#x…

解密高性能查询!小米亲授:如何轻松查出1000条数据的后十条前7条?

大家好,我是小米!今天要跟大家分享一道火辣辣的面试题:在一张表中,如何高性能地查出1000条数据的后十条的前7条?这可是一个考察你数据库查询优化能力的好题目哦!废话不多说,让我们直奔主题&…

requests 解决 itz 文档中的 Content-Encoding 问题

在使用Python中的requests库进行网络请求时,我们经常需要获取服务器的响应内容。 itz文档中没有明确说明如何使用r.content,而不是r.read()来获取响应内容。这可能会导致一些开发者在使用requests库时感到困惑,特别是对于那些希望更清晰地了…

持续集成失败:hudson.plugins.git.GitException: Failed to delete workspace

持续集成环境(git gitlab jenkins pipeline maven harbor docker k8s)之前都是ok的,突然就报错了: Cloning the remote Git repository Cloning repository git192.168.117.180:qzcsbj/gift.git ERROR: Failed to clean the workspace jenkins.ut…

数据库基础入门 — 认识数据库

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…

Unity 头顶图文字性能优化

如图:常规的排版,会有很多Batches。这是优化后的Batches只有3。 常用解决方案: 1、创建两个Canvas,一个放所有文本Text,一个放所有Image。但这里有会有两个问题:一旦文字夹在两个Image中间,还有…

从传统到智能 | 拓世法宝AI智能直播一体机为商家注入活力

2023年即将结束,直播仍然是商业舞台上的主旋律,本地生活也不例外。据数据显示,到2022年,中国本地生活服务市场规模已经达到29.8万亿元,而预计到2025年,这一数字将继续攀升至35.3万亿元。伴随着当地生活直播…

EDIFACT学习手册

EDIFACT 又名 UN/EDIFACT(全称为 United Nations/Electronic Data Interchange For Administration, Commerce and Transport),是由联合国主导开发制定的国际通用 EDI 标准。EDI术语中的EDIFACT是指 EDIFACT 报文标准,本视频将为大…

【软件工程师从0到1】- 继承 (知识汇总)

前言 介绍:大家好啊,我是hitzaki辰。 社区:(完全免费、欢迎加入)日常打卡、学习交流、资源共享的知识星球。 自媒体:我会在b站/抖音更新视频讲解 或 一些纯技术外的分享,账号同名:hi…

《golang设计模式》第三部分·行为型模式-06-备忘录模式(Memento)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 备忘录(Memento)用于在不破坏目标对象封装特性的基础上,将目标对象内部的状态存储到外部对象中,以备之后恢复状态时使用。 1.1 角色 Originato…

kibana 7安装

手动安装 下载 wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.15-linux-x86_64.tar.gz 解压 mv kibana-7.17.15-linux-x86_64.tar.gz /usr/local tar -zxvf kibana-7.17.15-linux-x86_64.tar.gz chown -R es:es kibana-7.17.15-linux-x86_64修改配置 s…

深圳锐科达SV-X7 sip话机与海康威视摄像头联动设置方法

深圳锐科达SV-X7 sip话机与海康威视摄像头联动设置方法 SIP对讲终端获取设备IP地址方式 通过长按速拨键3秒(上电30秒后,即听到提示音后),待喇叭发出急促嘟嘟声,再快速按一下速拨键,设备自动语音播报本机的…

Vue弹窗的使用

Vue弹窗的使用: Vue弹窗传值:

requests 库中响应最大文件大小和最大连接超时时间的设定

最近,requests-toolbelt库的开发者jvanasco提出了一项特性请求,即在发送请求时设置响应的最大文件大小和最大连接超时时间。 对于最大连接超时时间的问题,我们可以借鉴requests-toolbelt库的开发者kevinburke的建议,将请求放入线程…

基于SSM的焦作旅游协会管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…