内存泄露和内存溢出的区别
内存溢出通俗理解就是内存不够了,不能分配足够大的内存。
内存泄露就是程序中已动态分配的堆内存没有释放,造成内存浪费。可以发现内存泄露不停发生最终会导致内存溢出。
Java堆溢出
/**
* -Xms10m 启动时分配内存10m
* -Xmx10m 最大内存10m
* @param args
*/
public static void main(String[] args) {
List<OOMTest> list = new ArrayList<OOMTest>();
while (true) {
list.add(new OOMTest());
}
}
虚拟机栈和本地方法栈溢出
public class StackLeakTest {
public void leak() {
leak();
}
public static void main(String[] args) {
StackLeakTest stackLeakTest = new StackLeakTest();
stackLeakTest.leak();
}
}
方法区和运行时常量池溢出
/**
* -XX:PermSize=10M JVM初始分配的方法区的容量为10M
* -XX:MaxPermSize=10M JVM允许分配的方法区的最大容量为10M
* @param args
*/
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
while (true) {
sb.append("123");
}
}
总结
StackOverflowError异常
线程请求的栈深度大于虚拟机所允许的最大深度将抛出StackOverflowError异常。
OutOfMemoryError异常
虚拟机在扩展栈时无法申请到足够的内存空间将抛出OutOfMemoryError异常。