线程私有部分(指令区)-----运行时才有
image运行时数据区------内存分配和优化
运行时分配
生命周期是跟随线程的
异常情况
方法的递归调用
递归循环
package testWork;
// -Xss128k 设置虚拟机栈的大小为128k
public class JavaWNStackSOF {
private int stackLongth = 0; //调用方法的次数
//递归循环
public void tech() {//只会入栈,不会出栈了.(一次就有一个栈帧)
stackLongth++;
//做点其他事
tech();//再调用一次(不会 出栈)
}
public static void main(String[] args) throws Throwable {
JavaWNStackSOF oom = new JavaWNStackSOF();
try {
oom.tech();//调用方法
}catch (Throwable e) {
//输出异常时循环次数(不是一个普通的异常)
System.out.println("栈异常! 调用方法的次数(入虚拟机栈的栈帧次数)."
+oom.stackLongth);
throw e;
}
}
}
测试
package testWork;
public class JavaWNStackSOF {
/**
* Run-->Edit Configurations-->VN Options :设置虚拟机栈内存大小 -Xss128k
* -Xss128k 栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).993
* -Xss512k 栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).7310
* 默认大小 栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).24741
*/
private int stackLongth = 0; //调用方法的次数
//递归循环
public void tech() {//只会入栈,不会出栈了.(一次就有一个栈帧)
stackLongth++;
//做点其他事
tech();//再调用一次(不会 出栈)
}
public static void main(String[] args) throws Throwable {
JavaWNStackSOF oom = new JavaWNStackSOF();
try {
oom.tech();//调用方法
}catch (Throwable e) {
//输出异常时循环次数
System.out.println("栈异常! 调用方法的次数(入虚拟机栈的栈帧次数)."
+oom.stackLongth);
throw e;
}
}
}
加局部变量(栈帧中加内容:加大栈帧)
默认大小: 栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).16387
int a = 1;
int b = 2 ;
int c = ++a+ ++b;
优化策略
1.调整虚拟机的大小,调大还时调小? (虚拟机栈的大小设置 -Xss512k 默认 1M)
栈需要调整==小点==
线程的私有部分(程序计数器,本地方法栈,==虚拟机栈==)----线程运行时才有
高并发,多线程 : 栈的大小 1M = 1000线程同时运行 * 1M = 1G的运行内存
网友评论