每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。

某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当前帧内数据执行操作。

每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧。而这个新帧自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等数据。

Java方法可以以两种方式完成。一种通过return返回的,称为正常返回;一种是通过抛出异常而异常终止的。不管以哪种方式返回,虚拟机都会将当前帧弹出Java栈然后释放掉,这样上一个方法的帧就成为当前帧了。

Java帧上的所有数据都是此线程私有的。任何线程都不能访问另一个线程的栈数据,因此我们不需要考虑多线程情况下栈数据的访问同步问题。当一个线程调用一个方法时,方法的的局部变量保存在调用线程Java栈的帧中。只有一个线程能总是访问那些局部变量,即调用方法的线程。

JVM栈之局部变量表:包含参数和局部变量

局部变量表存放了基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)。其中64位长度的long和double类型的数据会占用2个局部变量空间(slot)(下图1到3的原因),其余数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配。每个方法都对应一个栈帧。

public classStackDemo {//静态方法

public static int runStatic(int i, long l, float f, Object o, byteb) {return 0;

}//实例方法

public int runInstance(char c, short s, booleanb) {return 0;

}

}

其对应的局部变量表如下:

上方表格中,静态方法和实例方法对应的局部变量表基本类似。但有以下区别:实例方法的表中,第一个位置存放的是当前对象的引用。

JVM栈之操作数栈

Java没有寄存器,所有参数传递都是使用操作数栈。

public static int add(int a,intb){int c=0;

c=a+b;returnc;

}

压栈的步骤如下:

0:   iconst_0 // 0压栈

1:   istore_2 // 弹出int,存放于局部变量2

2:   iload_0  // 把局部变量0压栈

3:   iload_1 // 局部变量1压栈

4:   iadd      //弹出2个变量,求和,结果压栈

5:   istore_2 //弹出结果,放于局部变量2

6:   iload_2  //局部变量2压栈

7:   ireturn   //返回

如果计算100+98的值,那么操作数栈的变化如下图所示:

JVM栈之栈上分配(动态链连接)

小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上

直接分配在栈上,可以自动回收,减轻GC压力

大对象或者逃逸对象无法栈上分配

java栈的内存_JVM的栈内存相关推荐

  1. java 老年代 占用空间_JVM之堆内存(年经代,老年代)

    一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  2. java线程工作内存在栈中吗_JVM常见面试题解析

    前言 总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新. 1.什么情况下会发生栈内存溢出. 思路: 描述栈定义,再描述为什么会溢出 ...

  3. bat java 指定堆大小_jvm 堆内存 栈内存 大小设置 查看堆大小

    1.在eclipse设置JVM参数 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前使用的J ...

  4. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  5. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  6. 常见Java面试题之解释内存中的栈、堆和静态区用法

    栈(stack).堆(heap)和静态区(static area)的用法区别 * 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间: * 通过new关 ...

  7. java内存堆和栈_java中堆,栈主要区别及内存存储

    java堆.栈.堆栈的区别 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度 ...

  8. C语言内存模型的栈帧,java内存模型(线程独占部分)

    线程独占部分 1.你了解Java的内存模型吗? 内存简介 有内核空间.用户空间(java是运行在用户空间上) 32位系统--->最大的访问内存大小是4G 62位系统--->最大的访问内存大 ...

  9. Java - 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 通常我们定义一个基本数据类型的变量,一个对象的引用, ...

最新文章

  1. web服务枚举组件不可用
  2. CCNP-1 EIGRP基本配置(BSCI)
  3. 【颠覆认知】为什么YouTube广告只看五秒更赚钱,微博商业产品经理深度剖析。...
  4. oracle 密码文件作用,测试 oracle 密码文件在何时起作用
  5. (二)docker安装并持久化postgresql数据库
  6. leetcode 617. Merge Two Binary Trees | 617. 合并二叉树(Java)
  7. 使用SAP WebIDE往Github上推送代码修改时遇到错误消息 Commit request failed Commit failed. Ref must be HEAD and is HEAD
  8. mysql设置定位慢查询_mysql优化——定位慢查询
  9. ASP.NET Core中如何调整HTTP请求大小的几种方式
  10. eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API
  11. Bash脚本教程之数组
  12. python生成多个列表_python生成多个只含0,1元素的随机数组或列表(代码)
  13. 互联网晚报 | 8月27日 星期五 | 爱奇艺取消未来几年偶像选秀节目;百度App月活跃用户突破6亿;陌陌连续26个季度盈利...
  14. Project Life Cycle
  15. mysql recordcount 1_[转载]ADO记录集GetRecordCount()返回记录条数为啥总为-1
  16. 山寨式创业 八百客誓做“管理软件终结者 ”
  17. 三菱伺服调试软件_【精品】三菱MR-J4系列伺服驱动器一键自整定操作流程
  18. 金蝶注册不了服务器,金蝶KIS专业版V10.0加密服务器无法注册?
  19. 卡诺图化简及逻辑函数的规范范式:SOP与POS形式
  20. 我的口号:我是金鳞,我敢评!

热门文章

  1. python写乘法口诀表好记方法_如何用python编写乘法口诀表
  2. 常用库函数_跑马灯实验和我为什么使用库函数?
  3. echarts 其他样式 折线 重叠_echarts 折线图 areaStyle颜色重叠问题
  4. java 中的 什么意思啊_JAVA 中的 - 是什么意思?
  5. 电脑亮度多少对眼睛好_激光治疗近视眼大概要多少费用,保护好眼睛要做到哪几点...
  6. linux下怎么创建root,Linux用root账号创建一个新的登录账号的方法
  7. 注解形式控制器 数据验证,类型转换(3)
  8. 关于腾讯应用管理中心,认领应用
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的账单管理系统
  10. sql服务器时间不正确,使用更改 CPU 频率的实用工具或技术时,SQL Server 计时值可能不正确...