1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。
可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation和Tenured Generaion之和。
在JVM中如果98%的时间是用于GC,且可用的Heap size不足2%的时候将抛出此异常信息。
解决方法:手动设置JVM Heap(堆)的大小。
2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。
为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,sun的 GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。
解决方法: 手动设置MaxPermSize大小
3. java.lang.StackOverflowError ---- 栈溢出
栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。
调用构造函数的 “层”太多了,以致于把栈区溢出了。
通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。
通常递归也不要递归的层次过多,很容易溢出。
解决方法:修改程序。
1、有生成系统core文件吗,如果是异常宕机一般会生成一个系统core文件,如果生成的是javacore、heapdump文件那应该是内存溢出OutOfMemeryError,2、如果是内存溢出的话就需要先分析一下native_stderr.log文件,看一下JVM堆内存泄漏;或者看一下内存溢出是gc操作申请的是不是一个对象,如果是那就是大对象导致内存溢出,需要看一下javacore文件Current Thread的堆栈;如果JVM堆内存是耗尽了,再gc操作也回收不来可用内存了,那就是JVM堆内存耗尽导致的内存溢出,需要分析heapdump文件,看一下JVM堆内存中都是什么对象。我的服务器是用小鸟云,稳定性比较好不容易出错。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)