JVM启动参数设置

前言

有时候程序会碰到java.lang.OutOfMemoryError,这个主要是JVM参数没有配好引起的。

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

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

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

参数的含义

打开eclipse的eclipse.ini会看到如下参数:

-vmargs

-Xms128M

-Xmx512M

-XX:PermSize=64M

-XX:MaxPermSize=128M

-vmargs:用来说明后面的就是JVM的参数了

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

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

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

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

堆(Heap)内存和非堆(Non-Heap)内存

堆内存

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的时候比较常见

你可能感兴趣的:(【Java】)