精华内容
下载资源
问答
  • JVM本地方法栈(四)

    2020-09-22 10:38:50
    本地方法栈英文全称 Native Method Stack 是存放本地方法的地方。 2、 什么是本地方法 本地方法是没法使用Java语言编写的方法,是使用C或者C++ 编写的 3、方法的作用与特点 作用:是用于操作系统的交互, 特点:...

    1、什么是本地方法栈

    本地方法栈英文全称 Native Method Stack 是存放本地方法的地方。
    

    2、 什么是本地方法

    本地方法是没法使用Java语言编写的方法,是使用C或者C++ 编写的
    

    3、方法的作用与特点

    作用:是用于操作系统的交互,
    特点:使用native 修饰。常用的Object 类中的hashcode、wait 、notify、notifyAll 等都是本地方法
    
    展开全文
  • 本地方法栈和虚拟机栈 区别是什么? 相同点: 答: 1. 功能相同 创建栈帧-存放(局部变量表,操作数栈,动态链接,returnAddress); 2. 异常相同 超出栈深度-StackOverflowError 超出内存容量-OutOfMemoryError 3. ...

    本地方法栈和虚拟机栈 区别是什么?
    相同点:
    答:
    1. 功能相同 创建栈帧-存放(局部变量表,操作数栈,动态链接,returnAddress);
    2. 异常相同 超出栈深度-StackOverflowError 超出内存容量-OutOfMemoryError
    3. 线程私有 生命周期与线程所在
    4. 栈结构相同 先进后出
    不同点:
    答:执行服务不同
    java虚拟机栈 执行字节码服务
    本地方法栈 执行native方法服务

    展开全文
  • 线程与虚拟机

    2019-10-09 02:25:50
    虚拟机栈:与程序计数器、本地方法栈都是属于线程私有的JVM内存区域。虚拟机栈的生命周期是和线程相同的,是在JVM运行时创建的,在线程中,方法在执行的过程中会创建一个栈帧(Stack Frame)。主要用于存放局部变量...

    一、什么是虚拟机栈

    虚拟机栈:与程序计数器、本地方法栈都是属于线程私有的JVM内存区域。虚拟机栈的生命周期是和线程相同的,是在JVM运行时创建的,在线程中,方法在执行的过程中会创建一个栈帧(Stack Frame)。主要用于存放局部变量表、操作栈、动态链接、方法出口等信息。一般将栈帧内存的大小称为宽度,而栈帧的数量被称为虚拟机栈的深度。虚拟机栈的大小可以通过参数-xss配置。因此在同等大小的虚拟机栈下,如果局部变量表等占用的内存越小,虚拟机栈的深度越大。

    二、虚拟机栈的内部结构

    虚拟机栈是一个后入先出的栈。栈帧是保存在虚拟机栈中的,栈帧是用来存储数据和存储部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。线程运行过程中,只有一个栈帧是处于活跃状态,称为“当前活跃栈帧”,当前活动栈帧始终是虚拟机栈的栈顶元素。如下图所示: 

     

    栈帧

    1. 局部变量表

      局部变量表是一组局部变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java文件编译为Class文件时,就在方法表的Code属性的max_locals数据项中确定了该方法需要分配的最大局部变量表的容量。

    2. 操作数栈

      操作数栈也常被称为操作栈,它是一个后入先出栈。JVM底层字节码指令集是基于栈类型的,所有的操作码都是对操作数栈上的数据进行操作,对于每一个方法的调用,JVM会建立一个操作数栈,以供计算使用。和局部变量一样。操作数栈的最大深度也是编译的时候写入到方法表的code属性的max_stacks数据项中。操作数栈的每一个元素可以是任意的Java数据类型,包括long、double。32位数据类型所占的栈容量为1,64位数据类型所占的栈容量为2。栈容量的单位为“字宽”,对于32位虚拟机来说,一个“字宽”占4个字节,64位虚拟机来说,一个“字宽”占8个字节。当一个方法刚刚执行的时候,这个方法的操作数栈是空的,在方法执行的过程中,会有各种字节码指向操作数栈中写入和提取值,也就是入栈与出栈操作。例如,在做算术运算的时候就是通过操作数栈来进行的,又或者调用其它方法的时候是通过操作数栈来行参数传递的。 另外,在概念模型中,两个栈帧作为虚拟机栈的元素,相互之间是完全独立的,但是大多数虚拟机的实现里都会作一些优化处理,令两个栈帧出现一部分重叠。让下栈帧的部分操作数栈与上面栈帧的部分局部变量表重叠在一起,这样在进行方法调用返回时就可以共用一部分数据,而无须进行额外的参数复制传递了。

    3. 动态连接

       每个栈帧都包含一个指向运行时常量池中该栈帧所属性方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。在Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用,这种转化称为静态解析。另外一部分将在每一次的运行期期间转化为直接引用,这部分称为动态连接。

    4. 方法返回地址

      当一个方法被执行后,有两种方式退出这个方法。第一种方式是执行引擎遇到任意一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者(调用当前方法的的方法称为调用者),是否有返回值和返回值的类型将根据遇到何种方法返回指令来决定,这种退出方法方式称为正常完成出口(Normal Method Invocation Completion)。另外一种退出方式是,在方法执行过程中遇到了异常,并且这个异常没有在方法体内得到处理,无论是Java虚拟机内部产生的异常,还是代码中使用athrow字节码指令产生的异常,只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出,这种退出方式称为异常完成出口(Abrupt Method Invocation Completion)。一个方法使用异常完成出口的方式退出,是不会给它的调用都产生任何返回值的。     无论采用何种方式退出,在方法退出之前,都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。一般来说,方法正常退出时,调用者PC计数器的值就可以作为返回地址,栈帧中很可能会保存这个计数器值。而方法异常退出时,返回地址是要通过异常处理器来确定的,栈帧中一般不会保存这部分信息。 方法退出的过程实际上等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层方法的局部变量表和操作数栈,把返回值(如果有的话)压入调用都栈帧的操作数栈中,调用PC计数器的值以指向方法调用指令后面的一条指令等。

    5. 附加信息

      虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧中,例如与高度相关的信息,这部分信息完全取决于具体的虚拟机实现。在实际开发中,一般会把动态连接,方法返回地址与其它附加信息全部归为一类,称为栈帧信息。


    因此虚拟机栈的内存大小会直接影响线程创建的数量。假定内存中的堆内存的大小不变都是512M,虚拟机栈的大小会直接影响可创建线程数量的大小。虚拟机栈内存越大可创建的数量越小。即:JVM内存 = 堆内存 + 线程数量 * 栈内存。

    在不同的操作系统版本中,最大的地址空间是不一样的。32位的Windows最大是2G内存,因此可以得到这样的计算公式:
    线程数 = (最大内存地址 - Xmx - 系统保留内存)/ Xss

    当然线程数量和系统的内核配置还是有很大的关系。

     

    转载于:https://www.cnblogs.com/myitnews/p/11420748.html

    展开全文
  • 简单介绍一下,在JVM中的运行时数据区分为五大区域,分别是程序计数器、java虚拟机栈、本地方法栈、堆和方法区。 而今天我们主要讲的就是java虚拟机栈。这一块区域是线程私有的,也就是每一个线程就是一个栈,在这个...

    1.java虚拟机栈

    简单介绍一下,在JVM中的运行时数据区分为五大区域,分别是程序计数器、java虚拟机栈、本地方法栈、堆和方法区。

    而今天我们主要讲的就是java虚拟机栈。这一块区域是线程私有的,也就是每一个线程就是一个栈,在这个栈里存放的元素就是栈帧,这个栈帧说白了就是方法,每一个栈帧的入栈出栈就是一次方法的执行。在栈帧里主要有局部变量表,操作数栈,动态链接和方法出口。

    在这里插入图片描述

    了解这个东西离不开代码,我们先来定义一个简单地类,就让他实现两数相加的功能

    public class Number {    
        public static void main(String[] args) {        
            int a = 1;        
            int b = 2;        
            int c = a+b;    
        }
    }
    

    这个代码很简单,但我们想看到内部是如何实现的,现在我们对他进行反编译。

    javac Number.java  //生成class文件,文件位置与类在同一目录下
    javap -c Number.class   //对class文件进行反编译
    

    通过这两个命令我们就能得到我们想要的信息,下面来看一下

    Compiled from "Number.java"
    public class Number {
      public Number();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      public static void main(java.lang.String[]);
        Code:
           0: iconst_1    	//int型常量值1进栈
           1: istore_1    	//将栈顶int型数值存入第一个局部变量(a)
           2: iconst_2		//int型常量值2进栈
           3: istore_2		//将栈顶int型数值存入第二个局部变量(b)
           4: iload_1       //指定的int型局部变量进栈,这里就是a
           5: iload_2		//指定的int型局部变量进栈,这里就是b
           6: iadd			//栈顶两int型数值相加,并且结果进栈
           7: istore_3		//将栈顶int型数值存入第二个局部变量(c)
           8: return		
    }
    
    

    在上面所说的栈就是操作数栈, 很明显,对数据的操作必须依赖于操作数栈,变量存放在局部变量表里(这个从名字也能看出来好吧!),下面我们用图解的方式解释一下具体的操作。

    在这里插入图片描述

    首先会将int类型的数字1压入操作数栈,随后出栈并赋值给变量a,这样就完成了一次对变量a的赋值。同理,对b的赋值也是如此。

    在这里插入图片描述

    随后进行a+b的操作,首先他会将a和b的值依次进入操作数栈,然后再将1和2的结果相加并再次将结果压入栈中,这时操作数栈中就有一个int类型数据3,再将3出栈赋值给c,完成相加操作。

    2.i++与++i

    那我们知道了底层的操作之后是不是也能弄懂i++++i到底是怎么回事了!下面就让我们一起来探索一下。

    public class IAddTest {    
        public static void main(String[] args) {        
            int a = 0;        
            for (int i = 0;i<10;i++){            
                a = a++;        
            }        
            System.out.println(a);    
        }
    }
    

    很简单的小例子,如果你的面试官问你,你认为结果应该输出多少?如果你脱口而出10,那么凉凉,面试官眉头一皱,你感觉事情没那么简单。那么让我们一步步将这个小东西剖析开来。

    我们知道a++是先赋值,再自增,拆解成代码也就是 a = a; a = a +1;按照道理来说结果应该是10,因为每次都自增了,那为什么不是呢?

    Compiled from "IAddTest.java"
    public class IAddTest {
      public IAddTest();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      public static void main(java.lang.String[]);
        Code:
           0: iconst_0
           1: istore_1
           2: iconst_0
           3: istore_2
           4: iload_2
           5: bipush        10
           7: if_icmpge     21
          10: iload_1
          11: iinc          1, 1		//指定int型变量增加指定值(增加之后的结果,增加值)
          14: istore_1
          15: iinc          2, 1
          18: goto          4
          21: getstatic     #2          // Field java/lang/System.out:Ljava/io/PrintStream;
          24: iload_1
          25: invokevirtual #3          // Method java/io/PrintStream.println:(I)V
          28: return
    }
    
    

    这里我们主要看10、11、14,我们可以看到在执行a = a++时,它先把a的值压入操作数栈,这时候a的值是0,然后执行了iinc指令,注意,这时候局部变量表中的a的值发生了改变,变成了1。但是!但是!操作数栈中的数还是0!然后执行了什么命令呢?他执行了istore_1它把操作数栈中的0赋值给了a!!!这就明白了为啥最后输出是0了。

    在这里插入图片描述

    搞懂了i++,那++i自然也就懂了,与上面类似,只不过是先执行自增,再入栈出栈。至此我们通过剖析底层操作原理终于搞懂了这两者的区别!

    闲谈

    到了这我还有一个疑问(与上面的没关系,我自己瞎想的),那我定义一个非静态变量为什么不能再静态方法里使用(别忘了,main方法也是静态方法),这就要牵扯到数据在内存存储的具体情况了。

    如果是一个类的静态变量,那么这个变量存放在方法区里,而对于普通变量是必须要存放在实例中的,是存放在堆里面的,在栈帧中还有一个动态连接,这个就是指向这个栈帧所执行的方法,我们能通过这个引用找到这个类,并能获取这个类的类信息,自然也就能找到静态变量。而我们如果不新建一个类的实例的话,那么将没有这个普通变量,自然也就找不到,用不了。

    展开全文
  • java 堆和

    2019-08-05 18:59:07
    本地方法去 方法区 内存 堆内存 一、 基本数据变量和局部变量都是存放中的,以及main方法等方法也是存放中的,用完即消失。 对于来说很好理解,用完即释放。 1. 什么 是一种特殊的线性表。其...
  • 运行时数据区有方法区、堆、虚拟机栈、本地方法栈、程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。 Java虚拟机栈,与程序计数器一样,Java虚拟机栈也是线程私有的...
  • 我们平时在运行java程序时会在内存中划分出5个空间进行数据的存储:堆,,方法区,本地方法区,寄存器。 在这里我们主要简单的阐述一下堆和,其余的如果有空的话会进行讲解。 ok,现在我们需要知道一下什么是...
  • 彻底理解Java中堆和

    2021-06-14 09:19:41
    2:本地方法区。3:方法区。4:。5:堆。 2、堆内存 什么是堆内存? 堆内存是java内存中的一种,它的作用是用于存储java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给...
  • 方法区(HotSpot JVM独有),堆区(垃圾回收的重点区域),本地栈存放jvm运行时所需的c/c++库), 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概...
  • JVM内存模型(二)

    2019-05-15 17:50:46
    3.1. 什么本地方法栈本地方法栈和Java虚拟机栈实现的功能类似,只不过本地方法区是本地方法运行的内存模型。 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作...
  • 前面了解了JVM内存结构中的程序计数器、虚拟机栈、本地方法栈和堆之后,还有最后一个内存结构——方法区。 方法区从名字上看与我们类的方法有关,确实如此,但是还不是很完整的概括,对于方法区的定义各有千秋,但...
  • JVM面试题

    2019-12-29 22:41:34
    本地方法栈:和jvm栈所发挥的作用类似,区别是jvm栈为jvm执行java方法(字节码)服务,而本地方法栈为jvm使用的native方法服务。 JVM栈:局部变量表、操作数栈、动态链接、方法出口。 方法区:用于存储已被虚拟机...
  • 线程共享的有方法区和堆,线程私有的有栈、本地方法栈和程序计数器。 堆用来存放对象实例,栈用来存放形参或局部变量。 什么是垃圾回收机制 垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。 内存泄露是指该...
  • java虚拟机体系结构 方法区 堆 java虚拟机栈 本地方法栈 方法区 java虚拟机编译的class文件中二进制数据类型解析数据存在方法区中 是所有线程共享 和存在数据的线程安全问题 当二个线程使用同一类并且类还被加载 ...
  • Java8 方法

    2021-03-08 10:06:45
    Java8 方法什么是数组数组操作数组内存分配 什么是数组 数组一定是引用类型,可以存放多个数据,多个数据类型必须要统一 定义:数据类型[] 数组名称; 赋值:数组名称[地址值] = 值;...本地方法区 寄存器 ...
  • jvm管理的内存区域包括以下几个区域:栈区: 栈分为java虚拟机栈和本地方法栈1) 重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同。2) 每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态...
  • 18.方法区常见面试题

    2021-01-21 20:51:23
    本地方法区: 主要用于非java实现方法的调用 程序计数器: 保存当前程序指令地址 蚂蚁金服: Java8的内存分代改进 JVM内存分哪几个区,每个区的作用是什么? 一面:JVM内存分布/内存结构?和堆的区别?堆的结构?为...
  • JVM_是什么

    2020-09-06 09:38:40
    文章目录1.什么是JVM2、JVM、JRE、JDK 的关系3... `类装载器`(class loader)8、Native本地方法接口9、PC寄存器10、方法区1. 方法区中有啥?2. 创建对象内存分析11、1、存放啥?2、运行原理3、堆栈溢出StackOv
  • JVM内存管理

    2020-02-18 13:29:48
    栈又分为虚拟机栈和本地方法栈。 虚拟机栈中存放栈帧,每一个栈帧中存有局部变量表,操作数栈,动态连接等信息,java方法从开始到结束代表着栈帧的一次入栈出栈操作。本地方法栈是为native方法服务的。 程序计数器:...
  • JVM面试题集

    2017-02-21 00:15:33
    堆、虚拟机栈、方法区、本地方法栈、程序计数器 方法区:JVM加载的class对象、常量、静态常量 堆:几乎所有的对象实例 虚拟机栈:作为方法的内存模型,存放了方法的局部变量,操作数栈、动态链接、方法出口等. ...
  • java虚拟机相关知识点

    千次阅读 2021-02-02 14:40:24
    一、Java内存区域划分 1.Java内存区域到底划分了哪几个区? 大体上有五个分区 ,分别是 堆,方法区,虚拟机栈,...栈帧中存放局部变量表、操作数栈、动态变量表、方法返回地址本地方法栈:描述本地方法Native执行..
  • 先简单说说Java运行时内存区,划分为线程私有区和线程共享... 3、本地方法栈:虚拟机的Native方法执行的内存区; (2)线程共享区:  1、Java堆:对象分配内存的区域,这是垃圾回收的主战场;  2、方法区:存放类信
  • 1、分为5个区域,分别是程序计数器,虚拟机栈,本地方法栈,还有堆和方法区 2、他们各自有什么特点,存放什么数据 1)堆和方法区是所有线程共享的区域而程序计数器,虚拟机栈,本地方法栈是线程私有的 2)接...
  • JVM的内存结构

    2020-08-20 23:23:20
    本地方法栈:与虚拟机栈(Java栈)作用很相似,区别是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机用到的Native方法服务; 程序计数器:当前线程所执行指令的行号指示器 内存溢出和内存泄露的区别...
  • JVM内存模型

    2019-04-08 17:09:13
    JVM内存模型由堆、方法区、虚拟机栈、本地方法栈和程序计数器组成,堆和方法区是所有线程共享的,虚拟机栈、本地方法栈和程序计数器是线程私有的。 1、堆Heap 堆用于存放对象和数组 2、方法区Method Area 方法区...
  • JVM 内存相关

    2021-01-29 17:31:27
    JVM的内存模型是什么? 1、程序计数器 线程私有 ...虚拟机栈为Java方法服务,本地方法栈为虚拟机使用到的Native方法服务,也有StackOverflowError 和 OutOfMemoryError 异常。 4、堆 线程共享 主要存放
  • jvm优化

    2019-01-10 23:21:53
    内存模型 简单看了一下内存模型,简单看看每个区域究竟存储的是什么(干的是什么): 堆:存放对象实例,几乎所有的对象...本地方法栈本地方法栈则是为虚拟机使用到的Native方法服务。 方法区:存储已被虚拟...
  • ​ ​内存溢出(Out Of Memory)经常简称为OOM,在jvm中主要分为方法区、堆、栈、本地方法栈、程序计数器这几部分,其中程序计数器是唯一不会出现OOM的,也就是说其他区域都会出现OOM。下面来分别说明几个区域出现...
  • jvm学习总结

    2018-06-23 12:33:03
    一、java内存划分从图中可以看出: 1、线程共享:方法区、堆 2、线程私有:程序计数器、java虚拟机栈、本地方法栈 3、补充:直接内存(jdk1.4 引入nio)总结: 1、无论共享还是私有都属于运行时数据区域 2、栈...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 142
精华内容 56
关键字:

本地方法栈存放什么