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应用时,我们可以根据需求定义这些参数。