7 栈
线程运行需要的内存空间。
一个栈内由多个栈帧组成,一个栈帧代表一次方法的调用。
栈帧:每个方法运行时需要的内存。
方法内:参数,局部变量,返回地址。
方法执行结束,出栈。
方法一调用了方法二。
方法调用结束,将栈帧内存释放。
8 栈的演示
每个线程运行时只能对应一个活动栈帧,对应着正在执行的方法。
public class Demo1_1 {
public static void main(String[] args) {
method1();
}
private static void method1(){
method2(2,3);
}
private static int method2(int a,int b){
int c=a+b;
return c;
}
}
9 问题辨析
-Xss1m
垃圾回收和栈内存无关
栈内存越大,线程可能就越少。
10 问题辨析-线程安全
方法内的局部变量是否线程安全?
多个线程对变量是共享的还是私有的。
如果是每个线程私有,不需要考虑线程安全。
如果static int x=0;
线程1,2 共享变量。 针对多个线程是共享的。
11 线程安全
stringbuilder,如果当成了方法的参数或者返回值,意味着其他人可以拿到这个结果,就不是线程安全的了。
如果方法内局部变量没有逃离方法的作用范围,是线程安全的。
12 栈-内存溢出1
1、栈帧过多导致;
方法的递归调用;
2、栈帧多大;
不好复现,栈帧大小直接超过栈内存。
@JsonIgnore
13 内存溢出2
两个类中间的循环引用问题。
14 线程诊断–cpu占用高
top cpu使用和内存占用情况。 定位哪个进程对cpu占用过高。
ps H -eo pid,tid,%cpu|grep 进程id 定位是哪个线程引起的cpu占用过高。
jstack 进程id
找到线程和具体出现问题的行数。
15 线程诊断-迟迟得不到结果
程序运行很长时间没有结果。
多个线程发生死锁。
find one java-level deadlock:
jstack
16 本地方法栈
调用本地方法时,需要给它提供的空间。本地方法运行时,使用的内存,叫做本地方法栈。
不是由java编写的代码。
object类,native是没有方法实现的。
hashcode
wait();notify()