前言
??工作中常常发现:一个简单的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收集的时间
最后
若有帮助,请点赞+关注!
|