JVM虚拟机栈

一、结构

就是一个栈,栈内元素是栈帧,每个栈帧对应一个方法的调用

二、定义

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类中的一些方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值