1. java.lang.OutOfMemoryError: PermGen space 持久代內(nèi)存溢出
持久代主要存放Class字節(jié)碼信息耙箍,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理。
解決方法(具體數(shù)值按需設(shè)置):
初始持久代內(nèi)存大兴肘伞:-XX:PermSize=256m
最大持久代內(nèi)存大斜缋ァ:-XX:MaxPermSize=1024m
tomcat的bin目錄下catalina.sh設(shè)置方法:
在echo "Using CATALINA_BASE: $CATALINA_BASE"
上面添加JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m
編輯器IDEA設(shè)置方法:
2. java.lang.OutOfMemoryError: Java heap space 堆內(nèi)存溢出
解決方法:
JVM初始化堆內(nèi)存大小:-Xms256M(默認物理內(nèi)存的1/64(<1GB))
JVM最大的堆內(nèi)存大形锱纭:-Xmx2048M(默認物理內(nèi)存的1/4(<1GB))
Server端JVM建議-Xms設(shè)置與-Xmx相同卤材,可以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
設(shè)置新生代大新褪А:-Xmn扇丛,整個堆大小=新生代大小 + 年老代大小。
增大新生代后尉辑,將會減小年老代大小帆精,此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。
代碼獲取內(nèi)存信息:
Runtime.getRuntime().maxMemory()//獲取最大內(nèi)存
Runtime.getRuntime().freeMemory()//獲取空閑內(nèi)存
Runtime.getRuntime().totalMemory()//獲取可用總內(nèi)存
Java會盡可能將可用總內(nèi)存的值維持在最小堆內(nèi)存卓练。
3. java.lang.StackOverflowError:棧溢出
通常是由于遞歸調(diào)用造成的隘蝎,所以寫遞歸的時候,一定不要少了遞歸出口襟企≈雒矗快速排序、樹節(jié)點組裝等都少不了遞歸顽悼。
棧主要存放局部變量曼振,先進后出原則
設(shè)置每個線程的棧大小:-Xss128K(實際值需要經(jīng)過嚴格的測試)蔚龙。
JDK5.0以后每個線程棧大小為1M冰评,以前每個線程棧大小為256K。在相同物理內(nèi)存下木羹,減小這個值能生成更多的線程甲雅。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)是有限制的,不能無限生成坑填,經(jīng)驗值在3000~5000左右抛人。
在程序中查詢配置參數(shù):
List<String> arguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
System.out.println(StringUtils.join(arguments,","));
打印輸出:
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56570,suspend=y,server=n,-Xms256M,-Xmx1024M,-XX:PermSize=256m,-XX:MaxPermSize=1024m,-Dmaven.home=D:\Tools\apache-maven-2.2.1,-Dclassworlds.conf=D:\Tools\apache-maven-2.2.1\bin\m2.conf,-Dfile.encoding=UTF-8