JVM 之 常用配置说明
在Java应用中,内存的使用受JVM参数严格限制,无法超越配置的范围。以下是各参数的详细说明及分析:
1. -Xms1g(初始堆内存)
- 作用:设置JVM启动时分配的初始堆内存大小为1GB。
- 是否可超越:否。堆内存初始大小由
-Xms决定,JVM启动时会直接申请该大小的内存(或操作系统延迟分配物理内存)。若应用需求超过1GB,JVM会根据-Xmx的限制动态扩展堆内存,但不会超过-Xms的初始值(除非-Xms和-Xmx值不同且JVM允许动态调整)。 - 关键点:
-Xms与-Xmx通常设为相同值(如-Xms4g -Xmx4g),以避免运行时动态调整堆大小带来的性能开销。
2. -Xmx4g(最大堆内存)
- 作用:设置JVM可申请的最大堆内存为4GB。
- 是否可超越:否。堆内存是Java应用存储对象实例的主要区域,其大小受
-Xmx严格限制。当堆内存接近4GB时,JVM会触发垃圾回收(GC)释放无用对象;若回收后仍无法满足分配需求,则抛出java.lang.OutOfMemoryError: Java heap space。 - 关键点:
-Xmx是堆内存的硬上限,必须根据应用需求和物理内存合理设置。若设置过大,可能导致系统频繁交换(swap)或内存不足;设置过小则可能频繁触发GC,影响性能。
3. -Xss1m(线程栈大小)
- 作用:设置每个线程的栈大小为1MB。
- 是否可超越:否。每个线程的栈空间用于存储局部变量、操作数栈、方法调用上下文等信息。若方法调用深度过大(如递归过深),栈空间不足会抛出
java.lang.StackOverflowError;若JVM尝试扩展栈但无法分配足够内存(如系统内存不足),则抛出java.lang.OutOfMemoryError。 - 关键点:
- 栈大小直接影响线程可调用的最大嵌套方法深度。
- 减小
-Xss可支持更多线程(如-Xss256k),但需确保每个线程的栈空间足够。 - 默认值因JVM版本和操作系统而异(如64位Linux下通常为1MB)。
4. -XX:MaxMetaspaceSize=512m(元空间最大大小)
- 作用:设置元空间(Metaspace)的最大大小为512MB。元空间用于存储类的元数据(如类名、字段、方法等),替代了JDK 8之前的永久代(PermGen)。
- 是否可超越:否。元空间默认使用本地内存(Native Memory),其大小受
-XX:MaxMetaspaceSize限制。若加载的类数量过多或动态生成大量类(如使用CGLIB、反射等技术),元空间可能膨胀至512MB,此时JVM会触发Full GC回收无用类元数据;若回收后仍无法满足需求,则抛出java.lang.OutOfMemoryError: Metaspace。 - 关键点:
- 元空间初始大小由
-XX:MetaspaceSize(如-XX:MetaspaceSize=128m)设置,达到阈值后触发GC。 - 若未设置
-XX:MaxMetaspaceSize,元空间大小动态扩展,默认无上限(受系统内存限制)。 - 频繁加载/卸载类的应用(如热部署、OSGi环境)需合理设置该参数。
- 元空间初始大小由
总结
- 堆内存(
-Xms/-Xmx):存储对象实例,大小受-Xmx严格限制,超过则抛出堆内存溢出错误。 - 线程栈(
-Xss):每个线程私有,大小固定,超过则抛出栈溢出或内存溢出错误。 - 元空间(
-XX:MaxMetaspaceSize):存储类元数据,大小受参数限制,超过则抛出元空间溢出错误。
合理配置建议:
- 根据应用需求和物理内存设置
-Xms和-Xmx(通常设为相同值)。 - 根据线程数和递归深度调整
-Xss(如高并发应用可设为256KB~512KB)。 - 根据类加载数量和动态生成类的频率设置
-XX:MaxMetaspaceSize(如512MB~1GB)。 - 使用监控工具(如
jstat、VisualVM)观察内存使用情况,动态调整参数。
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/19372152

浙公网安备 33010602011771号