大家好,今天小编关注到一个比较有意思的话题,就是关于栈java语言的问题,于是小编就整理了4个相关介绍栈Java语言的解答,让我们一起看看吧。
J***a中的字符串常量池与J***a中的堆和栈的区别?
j***a常量池不在堆中也不在栈中,是独立的内存空间管理。
1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
2. 堆:存放所有new出来的对象。
3. 常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
j***a 方法启动时jvm做了什么?
当我们写一个J***a类,并重写Main方法,程序就能运行起来。main方法的背后,程序为什么能运行,jvm究竟做了什么处理?要理解这些,就需要了解jvm的设计原理以及启动的流程。
虚拟机的启动入口位于share/tools/launcher/j***a.c的main方法,整个流程分为如下几个步骤:
1、配置JVM装载
2、解析虚拟机参数
4、执行J***a main方法
如何理解J***a虚拟机栈?
理解虚拟机栈,应该先理解虚拟机的运行原理以及内存布局,这里简要说一下:虚拟机顾名思义就是仿照操作系统,在操作系统上运行的可以执行其他程序的虚拟平台。它从操作系统系统内存中占据一大块内存,然后将这一大块内存模拟操作系统内存布局,分成了J***a堆内存,J***a虚拟机栈,方法区,程序计数器,本地方法栈。有这几块,就可以编译和运行J***a了。
那么J***a虚拟机栈在其中有什么作用呢?我们知道,操作系统执行本地程序方法调用实际上是对方法中的局部变量,方法出入口信息在系统寄存器进行存取的过程,这种执行称作“面向寄存器”架构,而J***a虚拟机执行J***a方法也是如此的流程,但是J***a虚拟机没有寄存器的概念,因此分出了J***a虚拟机栈来模拟寄存器的作用,这称之为“面向栈”架构。
所以J***a虚拟机栈的作用就是J***a方法执行时创建一个栈帧,用于存储方法中的局部变量,操作数等信息,再利用栈的先入后出特性完成方法调用。
希望可以帮助理解。
其中,虚拟机栈是一个后入先出的栈。栈帧是保存在虚拟机栈中的,栈帧是用来存储数据和存储部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。线程运行过程中,只有一个栈帧是处于活跃状态,称为“当前活跃栈帧”,当前活动栈帧始终是虚拟机栈的栈顶元素。
和程序计数器一样,J***a虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 J***a 方法执行的内存模型。
J***a 内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,J***a虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)
局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
J***a 虚拟机栈会出现两种异常:StackOverFlowError 和 OutOfMemoryError。
StackOverFlowError: 若J***a虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前J***a虚拟机栈的最大深度的时候,就抛出StackOverFlowError异常。
OutOfMemoryError: 若 J***a 虚拟机栈的内存大小允许动态扩展,且当线程请求栈时内存用完了,无法再动态扩展了,此时抛出OutOfMemoryError异常。
J***a 虚拟机栈也是线程私有的,每个线程都有各自的J***a虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡。
如何准确理解J***a中的堆与栈?
谢邀!
J***a运行时数据区中的栈有J***a虚拟机栈和本地方法栈,都是用于方法的执行;堆用于存放对象实例和数组。
J***a虚拟机栈
每个J***a方法执行的时候都会创建一个栈帧,栈帧用于存储局部变量表、操作数栈、动态链表和方法出口等信息,每个J***a方法从开始调用到执行完成的过程,都对应着一个栈帧在J***a虚拟机栈中入栈到出栈的过程。在J***a虚拟机规范中规定,如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,但是在扩展时申请不到足够的内存,将会抛出OutOfMemoryError异常。J***a虚拟机栈的生存周期是跟随线程的,是线程私有的。
本地方法栈
J***a虚拟机栈是为执行J***a方法服务的,而本地方法栈是为执行本地方法服务的,它的作用与J***a虚拟机栈相似,同样它也会抛出StackOverflowError异常和OutOfMemoryError异常。本地方法栈的生存周期也是跟随线程的,也是线程私有的。
堆
堆是J***a虚拟机中内存空间最大的一块,基本上所有的对象实例及数组都在这里分配内存空间,它是所有线程共享的区域。在J***a虚拟机规范中,堆可以处于物理上不连续的内存空间,只要逻辑上连续就行。当堆中没有足够内存分配时,并且此时也无法再扩展,将会抛出OutOfMemoryError异常。
到此,[_a***_]就是小编对于栈j***a语言的问题就介绍到这了,希望介绍关于栈j***a语言的4点解答对大家有用。