写Java代码分别使堆溢出,栈溢出
?
我们知道,在JAVA中,可以使用关键字new来创建Java对象。例如,
ArrayList list = new ArrayList();
实际上,在创建完上面的一个对象后,在JVM中,会把new出来的对象存放在堆内存中,
同时,在方法栈中存放着对象的引用关系。
如果想要堆溢出,比较简单,可以循环创建对象或大的对象;
如果想要栈溢出,可以递归调用方法,这样随着栈深度的增加,JVM 维持着一条长长的方法调用轨迹,
直到内存不够分配,产生栈溢出。
?
因此,可以使用下面简单的代码实现堆溢出和栈溢出。
public class Test { public void testHeap(){ for(;;){ ArrayList list = new ArrayList (2000); } } int num=1; public void testStack(){ num++; this.testStack(); } public static void main(String[] args){ Test t = new Test (); t.testHeap(); t.testStack(); }}?
?另外,Java虚拟机的堆大小如何设置:命令行
java –Xms128m //JVM占用最小内存
?????????? –Xmx512m //JVM占用最大内存
?????????? –XX:PermSize=64m //最小堆大小
?????????? –XX:MaxPermSize=128m //最大堆大小
?