栈是运行时单位,堆是存储单位,栈是用来解决程序的运行问题的,或者说是程序是如何处理数据的。
栈是线程私有的,他用来存放实例对象的方法。以及方法运行时的局部变量(八大基本类型和对象的引用。)
栈的特点:栈是快速的存储方式,仅次于程序计数器
jvm 对栈 的操作只有方法的进栈和出栈。
栈不存在垃圾回收(因为方法在执行之后就被压出栈了)
栈存在内存溢出(当递归不当时,方法循环调用时就造成了栈溢出 stackoverflow error)
开发过程中遇到的异常 或者栈在运行过程中可能发生的异常?
栈的内存大小可以是定值,也可以是动态增加的,
当栈的内存是定值,递归不当时,方法循环调用时就造成了栈溢出 stackoverflow
当栈的内存大小是动态增加的,内存被占完了无法栈无法再申请内存进行扩展,或者无法为新的线程分配足够的内存去创建其私有的栈就会报 outofmemory error (oom)内存溢出
可以用-Xss来设置栈的内存大小。
栈的存储结构和运行原理
栈里面存储的是栈帧,每一个方法都对应着一个栈帧。
运行原理:一个线程一个时间点只有一个栈帧在工作,正在工作的栈帧就是当前栈帧,当前栈帧里的方法就是当前方法,定义当前方法的类就是当前类,一个线程的栈帧不能与另外线程的栈帧进行相互调用作用
执行引擎的字节码指令只对当前栈帧起作用
如果在当前方法里调用了另一个方法,则执行到这一步时,这个被执行的方法就会被放到栈帧被压到栈顶成为当前方法,当这个方法执行完之后,这个方法会对应的栈帧就会被压出栈,同时会把结果返回给调用方法,调用方法再次成为当前方法。
java有两种返回函数的方式,一种是正常return,一种程序在处理时出现未处理的异常,这两种哪一种都会使栈帧被弹出