前言
首先默认大家知道新生代,老年代和永久代的概念,不懂的请自行百度。
1.堆内存溢出
新生代+老年代 = 堆内存, (OutOfMemoryError:Java heap space) 是指堆溢出
可以通过设置-Xms:1024m, -Xmx:2048,来设置堆内存大小,其中,-Xms:表示初始化堆大小,-Xmx:表示最大堆大小
2. 永久代溢出
永久代溢出(OutOfMemoryError: PermGen space)可以分为两种情况,第一种是常量池溢出,第二种是方法区溢出。可以通过设置-XX:PermSize = 512m, -XX:MaxPermSize=1024m,来改变永久代内存大小。
3.栈内存溢出
一般递归容易引起栈内存溢出(StackOverflowError)
-Xss:1m,表示每个线程堆栈的大小
常用法则1:
堆初始值和最大值设置为老年代的3~4倍
常用法则2:
永久代的初始值和最大值应该比永久代活跃数据大1.2~1.5倍
常用法则3:
新生代空间应该为老年代空间活跃数据的1~1.5倍
内存溢出常见原因:
栈内存溢出:程序所要求的栈深度过大。
堆内存溢出: 分清内存泄露还是 内存容量不足。泄露则看对象如何被 GC Root 引用,不足则通过调大-Xms,-Xmx参数。
永久代溢出:Class对象未被释放,Class对象占用信息过多,有过多的Class对象。