为了账号安全,请及时绑定邮箱和手机立即绑定

请教大神,在JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?

/ 猿问

请教大神,在JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?

扬帆大鱼 2019-11-11 14:10:58

JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?


查看完整描述

4 回答

?
斯蒂芬大帝

jvm内存模型:Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。运行时内存模型,分为线程私有和共享数据区两大类,其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含Java堆、方法区,在方法区内有一个常量池。java运行时的内存模型图,如下:

从图中,可知内存分为线程私有和共享两大类:

(1)线程私有区,包含以下3类:

程序计数器,记录正在执行的虚拟机字节码的地址;

虚拟机栈:方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧;

本地方法栈:虚拟机的Native方法执行的内存区;


(2)线程共享区,包含以下2类

Java堆:对象分配内存的区域;

方法区:存放类信息、常量静态变量、编译器编译后的代码等数据;

常量池:存放编译器生成的各种字面量和符号引用,是方法区的一部分。

楼主提到的Java栈,一般而言是指图中的虚拟机栈,在代码中的方法调用过程中,往往需要从一个方法跳转到另一个方法,执行完再返回,那么在跳转之前需要在当前方法的基本信息压入栈中保存再跳转。三、关于寄存器的问题对于java最常用的虚拟机,sun公司提供的hotspot虚拟机,是基于栈的虚拟机;而对于android的虚拟机,则采用google提供的dalvik,art两种虚拟机,在android 5.0以后便默认采用art虚拟机,这是基于寄存器的虚拟机。  楼主问的是jvm(即java vm),这是基于栈的虚拟机。那么关于虚拟机栈,这块内存的内容,我们再进一步详细分析,如下图:

可以看到,在虚拟机栈有一帧帧的 栈帧组成,而栈帧包含局部变量表,操作栈等子项,那么线程在运行的时候,代码在运行时,是通过程序计数器不断执行下一条指令。真正指令运算等操作时通过控制操作栈的操作数入栈和出栈,将操作数在局部变量表和操作栈之间转移。



查看完整回答
反对 回复 2019-11-16
?
九州编程

栈肯定是有的,一个方法调用另一个方法,就会产生栈那样的结构,
我看过的理论好像是
堆的话,好像是全局一个,所有 用new生成的对象,都保存在堆里。
但是 按照这种理论,我也有点不懂的地方。 以垃圾回收的理论来看的话,最好的方法是 一个栈对应一个堆,然后方法栈执行完毕,清空这一个堆,垃圾回收旧算完了。这样的方式 感觉比单纯一个全局的堆 要好。

全局一个堆的话, 要维护 每个线程对应的 内存对象,垃圾回收 还得针对每一个线程,感觉有点复杂。
全局的堆 肯定是有一个的,维护那些 静态变量的 内存,公有的一些对象。
其实我也不怎么懂 jvm里面 具体的内存分配策略。 可是是错的



查看完整回答
反对 回复 2019-11-16
?
慕桂英546537
  1. -Xms 为jvm启动时分配的内存,比如-Xms200m,表示分配200M

  2. -Xmx 为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存

  3. -Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M


查看完整回答
反对 回复 2019-11-16
?
互换的青春

 线程(thread),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

  线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
1、线程与进程

  线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU

  通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

  因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。

查看完整回答
反对 回复 2019-11-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信