开发过程中,或程序运行过程中每次遇到OutOfMemory异常或GC异常或StackOverflowError异常我们都是一堆参数乱配,
都把值调大,只是大体知道是跟jvm内存分配有关, 具体应该怎么调,对应的异常应该调整那些参数,
或者换句话说,jvm内存分配区域中都分别对应那些参数大多数情况下都是不知道的,只是把相关的参数跳上去,预期结果都是应该起作用,到底能不能起作用,自己心里也没底。
下面就来说一下jvm堆、栈、方法区等内存区域对应的参数,及每个区域可能抛出的异常类型,发生异常的场景分析。
参数类型
- 堆空间参数
- 栈空间参数
- 方法区空间参数
- 本机直接内存参数
异常类型
- 1.OutOfMemory异常
- 2.StackOverflowError异常
辅助参数说明
- -XX:+HeapDumpOnOutOfMemoryError 打印堆内存异常时打印出快照信息
- -XX:+HeapDumpPath 快照输出路径
- -Xmn指定eden区的大小
- -XX:SurvirorRation来调整幸存区的大小
- -XX:PretenureSizeThreshold设置进入老年代的阀值
参数说明、对应场景的异常
堆内存参数
-Xms:堆最小值(新生代和老年代之和)
-Xmx:堆最大值(新生代和老年代之和)
当最小值=最大值时,这时堆内存是不可扩展的。
例:-Xms80M -Xmx80M
通常将-Xmx和-Xms设置为一样的大小来减少gc的次数,堆内存不足时抛出OutOfMemoryError异常。
栈内存参数
-Xss
例:-Xss128k
单线程下无论栈帧太大还是栈容量太小,及引用深度超过虚拟机允许深度都会抛出StackOverflowError每个方法压入栈的帧大小是不一致的。
多线程下当每个线程分配栈帧太大内存不能够扩展时抛出OutOfMemoryError异常线程栈帧越大,可创建的线程越少。
方法区参数
-XX:PermSize方法区内存最小值
-XX:MaxPermSize 方法区内存最大值
各个线程共享的内存区域,主要用来存储类的元数据、常量、静态变量、即时编译器编译后的代码等数据
例:-XX:PermSize=20M -XX:MaxPermSize=20M
异常类型 OutOfMemoryError :
原因:常量过多,或代理反射等使用频繁
本机直接内存参数
-XX:MaxDirectMemorySize
例:-XX:MaxDirectMemorySize=10M
不足时抛出OutOfMemory异常

相关推荐
版权声明
- 本文链接: https://www.cayzlh.com/2018/08/19/95c0309a.html
- 版权声明: 文章内容仅用作学习和分享,如有雷同,纯属拷贝。
留言区