1. 概述

在这个教程中,我们将了解Spring Boot应用程序使用的默认内存设置。

通常,Spring并没有专门的内存配置,它会使用底层Java进程的配置。以下是配置Java应用内存的方式。

2. 内存设置

Java进程或JVM的内存被划分为堆、栈、元空间、即时编译器代码缓存和共享库等部分。

2.1. 堆

堆是对象存在的区域,直到垃圾回收器收集它们。最小堆的默认值是8 MB,或者在8 MB到1 GB范围内的物理内存的1/64

最大堆的默认值是对于大于192 MB的物理内存,是物理内存的1/4;否则,是物理内存的1/2

在堆内,我们有新生代内存限制,当超过这个限制时,会触发新的垃圾回收。其默认值取决于平台。

我们还有持久区限制,它是总堆大小的百分比,当达到这个值时,足够长时间生存的对象会被提升到老年代。其默认值为25%。

自Java 8开始,元空间作为堆的一部分,用于存储所有类元数据。默认情况下,最小值取决于平台,最大值为无限大

要重置最小堆、最大堆和元空间大小的默认值,请参阅关于配置堆大小的这篇文章

可以使用-Xns参数来覆盖新生代内存限制,因为新生代是堆的一部分,其值不应大于-Xmx值:

java -Xns:10m MyApplication

同样,我们可以使用-XXkeepAreaRatio参数来改变持久区限制的默认值,例如设置为10%:

java -XXkeepAreaRatio:10 MyApplication

最后,这是在Linux上检查堆大小的方法:

java -XX:+PrintFlagsFinal -version | grep HeapSize

在Windows上检查堆大小的命令如下:

java -XX:+PrintFlagsFinal -version | findstr HeapSize

2.2. 栈

这是为每个线程分配的执行内存。其默认值取决于平台。

我们可以使用-Xss参数来定义线程堆栈大小,例如分配512 kB:

java -Xss:512k MyApplication

然后在Linux上检查堆栈大小:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

或者在Windows机器上执行相同的操作:

java -XX:+PrintFlagsFinal -version | findstr ThreadStackSize

3. 总结

本文介绍了Java应用程序可用的各种堆和栈内存配置选项的默认值。

在启动Spring Boot应用时,我们可以根据需求定义这些参数。

对于进一步的调优选项,请参考官方指南。同时,有关所有配置参数的完整列表,请查阅此文档