精华内容
下载资源
问答
  • 线程是操作系统级别的,不是语言级别的。 因为Java语言中new Thread().start()中,其本质调用了一个native方法:start0(); native方法:调用的是Java无关的底层的...本地方法接口本地方法栈中登记标记为native...

     

    线程是操作系统级别的,不是语言级别的。
    因为Java语言中new Thread().start()中,其本质调用了一个native方法:start0();
    native方法:调用的是和Java无关的底层的操作系统库或者C语言函数库。
    本地方法接口(Native Interface)

     

    由于栈中存放方法,所以栈分了两类:Java栈(又叫虚拟机栈)、本地方法栈(Native Method Stack)(里面存放native方法)
    本地方法栈:
    本地方法接口在本地方法栈中登记标记为native的方法,当执行引擎执行时,本地方法接口调用native方法库

     


    程序计数器(Program Counter Register)(又叫PC寄存器)
    用来存储指向下一条指令的地址,也即将要执行的指令代码,其本质就是一个指针,如果执行的是native方法,那这个指针是空的

    属于灰色部分:即 线程私有(即每个线程对应一个PC寄存器)、内存占的特别少,几乎不存在垃圾回收

     


    方法区:所有线程共享、有垃圾回收
    方法区并不存放方法,而是存放类的模板(类的结构信息,以Class的形式存在,放在方法区中,由类加载器加载class得来)
    方法区是一种规范,在不同虚拟机中实现是不一样的:

     


    栈管运行
    堆管存储

    栈中主要存放方法(Java方法放进JVM中的虚拟机栈后,称为栈帧)(即一个方法对应一个栈帧)、基本变量、引用

    栈中的方法又叫栈帧(Java方法放进JVM中的虚拟机栈后,称为栈帧)
    所以栈中存放的是栈帧。
    例如:在main方法里面调用m1()方法,则虚拟机栈如图所示:(m1方法执行完后,main方法才能执行完)

    但其实,一般说栈帧里面存着两个东西:局部变量表+操作数栈
    说完全点,是下面这些:

    int i,j,k存在于局部变量表中,操作数栈中的结果赋值给局部变量表,++i、i++影响的是局部变量表中的数需不需要在放进操作数栈前先加1。
    ++i:修改局部变量表值直接加一,再放进操作数栈
    i++:先把局部变量表中的值取出来放进操作数栈,再局部变量表直接加一

    public static void main(String[] args) {
            int i = 1;
            i = i++;
            int j = i++;
            int k = i + ++i * i++;
            System.out.println("i=" + i);
            System.out.println("j=" + j);
            System.out.println("k=" + k);
    }
    //运行结果:i=4,j=1,k=11

     

    展开全文
  • 什么是本地方法 简单的讲,一个Native Method就是一个Java调用的非Java的接口。一个本地方法就是一个Java方法,但这个方法不是由Java语言实现的 ...JVM支持着Java语言本身运行时,是由一个解释

    什么是本地方法

    简单的讲,一个Native Method就是一个Java调用的非Java的接口。一个本地方法就是一个Java方法,但这个方法不是由Java语言实现的

    在定义一个本地方法的时候,并不提供实现体,因为其实现体并不是有Java来实现的。

    本地接口的作用是融合不同的语言为Java所用,初衷是融合C/C++程序

    在这里插入图片描述

    为什么使用本地方法

    • 与Java环境外交互
      • 有时Java需要与Java外面的环境交互,这是本地方法存在的主要原因
    • 与操作系统交互
      • JVM支持着Java语言本身和运行时库,是由一个解释器和一些连接到本地代码的库组成,经常依赖一些底层系统的支持,通过本地方法实现了jre与底层系统的交互,甚至JVM的一些部分就是C写的
    • Sun`s Java
      • Sun的解释器就是用C实现的,这使得它能像一些普通的C一样与外界进行交互。jre大部分是用Java实现的,也通过一些本地方法与外界交互

    本地方法栈

    • JVM虚拟机栈用于管理Java方法的调用,而本地方法栈管理本地方法的调用
    • 本地方法栈也是线程私有的
    • 允许被实现成固定或者是可动态扩展的内存带下(在内存溢出方面和虚拟机栈是相同的)
    • 本地方法是用C实现的
    • 具体做法是在本地方法栈中登记native方法,在Execution Engine执行时加载本地方法库

    在这里插入图片描述

    • 当某个线程调用一个本地方法时,他就进入了一个全新的并且不受虚拟机限制的世界,他和虚拟机拥有同样的权限
      • 本地方法可以通过本地方法接口访问虚拟机内部的运行时数据区
      • 可以直接使用本地处理器中的寄存器
      • 直接从本地内存的堆中分配任意数量的内存
    • 并不是所有的 JVM都支持本地方法,因为Java虚拟机规范并没有明确要求本地方法栈使用的语言、具体实现方法、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈
    • 在Hotspot JVM中,直接将本地方法栈与虚拟机栈合二为一
    展开全文
  • 一、由此可知JVM的基本结构包括:类加载器、内存区域、执行引擎、本地库接口 。 二、内存区域又可以划分为5个区域: JVM (Java Virtual Machine Stacks) 堆内存 (Heap Memory) 方法区 (Method Area) 本地...

    根据《java虚拟机规范》,JVM的基本结构如下图所示:

    在这里插入图片描述

    一、由此可知JVM的基本结构包括:类加载器、内存区域、执行引擎、本地库接口 。

    二、内存区域又可以划分为5个区域:

    1. JVM栈 (Java Virtual Machine Stacks)

    2. 堆内存 (Heap Memory)

    3. 方法区 (Method Area)

    4. 本地方法栈 (Native Method Stacks)

    5. 程序计数器 (Program Counter (PC) Register)

    三、详细说明这些区域的区别:

    1. JVM栈 (Java Virtual Machine Stacks)

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

       每个线程包含一个栈区,每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问,也就是说每个线程的栈数据是不能互相访问的。

       栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 。

       栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

    2. 堆内存 (Heap Memory)

      存储的全部是对象,每个对象包含一个与之对应的class信息–class的目的是得到操作指令。

       jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。

       堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。

       缺点是,由于要在运行时动态分配内存,存取速度较慢。

    3. 方法区 (Method Area)

       在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

       在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

       在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。

       当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。虽然JVM规范把方法区描述为堆的一个逻辑部分, 但它却有个别名non-heap(非堆)。

    4.本地方法栈 (Native Method Stacks)–不重要

       和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。
       Java官方对于本地方法的定义为methods written in a language other than the Java programming language,就是使用非Java语言实现的方法,但是通常我们指的一般为C或者C++,因此这个栈也有着C栈这一称号。一个不支持本地方法执行的JVM没有必要实现这个数据区域。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。
    在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

    5.程序计数器 (Program Counter (PC) Register)

       用于保存当前线程执行的内存地址。
       由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。
       注意这个区域是唯一一个不抛出OutofMemoryError的运行时数据区。


    PS(引用别人的回复关于堆、栈的私有、共享):第一,博客所讲述的栈内存是私有的,因为每一个线程都会有一个单独的栈,也就是说每个线程的栈数据是不能互相访问的,而堆在整个程序中只有一个,是被所有线程共享访问的。第二点,栈的共享是指的栈内存储值的共享模式,比如定义变量a和b的值都为3,那么这个栈里面只会存储一个3,被a和b同时共享,使用的是同一个存储地址。堆和栈的不共享是指例如创建一个字符串,String a=“a”,这个声明没有使用new对象出来,所以这个a是存储在栈内的,如果是String a=new String(“a”);这个是通过new出来的对象,是存储在堆中的,这两个a一个存储在栈中,一个存储在堆中是分别存储的,并没有共享一个存储地址。
    展开全文
  • 根据《java虚拟机规范》规定,JVM的基本结构一般如下图所示:由上图可知JVM基本机构包括:类加载器、内存区域、执行引擎、本地库接口 。这里我们说明一下内存区(也叫运行时数据区),运行时内存区主要可以划分为5个...

    本文针对JDK7及以前版本,JDK8之后结构有变动,将会在另一篇中做介绍

    在介绍jvm的堆、栈、方法区的区别之前需要先了解一下JVM的基本结构是什么。

    根据《java虚拟机规范》规定,JVM的基本结构一般如下图所示:

    由上图可知JVM基本机构包括:类加载器、内存区域、执行引擎、本地库接口 。

    这里我们说明一下内存区(也叫运行时数据区),运行时内存区主要可以划分为5个区域:

    1. JVM栈 (Java Virtual Machine Stacks) 

    2. 堆内存 (Heap Memory) 

    3. 方法区 (Method Area) 

    4. 本地方法栈 (Native Method Stacks) 

    5. 程序计数器 (Program Counter (PC) Register)

    接下里就详细说明一下这些区域的区别

    1. JVM栈 (Java Virtual Machine Stacks) 

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

    每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 。

    每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 

    栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

    2. 堆内存 (Heap Memory) 

    存储的全部是对象,每个对象包含一个与之对应的class信息–class的目的是得到操作指令。

    jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。  

    堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。 

    缺点是,由于要在运行时动态分配内存,存取速度较慢。

    3. 方法区 (Method Area) 

    在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

    在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

    在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。

    当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。虽然JVM规范把方法区描述为堆的一个逻辑部分, 但它却有个别名non-heap(非堆)。

    4. 本地方法栈 (Native Method Stacks) 

    和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。

    Java官方对于本地方法的定义为methods written in a language other than the Java programming language,就是使用非Java语言实现的方法,但是通常我们指的一般为C或者C++,因此这个栈也有着C栈这一称号。一个不支持本地方法执行的JVM没有必要实现这个数据区域。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。 

    在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

    5. 程序计数器 (Program Counter (PC) Register)

    用于保存当前线程执行的内存地址。

    由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。

    注意这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

    版权声明:本文为博主原创文章,未经博主允许不得转载。 

    http://http://blog.csdn.net/heart_mine/article/details/79495032

     

    展开全文
  • (本地方法接口本地方法栈中登记标记为native的方法,当执行引擎执行时,本地方法接口调用native方法)(即本地方法接口本地方法栈、执行引擎、本地方法的中心) 方法区不是放方法的区,是放类的描述...
  • 运行时数据区背一下:堆、栈(虚拟机栈、本地方法栈)、程序计数器、方法区(包含常量池)。除此之外还有本地方法接口和方法,让方法跑起来的执行引擎。这些都是干嘛的,怎么运作的?堆:存对象用的,我们new出来的...
  • 深入理解JVM知识总结

    2019-12-26 16:10:24
    本地库接口->本地方法库 1.1.1 运行时数据区划分 虚拟机栈、本地方法栈、程序计数器、方法区、堆 其中方法区堆是线程共享的;虚拟机栈、本地方法栈、程序计数器是线程独占的,每个线程一份 1.1.2 各个区域...
  • 另加执行引擎和本地库接口. 其中方法区堆是线程共享,虚拟机栈本地方法栈和程序计数器是线程隔离的,是线程私有的,所以生命周期与线程相同.如下图 程序计数器: 程序计数器是一块较小的内存空间,是指当前线程...
  • 1.类加载器子系统用于将编译好的.Class文件加载到JVM中。 2. 运行时数据区用于存储在JVM运行过程中产生的数据,包括程序计数器、方法区、本地方法...本地接口库用于调用操作系统的native本地方法库完成具体的指令操...
  • 方法区+虚拟机栈+本地方法栈+堆+程序计数器+执行引擎+本地库接口 线程私有: 程序计数器:当前线程所执行的字节码的行号指示器。 java虚拟机栈:java虚拟机方法执行的内存模型 本地方法栈:为虚拟机用到的本地...
  • 分别是: 堆、方法区、本地方法栈、虚拟机栈程序计数器 这其中堆方法区是线程共享的 而本地方法栈、虚拟机栈程序计数器则是线程私有的 这五部分最常关注的又是这个虚拟机栈 虚拟机栈在每个方法执行时都会...
  • JVM主要组成部分及作用 ...里边包含了线程共享区(方法区,堆),线程独占区(本地方法栈,程序计数器,虚拟机栈) 本地方法接口:连接本地方法,是与其他编程语言交互的接口。 java程序运行机制详解: 1>IDE工具
  • 微信读书总结: 2.2章节 运行时内存区域 在虚拟机的自动内存管理机制...包括:方法区、虚拟机栈、本地方法栈、堆、程序 计数器。(执行引擎、本地库接口(本地方法库))。 学习java虚拟机的时候,必须熟悉线程这个...
  • JVM(复习笔记一)

    2020-08-31 22:12:40
    JVM JVM可分成五个主要部分: ...一、线程独占区:每一个线程在创建的同时,JVM会为其分配一块内存区域,用于存储该线程的数据,主要包括栈(虚拟机栈、本地方法栈)程序计数器。 二、线程共享区:该区
  • 一、JVM是什么 JVM 是Java Virtual Machine的缩写,即Java虚拟机。 二、JVM的组成 ...例如Thread类中,启动线程线程礼让yield都需要调用本地接口,这些可调用的本地接口被“登记”在本地方法栈中。
  • Java 内存管理

    2019-11-09 19:27:55
    说明:本篇文章是在阅读《深入理解Java虚拟机》过程中的一些笔记分析...Java 的内存结构分为运行时数据区+执行引擎+本地库接口+本地方法库 运行时数据区分为:堆、栈、本地方法栈、程序计数器、方法区组成. (1)程...
  • java native关键字

    2020-12-23 14:22:17
    会进入本地 方法栈,调用本地方法本地接口 JNI JNI的作用:扩展java 的使用,融合不同的编程语言为java所用, 最初想融合cc++. 它在内存中专门开辟了一块标记区域:Native Method Stack,登记native方法 在最终...
  • 第2章 Java内存区域与内存溢出异常 Java与C++之间有一堵由内存动态分配垃圾收集技术所围成的...运行时数据区: 线程共享的:方法区\堆 线程隔离的:虚拟机栈\本地方法栈\程序计数器执行引擎本地库接口本地方法库 2.2...
  • Java面试JVM【简答】

    2020-11-21 10:33:53
    JVM由JVM运行时数据区、执行引擎、本地库接口、本地方法库组成。 运行时数据区有分为吸纳成共享区域方法区、堆,线程隔离区虚拟机栈、本地方法栈、程序计数器。 JVM优化: JVM使用过程中主要有年轻带、老年带、持久...
  • 《Java虚拟机》笔记

    2018-06-02 13:07:12
    记录了自己读《Java虚拟机》的一些笔记,主要在内存管理...本地方法栈(Native Method Stack) 堆(Heap) 程序计数器(Program Counter Register) 执行引擎、本地库接口 程序计数器 - 是一块较小的内存空...
  • Java虚拟机内存模型

    2019-01-20 17:05:45
    线程共享:方法区、堆、执行引擎、本地库接口 线程隔离:虚拟机栈、本地方法栈、程序计数器 方法区:  存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。运行时常量区也是方法区的一...
  • 单单内存划分的话,可以简单来讲就是运行时数据区。方法区堆线程共享。虚拟机栈,本地方方法栈,程序计数器线程私有。 JVM如何运行呢?...执行引擎执行字节码指令,本地接口提供调用本地方法库。 ...
  • native关键字

    2020-09-17 15:38:11
    * 会进入本地方法栈,调用本地方法的本地接口 JNI * <p> * JNI作用:扩展java的使用,融合不同的编程语言为Java所用 * 它在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native方法 * 在...
  • Runtime Data Area有如下几个区,其中PC程序计数器、虚拟机栈和本地方法栈是线程独享的,堆和方法区是线程共享的。Classload用来加载class文件,执行引擎用来执行程序,本地方法接口调用本地方法。 2.java ...
  • JVM基本机构包括:类加载器、运行时数据区、执行引擎、本地库接口 。 运行时数据区分为堆,方法区。 执行引擎分为解释器,编译器垃圾回收器。 1. 栈和线程是紧密联系的,每创建一个线程时就会对应创建一个...
  • JVM相关面试题

    2018-04-25 15:01:33
    RuntimeData Area有如下几个区,其中PC程序计数器、虚拟机栈和本地方法栈是线程独享的,堆和方法区是线程共享的。Classload用来加载class文件,执行引擎用来执行程序,本地方法接口调用本地方法。2.javastack比较...
  • JVM 1.1 JVM的运行机制 JVM,Java Virtual Machine,是用于运行Java字节码的虚拟机,包括一套字符码指令集、一组程序寄存器、一个虚拟机、一个...其中本地接口库通过调用本地方法库(Native Method Library)与操作
  • JVM运行时数据区

    2021-01-20 13:55:30
    本地方法栈 native :凡是带了native关键字的,说明java的作用范围达不到了,回去调用底层c语言的!会进入本地方法栈 调用本地方法本地接口:JNI JNI作用:扩展java的使用,融合不同的编程语言为ava所用!最初:C、C++...
  • JVM运行机制

    2018-06-30 12:35:52
    初始化jvm 获得jniEnv接口(findClass)=》main方法运行2.jvm基本结构类加载器子系统方法区、堆、栈、本地方法栈pc寄存器、执行引擎(数据指令) 本地方法接口《----本地方法pc寄存器每个线程拥有一个,线程创建时...
  • JVM(二)JVM的结构

    2018-01-31 15:57:00
    1、JVM的结构包括  (1)类加载器  (2)执行引擎  (3)运行时数据区  (4)本地库接口  类加载器:包括启动类加载器、扩展类加载... 运行时数据区:JAVA虚拟机栈、本地方法栈、JAVA堆、方法区、程序计...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

本地库接口和本地方法栈