Spring Boot应用内存飙升分析与解决
工作中常常发现:一个简单的应用,内存竟然达到的内存。 其实,有些服务的体量根本用不了这么多。那么,在中如果未设置参数时,是如何配置的呢? 当运行一个项目时,如果未设置参数,默认会采用自身默认的配置策略。在资源比较充足的情况下,开发者倒是不太用关心内存的设置。但一旦涉及到资源不足,JVM优化,那么就需要了解默认的。 关于内存最常见的设置为初始堆大小和最大堆内存。很多人懒得去设置,而是采用的
Spring Boot应用内存飙升分析与解决
前言
工作中常常发现:一个简单的Spring Boot
应用,内存竟然达到1.2G-2G
的内存。
其实,有些服务的体量根本用不了这么多。那么,在Spring Boot
中如果未设置JVM内存
参数时,JVM内存
是如何配置的呢?
一、SpringBoot默认的内存大小?
当运行一个Spring Boot
项目时,如果未设置JVM内存
参数,Spring Boot
默认会采用JVM
自身默认的配置策略。在资源比较充足的情况下,开发者倒是不太用关心内存的设置。但一旦涉及到资源不足,JVM优化,那么就需要了解默认的JVM内存配置策略
。
关于JVM
内存最常见的设置为初始堆大小(-Xms)
和最大堆内存(-Xmx)
。很多人懒得去设置,而是采用JVM
的默认值。特别是在开发环境下,如果启动的微服务比较多,内存会被撑爆。
而JVM
默认内存配置策略分两种场景,大内存空间场景
和小内存空间场景(小于192M)
。
二、JVM内存配置策略
1.大内存空间场景
以4GB
内存为例,初始堆内存大小和最大堆内存大小如下图:
默认情况下,最大堆内存占用物理内存的1/4
,如果应用程序超过该上限,则会抛出OutOfMemoryError
异常。初始堆内存大小为物理内存的1/64
。
2.小内存空间场景(小于192M)
手机上或物理内存小于192M
时,JVM
默认的初始堆内存大小和最大堆内存大小如下图:
最大堆内存为物理内存的1/2
,初始堆内存大小为物理内存的1/64
,但当初始堆内存最小为8MB
,则为8MB
。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
因此,服务器一般设置-Xms
、-Xmx
相等以避免在每次GC
后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统
回收。
其中最大堆内存是JVM
使用内存的上限,实际运行过程中使用多少便是多少。默认,分配给年轻代的最大空间量是堆总大小的三分之一。
针对最开始的问题,如果每个程序都按照默认配置启动,一台服务器上部署多个应用时,就会出现内存吃紧的情况,造成一定的浪费。最简单的操作就是在执行java -jar
启动时添加上对应的jvm
内存设置参数。
java -Xms64m -Xmx128m -jar xxx.jar
三、JVM常见参数解释
-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:java heap最大值,使用的最大内存
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
最后
若有帮助,请点赞+关注!
更多推荐
所有评论(0)