一、结构
就是一个栈,栈内元素是栈帧,每个栈帧对应一个方法的调用
二、定义
1、英文java virtual mechine stack
2、每个线程运行时需要的内存称为虚拟机栈
3、每个线程只能有一个活动栈帧,即当前位于栈顶部的栈帧,对应当前执行的方法
三、问题辨析:
1、栈是否越大越好?
答:不是,栈越大,线程数越少
以上是一些来自oracle的常见操作系统的栈大小。
window可以通过制定虚拟机参数VM options调整JVM栈大小,比如 -Xss256k 指定栈大小为256KB
2、垃圾回收是否涉及栈内存?
答:不涉及
3、方法内的局部变量是否线程安全?
答:分情况讨论:
1)当变量的作用范围只有这个方法,则是,因为多个线程之间不共享栈;
2)当变量作用范围到了该方法之外,如静态的static修饰的变量可以被不同栈共享,变量被返回了,或这变量是参数传进来的,就不一定线程安全。
四、栈内存溢出
1、什么情况会栈内存溢出
1)栈帧过多:
常见于递归
2)栈帧过大:
很少见,因为一个Int才四字节,一个栈帧往往是1MB,即2^20个字节。
五、栈运行诊断(与栈相关)
1、cpu占用过多
解决流程
"ps H -eo pid,tid,%cpu | grep 进程id"命令解析:
ps:
ps 命令用于显示当前系统中的进程(process)信息。
H(大写):
作用:以线程(Thread)为单位显示信息,而不是默认的进程(Process)。
没有 H 选项时,ps 只显示进程,而不会单独列出每个线程。
-eo:
作用:自定义输出格式,-e 代表列出所有进程,-o 让用户指定显示的字段。
pid:
进程 ID(Process ID),表示该线程所属的进程 ID。
tid:
线程 ID(Thread ID),表示线程的唯一标识符。
在 Linux 中,TID 和 PID 在单线程进程中相同,但在多线程进程中,多个 TID 会对应同一个 PID。
%cpu:
线程占用的 CPU 百分比。
该值表示该线程在过去一段时间内使用的 CPU 资源比例。
| grep 进程id
作用:筛选出指定进程 ID(PID)对应的所有线程。
因为 ps H -eo 会显示所有线程的信息,使用 grep 进程id 可以只显示目标进程的线程。
2、程序运行很长时间没有结果
答:可能是发生了死锁,可由 jstack 进程id 命令排查
五、本地方法栈
1、定义:调用本地方法时占用的内存空间,即JVM专为本地方法分配的内存
本地方法往往有native前缀,由C/C++实现;比如Object类中的一些方法