一、jvm参数设置
-XX:+PrintGCDetails:打印GC信息
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump:如果发生了OOM异常,那就把dump信息导出到d:/a.dump文件中
-Xmx –Xms:指定最大堆和最小堆
-Xmn:设置新生代大小
-XX:PermSize:永久区初始大小
-XX:MaxPermSize:永久区最大空间
-Xss:栈空间大小设置
-XX:NewRatio:新生代(eden+2*s)和老年代(不包含永久区)的比值, 例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5
-XX:SurvivorRatio(幸存代):设置两个Survivor区和eden的比值,例如:8,表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10
二、堆的分配参数总结:
1.根据实际事情调整新生代和幸存代的大小
2.官方推荐新生代占堆的3/8,幸存代占新生代的1/10
3.在OOM时,记得Dump出堆,确保可以排查现场问题
4.新生代分配的空间不同,默认的-XX:SurvivorRatio也不一样,有1,6等值
5.适当减小幸存代大小,这样的话,能够减少GC的次数
三、永久区分配参数:
设置永久区的初始空间和最大空间。也就是说,jvm启动时,永久区一开始就占用了PermSize大小的空间,如果空间还不够,可以继续扩展,但是不能超过MaxPermSize,否则会OOM。
他们表示,一个系统可以容纳多少个类型,我们知道,使用CGLIB等库的时候,可能会产生大量的类,这些类,有可能撑爆永久区导致OOM。于是,我们运行下面这段代码: