8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io

springboot内存占用大_云原生时代的Spring Boot Spring Boot毫无疑问是Java后端开发的第一大框架,基于Spring Boot有着一套完整的工具链,各种各样的starter。对于日常业务开发而言,可以说是轮子很全。但随着云原生时代的到来,Spring Boot应用或者说是Java应用却暴露出了一些问题,其中比较突出的有:启动慢应用内存占用多其中启动慢的主要原因:代码编译。当然对于Spring Boot来说,Bean实例注入也会花费一定... 阅读详情

8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io

JVM可能是一个复杂的野兽。值得庆幸的是,大部分复杂性都在幕后,我们作为应用程序开发人员和部署人员通常不必过于担心。随着基于容器的部署策略的兴起,需要引起注意的一个复杂领域是JVM的内存占用。

两种内存

JVM将其内存分为两大类:堆内存和非堆内存。堆内存是人们通常最熟悉的部分。它是存储由应用程序创建的对象的位置。它们一直存在,直到它们不再被引用并被垃圾收集。通常,应用程序使用的堆量将根据当前负载而波动。

JVM的非堆内存分为几个不同的区域。我们可以使用HotSpot VM的本机内存跟踪(NMT)来检查这些区域的内存使用情况。请注意,虽然NMT不跟踪所有原生本机Native内存使用情况(例如,它不跟踪第三方本机代码内存分配),但对于大类典型的Spring应用程序来说已经足够了。可以通过启动应用程序-XX:NativeMemoryTracking=summary然后使用jcmd <pid> VM.native_memory summary来显示内存使用情况摘要来使用NMT 。

让我们通过查看应用程序来说明NMT的使用,在这种情况下,我们的老朋友Petclinic。下面的饼图显示了当使用48MB最大堆(-Xmx48M)启动Petclinic时由NMT报告的JVM的内存使用量(减去其自身的开销):

8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io

正如您所看到的,非堆内存占绝大多数JVM的内存使用量,堆内存仅占总数的六分之一。在这种情况下,大约44MB(垃圾收集后立即使用33MB)。非堆内存使用总量为223MB。

本机Native内存区域

  • 压缩类空间:用于存储有关已加载的类的信息。受到约束MaxMetaspaceSize。已加载的类数的函数。
  • 线程:JVM中线程使用的内存。正在运行的线程数的函数。
  • 代码缓存:JIT用于存储其输出的内存。已加载的类数的函数。受到约束ReservedCodeCacheSize。可以通过调整JIT来减少,例如,禁用分层编译。
  • GC:存储GC使用的数据。根据使用的垃圾收集器而有所不同。
  • 符号:存储符号,如字段名称,方法签名和实习字符串。过多的符号内存使用情况可能表明字符串过于激进。
  • 内部:存储不适合任何其他区域的其他内部数据。

非堆内存与堆内存的不同

与堆内存相比,非堆内存在负载下不太可能发生变化。一旦应用程序加载了它将使用的所有类并且JIT完全预热,事情就会陷入稳定状态。要查看压缩类空间使用量的减少,加载类的类加载器需要进行垃圾回收。在将应用程序部署到servlet容器或应用程序服务器时,这种情况更常见 - 应用程序的类加载器将在取消部署应用程序时进行垃圾收集 - 但现代应用程序部署方法很少发生。

调整JVM的大小

配置JVM以有效利用给定数量的可用RAM并不容易。如果您启动JVM -Xmx16M并期望它最多可以使用16MB的RAM,那么您会感到非常惊讶。

调整JVM大小的一个有趣的方面是JIT的代码缓存。默认情况下,HotSpot JVM最多可使用240MB。如果代码缓存太小,JIT将耗尽空间来存储其输出,因此性能将受到影响。如果缓存太大,可能会浪费内存。在调整代码缓存大小时,查看应用程序内存使用情况及其性能的影响非常重要。

在Docker容器中运行时,Java的最新版本现在知道容器的内存限制并尝试相应地调整JVM的大小。不幸的是,这种大小调整经常过度分配非堆内存并且分配不足。假设您有一个在具有2个CPU和512MB可用内存的容器中运行的应用程序。您希望它能够处理更多负载,因此您将CPU加倍为4,将内存加倍至1GB。如上所述,堆使用通常根据负载而变化,而非堆使用则更少。因此,我们希望将大部分额外的512MB内存提供给堆来应对增加的负载。不幸的是,JVM默认情况下不会这样做,并且会在其堆和非堆区域之间更均等地分配额外的内存。

值得庆幸的是,CloudFoundry团队拥有丰富的JVM内存占用知识。如果您要将应用程序推送到CloudFoundry,构建包将自动为您应用此知识。

这对Spring来说意味着什么?

考虑到堆和非堆内存使用情况,我们花了很多时间在Spring团队中考虑性能和内存利用率。限制非堆内存使用的一种方法是使Framework的一部分尽可能通用。这方面的一个例子是使用反射来创建应用程序的bean并将其注入到应用程序的bean中。由于使用了反射,所使用的Framework代码量保持不变,无论应用程序包含多少bean。我们使用基于堆的缓存来优化启动时间,一旦启动完成就清除此缓存。然后,垃圾收集器可以轻松地回收堆内存,从而在应用程序处理其工作负载时为应用程序提供尽可能多的内存。

Java程序员注意啦,我们整理了一个微服务的架构专题,专门针对Docker、Spring Cloud、Dubbo、Spring Boot等技术,同时也给大家搜集一些学习资料和视频,希望能够帮助到家。

SpringBoot容器化部署实战:从裸机到Docker的工程范式升级 容器化是现代Java应用交付的核心范式,其本质在于将运行环境与代码打包为可验证、可复制、可回滚的原子单元。相比裸机部署依赖人工对齐JDK版本、时区、内核参数等易漂移配置,Docker通过镜像固化rootfs、隔离进程资源、解耦构建与运行,显著降低环境不确定性风险。SpringBoot项目尤其受益于容器化——它天然适配分层镜像、健康检查与配置外置机制,结合openjdk:17-jre-slim-bookworm等生产就绪基础镜像,可实现跨PVE、K8s等平台的一致性交付。本文聚焦SpringBoot与Dock 阅读详情

相关推荐

SpringBoot应用JVM监控实战:Prometheus+Grafana方案

JVM监控是Java应用性能管理的核心技术,通过采集堆内存、GC日志、线程状态等关键指标,开发者可以实时掌握系统运行状态。其核心原理是通过JMX或Micrometer等工具暴露JVM内部数据,结合时间序列数据库实现指标存储与分析。在微服务架构下,完善的JVM监控能有效预防内存泄漏、线程阻塞等典型问题,特别适用于电商、金融等高并发场景。本文以SpringBoot为例,详细介绍如何通过Prometheus+Grafana构建生产级监控体系,涵盖从指标采集、存储到可视化告警的全流程实现。该方案在日均20亿指标量的

weixin_34195364的博客 455

docker+spring boot线上环境内存爆涨问题排查

docker中只运行了一个spring boot应用程序,但运行一段时间后内存涨到5G 使用jmap -histo 1查看,得到total的总消耗才1.5G 使用jmap -histo:live 1查看后,得到total的总消耗才150M,说明JVM一直没有对内存中可回收的对象进行回收处理,经过jmap -histo:live后相当于手动调用了一次GC,内存显著下降,初步断定是docker中的...

xpb1980的专栏 5080

SpringBoot应用安全开发与生产部署实战:JWT集成、JAR打包与服务器运维

在现代Java后端开发中,身份认证与授权是保障应用安全的核心机制。JWT(JSON Web Token)作为一种基于JSON的开放标准,通过数字签名实现无状态、分布式的身份验证,其原理是将用户信息编码为令牌,由服务端签发、客户端存储并在请求中携带,有效解决了Session在分布式环境下的扩展性问题。该技术为微服务架构和前后端分离应用提供了轻量级的认证解决方案,其价值在于简化服务端状态管理并提升系统可伸缩性。在实际工程实践中,JWT需与Spring Security框架深度集成,并严格防范算法篡改、敏感信息泄

chouzu8463的博客 407

【Springboot】内存占用过高解决

一直以来,springboot启动后,明明什么都没有,却要占最少2个G。 经过调查,可以调整jvm参数 经过了一番调查,发现了就是加两个参数 Java –jar $jar_file –Xms512m –Xmx1024m 加完了,发现没有什么卵用,然后好多都是这么写的,根本不好使,直到一个大佬的出现 # 正确的Java命令: java [ options ] class [ arguments ] java [ options ] -jar file.jar [ arguments ] 其实到这里,也找

Rex的博客 7654

vivado生成及调用自定义IP的方法

开发环境:vivado 2018.2 1.将整个工程封装为自定义IP 将整个工程封装为自定义IP主要有以下步骤: 步骤1.选中工程中的top模块。点击Tools ------> Create and Package New IP,如图1所示 图1 步骤2.弹出界面后,点击next至图2界面,选择Package your current project,然后继续点击next 图2 步骤3.选择生成的IP路径,如图3所示。这个路径就是后续添加该IP的路径 图3 步骤4.继续点击next,然后选择fi

进击的阿日比 4733

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 205

Springboot 项目JVM优化

一,Spring Boot 扫包优化 @SpringBootApplication注解自动获取应用的配置信息,会给应用带来一些副作用。由自动配置( auto-configuration )和 组件扫描 ( component scanning )组成,这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。...

bobo_supper的博客 3046

配置思科交换机冗余链路汇聚

本文对交换机端口汇聚配置进行说明

istrangeboy&begin zero的博客 6685

【转载】8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io

作者:Java高级架构狮 链接:https://www.jianshu.com/p/67c90867e311 来源:简书 8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io JVM可能是一个复杂的野兽。值得庆幸的是,大部分复杂性都在幕后,我们作为应用程序开发人员和部署人员通常不必过于担心。随着基于容器的部署策略的兴起,需要引起注意的一个...

为君歌一曲 491

C#实现Socket通信同时监听多客户端(附完整源码)

C#实现Socket通信同时监听多客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 427

点到面点云配准(Point To Plane)算法知识详解和详细推导,C++代码实现

点到面 ICP (Iterative Closest Point) 是在 3D 点云配准中常见的一种变体,通过最小化点到对应面(由法向量定义的局部平面)的距离来提高收敛速度和精度。

qq_36812406的博客 1811

springboot内存占用大_8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io...

JVM可能是一个复杂的野兽。值得庆幸的是,大部分复杂性都在幕后,我们作为应用程序开发人员和部署人员通常不必过于担心。随着基于容器的部署策略的兴起,需要引起注意的一个复杂领域是JVM的内存占用。两种内存JVM将其内存分为两大类:堆内存和非堆内存。堆内存是人们通常最熟悉的部分。它是存储由应用程序创建的对象的位置。它们一直存在,直到它们不再被引用并被垃圾收集。通常,应用程序使用的堆量将根据当前负载而波动...

weixin_42659252的博客 439

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2221

王炸!!Spring 终于对 JVM 动手了…

Spring 在今年 3 月份推出了 Spring Native Beta 版本,我本来还想着等正式发布了再研究下,不用等了,现在我们就来尝尝鲜。 https://spring.io/blog/2021/03/11/announcing-spring-native-beta Spring Native 简介 我们都知道,传统的 Spring 应用程序都是必须依赖于 Java 虚拟机(JVM)运行的,Spring Native 的诞生就是无需 JVM,它提供了另外一种运行和部署 Spring 应用的方式.

Java技术栈,分享最主流的Java技术 1万+

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1426

ArcGIS笔记2_如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系

本博文则主要讲解,如果我们手里拿到的shp文件是在ArcGIS中,如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系。

晏长街的博客 4万+

SpringBoot应用JVM监控与Prometheus+Grafana实践

JVM监控是Java应用性能优化的基础环节,通过采集内存、GC、线程等运行时指标实现系统健康状态的可观测性。现代监控体系通常采用指标采集(如Micrometer)、时序存储(如Prometheus)和可视化(如Grafana)的三层架构,这种组合既能满足开发期快速验证需求,也能支撑生产环境的大规模监控。SpringBoot框架通过Actuator模块原生集成Micrometer指标库,配合Prometheus的Pull采集模型和Grafana的丰富图表能力,可快速构建端到端的JVM监控方案。该方案特别适用于

android_mylove的专栏 349

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot应用Docker镜像优化实战

在云原生和微服务架构中,容器化部署是提升应用交付效率的关键技术。Docker镜像作为容器运行的基础单元,其构建优化直接影响CI/CD流水线效能。通过分层构建、多阶段编译等核心技术手段,可显著解决传统FatJAR方式存在的镜像臃肿、构建缓慢等痛点。以SpringBoot应用为例,合理利用Docker缓存机制和JAR分层特性,能使镜像体积缩减80%以上,构建速度提升70%。这些优化对电商等高并发场景尤为重要,既能降低云存储成本,又能加速DevOps流程。本文详解的分层构建方案已通过企业级验证,特别适合需要频繁部

weixin_34293141的博客 421

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringBoot集成JVM监控与Prometheus+Grafana实践

JVM监控是Java应用性能优化的基础环节,通过采集堆内存、GC、线程等运行时指标,开发者可以快速定位内存泄漏和性能瓶颈。Micrometer作为监控门面工具,为SpringBoot应用提供了统一的指标采集API,支持对接Prometheus等主流监控系统。结合Grafana的可视化能力,可以构建包含内存趋势、GC统计等关键指标的实时监控看板。本文以Prometheus+Grafana技术栈为例,详细介绍从指标采集、存储到可视化的完整实现方案,并分享生产环境中的分层监控策略与性能优化经验。

weixin_30751947的博客 369

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【SpringBoot框架篇】13.使用springboot admin对springboot应用进行监控

应用集成adminSpring Boot Admin 对springboot应用进行监控

皓亮君的博客 9180

SpringBoot项目深度优化和Jvm调优

每天上班,干货准时送达!本文作者:星朝本文来源:www.cnblogs.com/jpfss/p/9753215.html项目调优作为一名工程师,项目调优这事,是必须...

Java学习之道 2766

VSCode开发SpringBoot项目全攻略

现代Java开发中,轻量级编辑器与框架的深度整合正成为趋势。通过Language Server Protocol(LSP)实现的智能代码补全,结合构建工具如Maven/Gradle的项目管理能力,开发者可以搭建高效的开发环境。VSCode凭借其扩展体系,特别是Java Extension Pack和Spring Boot Tools插件,为SpringBoot开发提供了接近专业IDE的体验。在微服务架构下,快速启动和低资源消耗的特性使VSCode成为持续集成场景的理想选择。本文以SpringBoot 3.x

weixin_33797791的博客 442

2026年Java面试题

AOF和RDB是两种redis持久化的机制。 重写和重载的区别 ssm原理 servlet生命周期 自定义注解说一说 sleep和wait的区别 map的遍历方式有几种 线程有几种创建方式 说一下图论算法 int有4个字节 mysql的联合索引 linux怎么查看端口号 netstat -tunpl | grep 端口号 fegin怎么暴露出来 fegin有哪些注解 hashMap不是线程安全的,ConcurrentHashMap 是线程安全的 redis和mysql的事物有那么一些不一样 redis幂等

qq_21277357的博客 3367
上一篇: 8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring.io
下一篇: 阶乘很简单?恕我直言,阶乘相关的面试题你还真不一定懂!
大G哥
博客等级 码龄9年 5303粉丝 1408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值