精华内容
下载资源
问答
  • JVM虚拟机栈& 本地方法栈

    千次阅读 2020-09-13 16:01:14
    Native Method Stack两种架构模型简介虚拟机栈概述特点区别与堆生命周期可能出的异常(错误)栈的存储单位栈帧的内部结构演示代码字节码执行过程图示本地方法栈概述(Native Method Stack)本地方法 两种架构模型简介 ...

    两种架构模型简介

    1. 栈的指令架构模型: 用于资源受限的系统, 操作只有入栈(压栈)和出栈, 使用0地址指令, 因此无需考虑地址分配
    • 优点: 移植性强适合跨平台设计
    • 缺点: 指令集小(每8位进行对齐), 所以每次操作需要更多的指令, 因此性能上不如寄存器架构模型
    1. 寄存器架构模型: 典型的应用是x86的二进制的指令集 如传统 PC, Android的 davlik虚拟机. 指令集完全依赖于硬件, 是 CPU直接执行的
    • 优点: 效率高
    • 缺点: 移植性差, 硬件耦合度高, 16位指令对齐

    虚拟机栈概述

    • Hotspot虚拟机是基于栈的指令架构. JVM支持多个线程并行的执行, 每个线程都对应一份虚拟机栈, 也是线程私有的. 主要作用是主管程序的运行

    特点

    • 操作方式只有入栈和出栈
    • 没有垃圾回收的问题

    区别与堆

    • 栈主要负责程序的运行, 而堆的主要作用是存储
    • 栈存储方法调用时产生的局部变量(如 8种基本数据类型, 对象引用地址), 而堆存储对象的实例
    • 栈没有 GC, 而堆有 GC
    • 栈是不同线程间是隔离的, 而堆是共享的

    生命周期

    • 虚拟机栈是随线程的开始和结束而创建和销毁

    可能出的异常(错误)

    栈大小可以是固定大小, 也可以动态扩展

    • 固定大小时, 一旦超出了栈的大小, 就会抛出 StackOverflowError(栈溢出异常)
    • 当可以动态扩展时, 一旦没有足够的内存用于扩展, 就会抛出 OutOfMemoryError(内存溢出异常)
      * 配置选项: -Xss1m设置线程栈深度
      * 更多调优相关参考: https://blog.csdn.net/qcl108/article/details/103476424

    栈的存储单位

    • 栈中保存的一个个栈帧(Stack Frame), 每个栈帧对应一个方法, 栈帧是栈的存储单位, 栈帧的大小影响栈的深度

    栈帧的内部结构

    • 局部变量表(Local Variables)
    • 操作数栈(Operand Stack), 又称表达式栈(Expression Stack)
    • 动态链接(Dynamic Linking), 又称指向运行时常量池的方法引用
    • 方法返回地址(Return Address)
    • 附加信息
      在这里插入图片描述
    1. 局部变量表
    • 主要存储方法的形参和方法体内的局部变量
    • 局部变量表又称局部变量数组(一个数字数组), 基本存储单元是 Slot(变量槽), 32位以内的数据类型只占一个 Slot(如 byte, short, char, boolean, float, int和 returnAddress类型), 64位类型占用两个 Slot(如 long, double). 通过索引可以获取变量值, 注 获取64位类型变量值时, 只需使用起始索引即可
    • 线程私有, 所以本身是不存在数据安全问题的, 不过多个线程修改指定线程上的变量时, 如果不考虑同步问题, 也会导致线程不安全的, 还有通过形参或返回(作用域不只在方法内部)的 StringBuilder变量也会导致线程不安全
    • 局部变量表所需要的容量大小是在编译时已确定下来的(就是局部变量数字数组的长度), 并保存在方法的 code属性下的 maximum local variables数据项中. 在方法运行期间是不会再改变局部变量表的大小
    • 方法的嵌套调用次数由栈的大小来决定. 一般, 栈越大, 方法嵌套调用次数越多, 然后形参和局部变量大小决定栈帧的大小, 同时会影响方法嵌套调用次数
    • 局部变量表中的变量只在当前方法调用中有效. 当方法执行结束时, 随着方法栈帧的销毁, 局部变量表也会随之销毁
    1. 操作数栈
    • 开始执行了一个方法, 会随之创建一个新的栈帧, 然后根据字节码指令, 往栈中写入或提取数据, 即入栈/出栈, 在方法体内再调用了其它方法同时有返回值的话, 其返回值将会被压入当前栈帧的操作数栈中
    • 主要用于保存计算过程的中间结果, 作为计算过程中的变量临时存储空间
    • 操作数栈是数组结构, 不过不能通过索引访问, 而只能通过出入栈方式访问数据. 其栈大小(深度)是编译时已设定好的

    演示代码

    
    public class TestStack {
        public void testMethod() {
            byte a = 15;
            int b = 10;
            int c = a + b;
        }
    
        public int testSum() {
            int a = 10;
            int b = 1000;
            int c = a + b;
            return c;
        }
    
        public void getTestSum() {
            int d = testSum();
            int e = 10000;
        }
    }
    
    

    字节码执行过程图示

    在这里插入图片描述
    在这里插入图片描述

    1. 动态链接
    • Java源文件被编译到字节码文件时, 将所有的变量和方法引用都作为符号引用保存在字节码文件的常量池里. 动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用(为了指令便于识别, 又剩空间)
    • 程序运行后, 将字节码文件中的常量池(Constant pool)放到方法区的运行时常量池里
    • 每个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用. 包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接
    1. 方法返回地址
    • 保存调用方法的 PC寄存器的值方法返回地址
    • 一个方法的退出, 有两种方式: 正常退出和非正常退出(异常退出)
    • 无论通过那种方式退出, 在方法退出后都返回到该方法被调用的位置. 正常退出时, 当前 PC计数器的值作为返回地址. 而异常退出时, 不会返回任何值
    1. 附加信息
    • 虚拟机规范中, 栈帧中还允许携带与 Java虚拟机实现相关的, 对程序调试提供支持的信息

    本地方法栈概述(Native Method Stack)

    并不是所有的 JVM都支持本地方法, 因为 Java虚拟机规范上, 并没有明确要求本地方法的使用语言和具体实现方法. Hotspot VM是本地方法栈和虚拟机栈合二为一的虚拟机

    • 本地方法栈是管理本地方法运行的, 本地方法是通过 C语言实现的, 在 Execution Engine执行时加载本地方法库(Native Method Library)
    • 与虚拟机站相同: 没有 GC, 不同线程间是隔离的(线程私有的)

    本地方法

    • 当调用了一个本地方法时, 就会进入不再受虚拟机限制的环境, 级别与虚拟机一样, 所以可以访问任何虚拟机内部的运行时数据区
    • 可以直接使用本地处理器的寄存器
    • 可以直接使用本地内存

    如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

    展开全文
  • JVM的本地方法栈

    2021-02-12 20:12:01
    对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。...任何本地方法接口都会使用某种本地方法栈。当...

    对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。

    本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。

    任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态连接并直接调用指定的本地方法。

    如果某个虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈。当C程序调用一个C函数时,其栈操作都是确定的。传递给该函数的参数以某个确定的顺序压入栈,它的返回值也以确定的方式传回调用者。同样,这就是虚拟机实现中本地方法栈的行为。

    很可能本地方法接口需要回调Java虚拟机中的Java方法,在这种情况下,该线程会保存本地方法栈的状态并进入到另一个Java栈。

    下图描绘了这样一个情景,就是当一个线程调用一个本地方法时,本地方法又回调虚拟机中的另一个Java方法。

    这幅图展示了JAVA虚拟机内部线程运行的全景图。一个线程可能在整个生命周期中都执行Java方法,操作它的Java栈;或者它可能毫无障碍地在Java栈和本地方法栈之间跳转。

    add80b58da67a6740edcf8f130d0abaf.png

    该线程首先调用了两个Java方法,而第二个Java方法又调用了一个本地方法,这样导致虚拟机使用了一个本地方法栈。假设这是一个C语言栈,其间有两个C函数,第一个C函数被第二个Java方法当做本地方法调用,而这个C函数又调用了第二个C函数。之后第二个C函数又通过本地方法接口回调了一个Java方法(第三个Java方法),最终这个Java方法又调用了一个Java方法(它成为图中的当前方法)。

    展开全文
  • 本地方法栈

    千次阅读 2016-10-09 21:32:09
    本地方法栈(Native Method Stack) 与虚拟机栈所发挥的作用非常相似,它们的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。sun HotSpot虚拟机直接...

    本地方法栈(Native Method Stack) 与虚拟机栈所发挥的作用非常相似,它们的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。sun HotSpot虚拟机直接将本地方法栈和虚拟机栈合二为一。
    与虚拟机栈一样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

    展开全文
  • JVM体系结构及本地方法栈&方法区

    常用jvm

    目前市面上普遍使用的JVM大致有三种

    1. Sun公司的HotSpot——绝大多数java开发者都用的是这款,绝对的主力
    2. Oracle公司的JRockit——这款主要用于金融和军事
    3. IBM公司的J9 VM——这款是IBM硬件绑定的,用户也很少

    下面以HotSpot展开描述

    体系结构

    Java文件最终在JVM中执行,JVM运行在操作系统之上,它与硬件并没有直接的交互

    (灰色区域为线程私有,不存在垃圾回收;深色区域为共享区域,存在垃圾回收)

    在这里插入图片描述

    在这里插入图片描述

    堆&栈&方法区----戳我

    本地方法栈

    本地方法是线程私有的

    本地方法(native method):凡是带了native关键字的,说明java的作用范围达不到,会通过native调用操作系统C语言的库

    本地方法区:里面运行带native关键字的本地方法,并由执行引擎(Excutrion Engine)执行。执行引擎最终会调用本地方法库(Native Libraies)执行

    目前很少用JNI进行通信,更多的使用Socket、WebService等等

    方法区

    方法区是线程共享的运行时内存区域,它存储了每一个类的结构信息。运行时常量池、字段、方法数据、构造函数和普通方法的字节码内容都存在于方法区中。

    实例变量存在堆内存中,和方法区无关

    程序计数器

    每个线程都有一个程序计数器,是线程私有的,就是一个指针指向方法区中的方法字节码(用来存储指向类似于一条指令的地址,也即将要执行的指令代码),用于执行引擎读取下一条指令。它是一块非常狭小的空间。

    展开全文
  • 什么是本地方法栈? oracle官方文档jvms-se7 Java虚拟机的实现可以使用传统的堆栈(俗称“ C堆栈”)来支持native方法(用Java编程语言以外的语言编写的方法)。解释器的实现也可以使用诸如C之类的语言来解释Java...
  • Java虚拟机之虚拟机栈与本地方法栈

    千次阅读 2018-08-13 21:31:45
     每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧在虚拟机中入栈到出栈的过程。  局部变量表存放了...
  • 本地方法栈与Native方法

    千次阅读 2018-08-18 10:07:38
    刚开始看《深入理解Java虚拟机》,在里面看到一句话,不是很理解:本地方法栈与虚拟机栈所发挥的作用时非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机...
  • JVM本地方法栈(四)

    2020-09-22 10:38:50
    1、什么是本地方法栈 本地方法栈英文全称 Native Method Stack 是存放本地方法的地方。 2、 什么是本地方法 本地方法是没法使用Java语言编写的方法,是使用C或者C++ 编写的 3、方法的作用与特点 作用:是用于操作...
  • OutOfMemoryError异常——虚拟机栈和本地方法栈溢出。 由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此,对于HotSpot来说,虽然-Xoss参数(设置本地方法栈大小)存在,但实际上是无效的,栈容量只由-Xss...
  • java虚拟机栈和本地方法栈都是描述方法执行的内存模型,每个方法在执行的同时,都会创建一个栈帧,栈帧用于存储局部变量表等信息。每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈 的过程...
  • 1.概述HotSpot虚拟机直接把虚拟机栈和本地方法栈合二为一,因此对于HotSpot来说,虽然-Xoss参数(设置本地方法栈大小)存在,但实际上是无效的,栈容量只由-Xss参数设定2.StackOverflowError如果线程请求的栈深度...
  • 本地方法栈和Java虚拟机栈发挥的作用非常相似,主要区别是Java虚拟机栈执行的是Java方法服务,而本地方法栈执行Native方法服务(通常用C编写)。 有些虚拟机发行版本(譬如Sun HotSpot虚拟机)直接将本地方法栈和Java...
  • 什么是JVM中的本地方法栈

    千次阅读 2019-10-14 08:56:57
    本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。本地方法栈服务的对象是JVM执行的native方法,其就是一个java调用非java代码的接口,作用是与...
  • 栈其实也分两种,一种是虚拟机栈,一种是本地方法栈。而我们平常说的最多的,就是虚拟机栈。接下来就让我们走进这两个栈,看看他们是个啥。 1.虚拟机栈 虚拟机栈,即Java Virtual Machine Stacks,描述的是Java...
  • 最近在看《深入理解Java虚拟机》,书中给了几个例子,比较好的说明了几种...Java程序运行时,数据会分区存放,JavaStack(Java)、 heap(堆)、method(方法区)。1、JavaJava的区域很小,只有1M,特点是存...
  • 由于在HotSpot虚拟机中不区分虚拟机栈和本地方法栈,因此,对于HotSpot而言,-Xoss设置本地方法栈的参数失效 ,栈的容量大小只有Xss参数设置。虚拟机栈主要出现2种错误异常 如果线程请求的栈深度大于虚拟机栈所...
  • 本地方法栈及native方法

    千次阅读 2017-09-26 11:20:06
    看到虚拟机栈和本地方法栈的区别的时候有点疑惑,因为本地方法栈为虚拟机的Native方法服务。以下转载一篇关于native方法的介绍: http://blog.csdn.net/wike163/article/details/6635321 ——————————...
  • 本地方法栈.xmind

    2020-08-26 11:53:30
    自己总结的jvm中本地方法栈的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者自己总结的jvm中本地方法接口的笔记,绘制了详细的思维...
  • Stack(栈):每个线程包含一个栈区,栈中只...Native Method Stack(本地方法栈):本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Met...
  • 本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法...
  • 关于本地方法栈的详细介绍

    千次阅读 2018-10-23 23:11:20
    本地方法栈(Native Method Statck)与虚拟机所发挥的作用是非常相似的,它们之间的的区别不过是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机是有的Native方法服务。在虚拟机规范中对...
  • 栈内存溢出 本地方法栈 什么是JVM? 定义: JVM全称Java Virtual Machine(Java程序的运行环境(Java二进制字节码的运行环境)) 好处: 1.一次编译,到处运行(跨平台) 2.自动内存管理,垃圾回收功能 3.数组下标...
  • 为了保证线程中的局部变量不被其他线程访问到,虚拟机栈和本地方法栈是线程私有的。 虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行...
  • JVM的内存区域划分-- 堆、栈、方法区、本地方法栈、程序计数器   JVM的内存区域划分  JVM的内存区域划分  学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段...
  • 看到虚拟机栈和本地方法栈的区别的时候有点疑惑,因为本地方法栈为虚拟机的Native方法服务。以下转载一篇关于native方法的介绍: http://blog.csdn.net/wike163/article/details/6635321 ————————————...
  • 一、在 Java 虚拟机规范中,对虚拟机这个区域规定了两种异常状况:(1)如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常; (2)如果虚拟机可以动态扩展(当前大部分的 Java ...
  • 文章目录Pre运行时数据区总览 Pre JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】 JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】 JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 196,271
精华内容 78,508
关键字:

本地方法栈

友情链接: Exp1.rar