【参考链接】
内存溢出http://wiki.jikexueyuan.com/project/java-vm/storage.html
当某一块内存空间不够用时,就会出现内存溢出
前面我们知道,虚拟机的内存空间可以分为方法区、栈、堆
没有提供方式来设置整个虚拟机内存的大小
对于方法区
在Java1.8之前又可称为永久区,可以使用-XX:PermSize和-XX:MaxPermSize来指定
在java1.8及以后又可称为元数据区,可以使用-XX:MaxMetaspaceSize来指定
对于栈
可以使用-Xxs来指定每个线程的最大栈空间
对于堆
可以使用-Xms来指定初始堆空间,-Xmx来指定最大堆空间
方法区溢出
OutOfMemory
方法区主要是是存放类的运行时数据结构的
可以通过动态生成类来实验,以在1.8之前为例
栈溢出
OutOfMemory
每一个线程都要在栈中分配空间,用来存放栈帧等数据。如果创建的线程过多,导致栈空间不足则也会导致内存溢出
StackOverflow
每个线程都会在栈中分配空间,每次函数调用都会压入一个新的栈帧,所以当函数调用层级太多时也会导致栈内存不足。
而每个栈帧中存放局部变量表等数据,所以局部变量越多,每个栈帧所需的空间就越大,同等情况下所能调用的函数的层级就越少。
以如下代码为例
Java Code
1 | package com.shadowfaxghh.oom; |
以-Xss128K运行这个程序
如果的递归调用第二个方法的话则会更快报异常
堆溢出
OutOfMemory
以如下代码为例
Java Code
1 | package com.shadowfaxghh.oom; |
以-Xms4m -Xmx4m运行