SpringBoot项目占用内存优化

Spring Boot 项目优化和 JVM 调优,亲测!真实有效。。(2) 在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程) 阅读详情

一、JVM内存配置优化

1. 合理设置堆内存

#!/bin/bash
JAVA_OPTS="-Xms256m -Xmx512m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=256m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-XX:+DisableExplicitGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/tmp/heapdump.hprof"
java $JAVA_OPTS -jar your-application.jar

2. 垃圾回收器选择


propertiesCopy Code

# 年轻代使用G1GC(适合多核服务器) -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45

二、Spring框架级优化


# 关闭不需要的自动配置
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration

# 数据源连接池配置
spring.datasource.hikari.maximum-pool-size=5
spring.datasource.hikari.minimum-idle=2

# 缓存配置
spring.cache.type=simple
spring.cache.caffeine.spec=maximumSize=100,expireAfterWrite=60s

# 会话管理
server.servlet.session.timeout=30m
server.servlet.session.persistent=false

# 关闭JMX 
# 当设置为 true 时,Spring Boot 会向 JMX 服务器(如 JConsole、VisualVM)暴露应用的管理端点(如Bean信息、指标监控等)。
# 允许通过 JMX 工具远程监控和管理应用运行时状态
# 禁用后仅影响JMX监控,不影响Actuator的HTTP端点(如/actuator/health)。
spring.jmx.enabled=false
# 禁用指标收集
management.metrics.enabled=false
# 延迟初始化
spring.main.lazy-initialization=true

@Configuration
@Lazy
public class LazyConfig {
    
    @Bean
    @Lazy
    @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
    public HeavyService heavyService() {
        return new HeavyService();
    }
    
    @Bean
    public FilterRegistrationBean<MyFilter> myFilter() {
        FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new MyFilter());
        registration.setEnabled(false); // 默认禁用
        return registration;
    }
}

1. 组件懒加载

javaCopy Code

@Configuration @Lazy public class MyConfig { @Bean @Lazy public HeavyService heavyService() { return new HeavyService(); } }

2. 减少自动扫描范围


javaCopy Code

@SpringBootApplication(scanBasePackages = "com.your.core.package") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

三、依赖库优化

1. 排除不必要的依赖

<project>
    <dependencies>
        <!-- 使用Undertow替代Tomcat -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        
        <!-- 排除不需要的日志实现 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>

2. 使用轻量级替代方案


xmlCopy Code

<!-- 用Undertow代替Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>

四、运行时优化

1. 缓存控制


javaCopy Code

@Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("myCache"); } }

2. 会话管理


propertiesCopy Code

# 使用内存友好的会话存储 spring.session.store-type=none # 或使用Redis时的优化配置 spring.session.redis.flush-mode=on_save spring.session.redis.save-mode=on_set_attribute

五、监控与分析工具

@Component
public class MemoryMonitor {
    
    @Scheduled(fixedRate = 60000)
    public void logMemoryUsage() {
        Runtime runtime = Runtime.getRuntime();
        long usedMB = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024;
        long maxMB = runtime.maxMemory() / 1024 / 1024;
        System.out.printf("Memory usage: %dMB/%dMB (%.1f%%)\n", 
            usedMB, maxMB, (usedMB * 100.0 / maxMB));
    }
    
    @PreDestroy
    public void cleanup() {
        // 释放资源
    }
}

1. 内存分析工具


bashCopy Code

# 生成堆转储文件 jmap -dump:live,format=b,file=heap.hprof <pid> # 使用VisualVM或Eclipse MAT分析

2. Spring Boot Actuator配置


propertiesCopy Code

management.endpoints.web.exposure.include=health,info,metrics management.endpoint.metrics.enabled=true management.metrics.export.prometheus.enabled=true

六、生产环境建议

1. 容器化优化


dockerfileCopy Code

FROM adoptopenjdk:11-jre-hotspot as builder WORKDIR application COPY target/*.jar application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM adoptopenjdk:11-jre-hotspot COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "-Xms256m", "-Xmx256m", "org.springframework.boot.loader.JarLauncher"]

2. 类数据共享(CDS)


bashCopy Code

# 生成共享归档文件 java -Xshare:dump -XX:SharedArchiveFile=app-cds.jsa -jar your-app.jar # 使用共享归档启动 java -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar your-app.jar

通过以上优化措施,典型Spring Boot应用的内存占用可以从1GB+降低到300-500MB,极端情况下甚至可以达到200MB以下。建议定期使用内存分析工具监控应用内存使用情况,持续优化。

Spring boot内存压榨      项目中需要一个Java HTTP服务器作为代理,这个服务只是偶尔执行几个命令,并没有什么负载(这个很关键)。基于Java语言、web服务器和开发效率上的考虑,我们选择了Spring boot框架。但是,服务上线后问题来了,本来只有1G内存的容器,Spring boot占用了400M内存。接下来就得优化Spring boot的内存了。    第一个想到的是JVM Xmx Xms的设置问题。... 阅读详情

相关推荐

springboot内存占用大_云原生时代的Spring Boot

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

weixin_36312301的博客 652

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

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

陈书予 3万+

Spring Boot进阶(21):优化Spring Boot应用性能,使用Undertow容器提升响应速度

SpringBoot如何配置Jetty容器,赶紧来学,手把手教你~~

**My Coding Family** 7992

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

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

dylan的博客 2840

SpringBoot系列之集成EasyExcel实现百万级别的数据导入导出实践

Spring Boot集成EasyExcel实现百万级数据处理 本文介绍了如何在Spring Boot 2.2.1中集成Alibaba EasyExcel实现百万级数据的导入导出功能。项目采用分Sheet处理、分批查询和异步写入等优化策略,通过线程池管理并发任务,显著提升大数据量处理性能。 核心实现包括: 数据导出:分Sheet存储数据,每10万条一个Sheet,采用分批查询(每批1万条)和并行处理 数据导入:使用监听器模式实现流式读取,避免内存溢出 性能优化:配置专用线程池、内存缓存和响应头设置 项目提供

Nicky's blog 1015

DFT实训教程笔记2(bibili版本)- Scan synthesis practice

文章目录Scan synthesis practice 本博文是博主记录DFT实训教程的笔记版本,此笔记并没有对所有的知识进行记录,仅仅以自身的认知水平,来记录了一些部分笔记并加上了自己的理解。 Scan synthesis practice How to design scan clock structure? 假设一块chip里面有好几十个clock domain,如果每一个clock domain都用一个scan clock虽然会非常清晰,但是IO数目肯定不够用。 clock group: 1、no

ciscomonkey的博客 9082

springboot项目启动占用内存_记spring boot线上项目内存优化

公司的一台云服务器部署了若干spring boot项目,内存配置从4G加到了16G,但还是很吃紧,因为这几个项目用户量不大,负载也不高,于是决定想办法优化一下内存占用。以其中一个项目为例记录一下优化过程。优化前以gradle bootRun命令启动项目以后,会产生三个进程:GradleDaemon、GradleMain和Application进程。jps截图占用内存情况如下:mac活动监视器截图G...

weixin_39861918的博客 1290

深入解析MOS管电容特性:从基础理论到高频应用

本文深入解析了MOS管的电容特性,从基础物理结构出发,详细拆解了栅氧电容、重叠电容和结电容的成因与影响。文章重点探讨了电容值随工作状态变化的非线性特性,并分析了其在CMOS高频开关电源、射频电路等应用中的关键作用,包括开关损耗、米勒效应、信号完整性挑战以及如何将电容特性转化为可控元件(如MOS变容管)的机遇。最后提供了从选型、仿真到PCB布局的实战设计指南。

weixin_29278805的博客 381

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

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

风水道人 8320

EnlightenGAN训练复现记录

记录EnlightenGAN过程中的问题和解决方式。提示:以下是本篇文章正文内容,下面案例可供参考。

L_27N113E的博客 3847

VSCode玩转Arduino:手把手解决‘未定义Serial’和头文件找不到的坑

本文详细介绍了在VSCode中配置Arduino开发环境时遇到的‘未定义Serial’和头文件找不到问题的解决方案。通过修改c_cpp_properties.json文件、调整IntelliSense引擎设置以及添加正确的库路径,开发者可以高效解决这些常见错误,提升开发体验。文章还提供了针对不同开发板和平台的高级配置技巧,确保配置的长期有效性。

weixin_42620202的博客 357

springboot项目启动占用内存_springboot项目编译、运行优化等相关操作

本篇主要记录在使用springboot时,相关的操作:(1)编译打包、执行springboot项目本地:mvn clean package -U --settings D:\devsoft\apache-maven-3.5.3\conf\hubs1settings.xml -Dmaven.test.skip=true -Pdev服务器:mvn clean package -U -Dmaven.te...

weixin_39606118的博客 617

mac(apple silicon)arm64安装spm12详细教程

3.下载matlab runtime R2023b for macOS (macA64),注意必须下载这个,只下载matlab是不可以的。默认安装目录是/Applications/MATLAB/MATLAB_Runtime/R2023b。注意最后的命令,路径根据自己的matlab_runtime安装位置进行调整,然后就可以安装成功了。5. 解压spm12.zip,解压后将文件夹拖到应用程序下(Applications)2.下载spm12,这个版本可兼容mac芯片!6.打开mac终端,输入。

weixin_62332001的博客 2020

优化Spring程序内存占用

​ 项目中需要一个Java HTTP服务器作为代理,这个服务只是偶尔执行几个命令,并没有什么负载(这个很关键)。基于Java语言、web服务器和开发效率上的考虑,我们选择了Spring boot框架。但是,服务上线后问题来了,本来只有1G内存的容器,Spring boot占用了400M内存。接下来就得优化Spring boot的内存了。

ThinkStu的博客 8099

Comsol固体力学仿真﹣﹣受均匀内压的厚壁球壳弹塑性分析(加载卸载全流程)

COMSOL固体力学及结构力学仿真较少,故而查询了有关资料,才建立了如下模型。图4 加载卸载全历程中的冯米塞斯应力变化。该有限元模型是通过扫掠而得的结构化网格。图2 加载卸载全历程中的塑型区域变化。图3 加载卸载全历程中的位移应力变化。图6 关键节点第一,第三主应力分布。图5 关键节点应力场与塑性区分布。《弹塑性力学》大作业,记录一下。图1 球体的有限元网格模型。

weixin_62236383的博客 1484

UE游戏引擎材质简单入门

什么是物体的材质,材质属性定义了物体的某些特性,从而决定了物体表面是如何与光线相作用的。UE中物理基础渲染(Physically Based Rendering OR PBR)几乎可以让我们模拟显示世界中的任何材质。那么如何在UE中制作出真实的PBR材质,基于我们提供的游戏引擎插件,如何将这些材质资源导出,并应用到 SuperMap iClient3D for Cesium/WebGL 平台上,提升模型的显示效果呢,下面小编将详细讲解一下。

m0_71055362的博客 2510

springboot项目启动内存占用过高问题如何解决

问题:在开发springboot过程中一个很严重的资源问题就是内存占用过高,而实际上本机开发测试并没有很大的请求量,所以这是对电脑资源的一种严重的浪费,甚至导致IDE卡死、崩溃。有时候非常简单的一个项目,只要启动就轻松占用1g内存,今天优化了下,成功把内存降到200m左右,其实主要开始默认配置有点大,这样优化不管是本地还是服务器又可以畅快运行了。干货:启动命令示例,这样...

开发者导航 7924

BMS硬件设计要点:从STM32主控到BQ76920监控芯片的工程实践

电池管理系统(BMS)是锂电安全与寿命保障的核心,其硬件设计涉及微控制器选型、专用监控芯片接口、电源完整性、信号完整性及PCB布局等多维度协同。基于STM32与BQ76920的典型双层架构,需深入理解功能安全解耦原理——关键保护由ASIC硬件实现,算法决策交由MCU完成,契合ASIL-B等级要求。技术价值体现在毫秒级硬件保护响应、±10mV电压采样精度及抗EMI鲁棒性设计;广泛应用于电动工具、储能系统与轻型电动车等中高功率场景。本文聚焦BMS控制板硬件实现中的高频时钟EMC、I²C总线信号完整性、被动均衡可

weixin_30591519的博客 92

Springboot占用内存太大

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33979203的博客 3420

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

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

记一次线上问题--SpringBoot项目开发内存占用过大

起因解决的思路解决方法1、打开Edit Configurations2、参考如下配置3、关于jvm配置4、Linux jvm设置关于Jvm调优Oracle官网有一份指导说明: 起因 由于业务的划分需要,以及需求的不断增加,我们现在已经有八个独立的服务,而每一个Springboot工程都有一个内置的Tomcat。刚开始的时候服务不是很多,服务器的内存也充足。随着服务的增加,慢慢发现内存越来越小,到...

知世俗而不世俗 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux服务器springboot或tomcat项目启动,进行jvm参数调优设置

简介 在实验环境或生产环境中,往往一台linux服务器需要添加启动n个项目,但是项目启动占用的jvm内存默认值基本上都是很大的,800m到2G都有,这样很容易将服务器的内存吃垮,从而导致系统强制oom(内存泄露),不留任何情面; 所以,我们在部署项目的时候需要进行jvm参数的调优设置,保证内存使用的稳定性; 实践 1.首先执行命令:free -h,查询当前的内存占用情况,从下图可看出,内存...

alan_liuyue的博客 8772

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringBoot3项目性能提高10倍的优化

通过将热点数据缓存到内存中,可以减少重复的数据库查询、计算等操作,显著提高性能。Spring Security是Spring应用中常用的安全框架,但它可能会影响应用的性能。通过优化Spring Security配置,减少不必要的认证和授权检查,可以提升性能。Spring Boot 启动时加载了大量的自动配置,如果项目过于庞大,启动时间可能会非常长。通过合理的数据库连接池配置,可以显著减少数据库连接的等待时间,提升数据库操作的并发性能。可以排除不必要的自动配置,从而加速应用的启动过程。

2501_92608043的博客 480

JVM项目优化之旅

说到jvm优化实在令我惭愧,因为我对他的了解仅限于我在面试题里背的那些。但公司有个项目在现场机器上运行,内存吃到了8G,这点让客户很不满意,因为他们的机器也会跑其他项目,32G的机器光我们的项目就占了四分之一,让他们不能接受。于是要求我们对项目进行优化,要求内存常规态不能超过1.5G。 其实客户的想法是允许项目在进行一些操作的时候内存上升,但是希望在功能使用完,对软件没有操作时,使用内存能够下降!该项目是基于Oracle jdk 8开发,springboot版本为2.0.3,运行在银河麒麟上项目在麒麟上刚启

Curtisjia的博客 551

spring boot项目从零开始-(9)下载-流式查询优化

spring boot项目从零开始-下载前提步骤数据库pom.xmlapplication.ymlmodeldaoservicecontroller及启动入口试验 前提 先集成sql server,参考:https://blog.youkuaiyun.com/sndayYU/article/details/104186820?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162812983316780366516187%2522%252C%2522scm

DRD 450

SpringBoot老项目智能重构实战与性能优化

在Java企业级开发中,项目重构是提升系统性能和可维护性的关键环节。通过静态代码分析和AI技术,现代重构工具能够理解代码语义,自动完成依赖管理、配置迁移和代码转换。这种技术显著减少了人工干预,解决了传统重构中的版本冲突、兼容性等问题。以SpringBoot重构为例,工具可以智能转换Controller注解、优化RESTful接口,并自动推荐依赖版本。在实际应用中,这种重构方式能将启动时间减少82%,内存占用下降46%,特别适用于SpringMVC到SpringBoot的迁移、Java版本升级等场景。飞算Ja

weixin_34280237的博客 372
上一篇: SpringBoot启动优化
下一篇: 清分系统在电商中的一些案例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值