JVM-XX:NewRatio 、-XX:SurvivorRatio 参数的含义
2018-04-02 00:00
375 查看
摘要: https://blog.csdn.net/szzt_lingpeng/article/details/50463375
https://blog.csdn.net/szzt_lingpeng/article/details/50463375
-XX:NewRatio
-设置新生代(eden + 2survivor)和老年代(不包含永久区)的比例
-5 老年代:新生代 = 5 即新生代占整个堆内存的1/6
-XX:SurvivorRatio:
-设置新生代里,2*survivor区与eden的比例
-比如8,则两个Survivor:Eden = 2:8,一个Survivor区域占整个新生代的1/10
五、 常见内存错误及解决方案
1.OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏;二是调整JVM启动参数增大内存。OutOfMemoryError有好几种情况,每次遇到这个错误时,观察OutOfMemoryError后面的提示信息,就可以发现不同之处,如:
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: unable to create newnative thread
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Requested array sizeexceeds VM limit
2.java.lang.OutOfMemoryError:Java heap space
1)原因:Heap内存溢出,意味着Young和Old generation的内存不够。
2)解决:调整java启动参数 -Xms -Xmx 来增加Heap内存。
3.java.lang.OutOfMemoryError:unable to create new native thread
1)原因:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
2)解决:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS/MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。
4.java.lang.OutOfMemoryError:PermGen space
1)原因:Permanent Generation空间不足,不能加载额外的类。
2)解决:调整-XX:PermSize= -XX:MaxPermSize= 两个参数来增大PermGen内存。一般情况下,这两个参数不要手动设置,只要设置-Xmx足够大即可,JVM会自行选择合适的PermGen大小。
5.java.lang.OutOfMemoryError:Requested array size exceeds VM limit
1)原因:这个错误比较少见(试着new一个长度1亿的数组看看),同样是由于Heap空间不足。如果需要new一个如此之大的数组,程序逻辑多半是不合理的。
2)解决:修改程序逻辑吧。或者也可以通过-Xmx来增大堆内存。
6.java.lang.OutOfMemoryError: GC overhead limit exceeded
1)原因:在GC花费了大量时间,却仅回收了少量内存时,也会报出OutOfMemoryError,我只遇到过一两次。当使用-XX:+UseParallelGC或-XX:+UseConcMarkSweepGC收集器时,在上述情况下会报错,在HotSpot GC Turning文档上有说明:
The parallel(concurrent) collector will throwan OutOfMemoryError if too much time is being spent in garbage collection: ifmore than 98% of the total time is spent in garbage collection and less than 2%of the heap is recovered, an OutOfMemoryError will be thrown.
对这个问题,一是需要进行GC turning,二是需要优化程序逻辑。
7.java.lang.StackOverflowError
1)原因:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。
2)解决:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M
https://blog.csdn.net/szzt_lingpeng/article/details/50463375
-XX:NewRatio
-设置新生代(eden + 2survivor)和老年代(不包含永久区)的比例
-5 老年代:新生代 = 5 即新生代占整个堆内存的1/6
-XX:SurvivorRatio:
-设置新生代里,2*survivor区与eden的比例
-比如8,则两个Survivor:Eden = 2:8,一个Survivor区域占整个新生代的1/10
五、 常见内存错误及解决方案
1.OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏;二是调整JVM启动参数增大内存。OutOfMemoryError有好几种情况,每次遇到这个错误时,观察OutOfMemoryError后面的提示信息,就可以发现不同之处,如:
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: unable to create newnative thread
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Requested array sizeexceeds VM limit
2.java.lang.OutOfMemoryError:Java heap space
1)原因:Heap内存溢出,意味着Young和Old generation的内存不够。
2)解决:调整java启动参数 -Xms -Xmx 来增加Heap内存。
3.java.lang.OutOfMemoryError:unable to create new native thread
1)原因:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
2)解决:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS/MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。
4.java.lang.OutOfMemoryError:PermGen space
1)原因:Permanent Generation空间不足,不能加载额外的类。
2)解决:调整-XX:PermSize= -XX:MaxPermSize= 两个参数来增大PermGen内存。一般情况下,这两个参数不要手动设置,只要设置-Xmx足够大即可,JVM会自行选择合适的PermGen大小。
5.java.lang.OutOfMemoryError:Requested array size exceeds VM limit
1)原因:这个错误比较少见(试着new一个长度1亿的数组看看),同样是由于Heap空间不足。如果需要new一个如此之大的数组,程序逻辑多半是不合理的。
2)解决:修改程序逻辑吧。或者也可以通过-Xmx来增大堆内存。
6.java.lang.OutOfMemoryError: GC overhead limit exceeded
1)原因:在GC花费了大量时间,却仅回收了少量内存时,也会报出OutOfMemoryError,我只遇到过一两次。当使用-XX:+UseParallelGC或-XX:+UseConcMarkSweepGC收集器时,在上述情况下会报错,在HotSpot GC Turning文档上有说明:
The parallel(concurrent) collector will throwan OutOfMemoryError if too much time is being spent in garbage collection: ifmore than 98% of the total time is spent in garbage collection and less than 2%of the heap is recovered, an OutOfMemoryError will be thrown.
对这个问题,一是需要进行GC turning,二是需要优化程序逻辑。
7.java.lang.StackOverflowError
1)原因:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。
2)解决:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M
相关文章推荐
- JVM -XX:NewRatio、-XX:SurvivorRatio参数含义
- JVM -XX:NewRatio、-XX:SurvivorRatio参数含义
- jvm -XX:NewRatio -XX:SurvivorRatio 比值问题
- JVM GC的核心参数: -XX:Newratio -XX:Newsize -XX:Maxnewsize -XX:Surviorratio
- JVM -XX: 参数介绍(转)
- JVM -XX: 参数介绍
- JVM实用参数(三)打印所有XX参数及值
- Java JVM:内存结构和相关参数含义
- JVM参数-XX:+HeapDumpOnOutOfMemoryError设置
- JVM -XX: 参数介绍
- jvm 打印所有XX参数及值
- JVM参数:-XX:StringTableSize
- JVM -XX: 参数介绍
- JVM实用参数(三)打印所有XX参数及值
- jvm的参数含义及设置
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- JVM参数含义
- JVM常用参数含义
- jvm的参数含义及设置
- jvm_参数含义