栈和内存溢出

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;
    }
}

栈和内存溢出_第1张图片

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()

你可能感兴趣的:(java,开发语言)