JVM启动参数与java.lang.OutOfMemoryError

来源:互联网 发布:淘宝卖家号购买 编辑:程序博客网 时间:2024/05/29 18:51

前言


java.lang.OutOfMemoryError,这个主要是JVM参数没有配好引起的。

OutOfMemoryError分两种:java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space。

前者是有关堆内存的内存溢出,可以通过配置-Xms和-Xmx参数来解决。

后者是有关非堆内存的内存溢出,可以通过配置-XX:PermSize和-XX:MaxPermSize来设置。


参数的含义


-Xms:JVM初始分配的堆内存

-Xmx:JVM最大允许分配的堆内存,按需分配

-XX:PermSize:JVM初始分配的非堆内存

-XX:MaxPermSize:JVM最大允许分配的非堆内存,按需分配

在Intellij IDEA中的Tomcat容器中进行设置,如下图所示:




堆内存和非堆内存

堆内存

JVM留给开发者用的内存。一般存放对象以及数组。JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。空余堆内存小于40%时,JVM就会增大堆内存直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆内存直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆内存的大小。如果-Xmx不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。

非堆内存: 

JVM留给自己用的内存。方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。JVM初始分配的非堆内存由-XX:PermSize指定,默认是物理内存的1/64;JVM最大分配的非堆内存由-XX:MaxPermSize指定,默认是物理内存的1/4。(还有一说:MaxPermSize缺省值和-server -client选项相关,-server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m)

-XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space,原因如下:

PermGen space用于存放Class和Meta的信息,GC不会对PermGen space进行处理,所以如果Load很多Class的话,就会出现上述Error。这种Error在web服务器对JSP进行pre compile的时候比较常见。

在用Spark加载模型时,遇到了

java.lang.OutOfMemoryError: PermGen space这个错误,导致这个错误的主要原因是加载的模型中有大量的metadata信息,该部分全部放在非堆内存中,对非堆内存进行设置后,不再报该错误。

0 0
原创粉丝点击