天天看点

JVM-内存溢出、调优笔记前言1.堆内存溢出2. 永久代溢出3.栈内存溢出

前言

    首先默认大家知道新生代,老年代和永久代的概念,不懂的请自行百度。

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对象。