jvm基础_java实现栈四个方法

jvm基础_java实现栈四个方法JVM进阶(一)——初识JAVA栈  若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。  下面言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看图:  这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。  栈是我们最常用的内存区域。它主

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺


一、前言

若想自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。

二、栈存储

言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看下图:
这里写图片描述
这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。

栈是我们最常用的内存区域。它主要用来存放基本类型变量,局部变量以及对象的引用。例如:User user = new User();这里的user就是对象的引用也可以理解为地址,指引着虚拟机要去哪里找user这个对象。 他们的基本关系如图:
这里写图片描述
由上图可知,当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来对象的值,因为我们只是改变了图中内存区域的值,他的指引(地址)还是一样的。同时也可以看出,栈的内存区域是连续的,有大小限制的,如果超过了就会抛出栈溢出的异常StackOverflowError

在每个方法执行的时候,都会创建一个个的栈帧,用于保存局部变量表,操作数栈,动态链接等信息(以后都会详细讲解)。每次方法的调用都会对应着一个栈帧,因此可以解释当我们在写递归程序的时候会不小心报栈溢出的异常,因为栈是有限的,方法调用太多次导致栈帧堆满了栈,所以溢出。看下面代码:

public class Test { 
   
	private static int stackLength = 0;
	private static void main(String[] args) { 
   
		try { 
   
			Test test = new Test();
			test.stackOverFlow();
		} catch (Throwable e) { 
   
			System.out.println("stackLength:" + stackLength);
			throw e;
		}
	}
	public void stackOverFlow() { 
   
		// 疯狂递归调用
		stackLength++;
		stackOverFlow();
	}
}

在参数-Xss128k的情况下的报错。(eclipse中设置参数:右键代码选择Run As-->Run Configurations,在Arguments栏下的VM arguments中填入参数,再Apply,再run)
这里写图片描述
每次在方法执行完毕的时候,虚拟机会自动释放掉为该栈所分配的空间,在栈中,对应着一个栈帧的出栈。虚拟机会自动分配与回收内存,因此效率比较高。

三、总结

最后做一下栈的总结:

  • 存放基本类型变量,局部变量,对象的引用;
  • 系统自动分配与回收内存,效率较高,快速,存取速度比堆要快;
  • 是一块连续的内存的区域,有大小限制,如果超过了就会栈溢出,并抛出栈溢出的异常StackOverflowError
  • Java会自动释放掉为该变量所分配的内存空间;

栈又分为java栈本地方法栈。顾名思义,本地方法栈自然就是为本地方法提供服务的,java栈是为java服务的。

注意⚠️:JVM栈是每个线程私有的!

四、延伸阅读 编译型语言与解释型语言

计算机只能识别二进制指令,不能直接识别由JavaScript等高级编程语言所编写的代码(源代码),所以需要将高级语言转为二进制指令。

由于不同语言转换为二进制指令的时机不同,可分为编译型语言解释性语言

4.1 编译型语言

编译型语言要求使用编译器一次性将所有源代码编译为一个可执行程序,一次编译可重复执行。代表语言有CC++Golang汇编等。

● 编译型语言一般不能跨平台

  1. 编译出来的可执行程序不能跨平台:因为不同操作系统对可执行文件有着不同的要求,彼此之间不能兼容。

  2. 源代码不能跨平台:不同操作系统下的函数、变量、api等可能会有不同。

4.2 解释型语言

解释型语言是使用解释器一边执行一边转换,用到些源代码就转换哪些,不会生成可执行程序。代表语言有JavaScriptPythonPHPShell等。

● 解释型语言一般可以跨平台

跨平台是指源代码可以跨平台,解释器是不能跨平台的。源代码在不同操作系统中运行的结果相同。

五、拓展阅读

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196644.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构之图的创建(邻接表)

    数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解。邻接无向图1.邻接表无向图介绍邻接表无向图是指通过邻接表表示的无向图。上面的图G1包含了"A,B,C,D,

    2021年12月19日
    52
  • IT需求分析_中国it技术牛人

    IT需求分析_中国it技术牛人  刚刚走过了非比寻常的2006,IT业将迎来一个怎样的2007?尤其是从采购角度来看,2007年有哪些特点和趋势?又有哪些因素将左右2007年的市场需求?  预测2007年的IT市场需求和采购趋势,则一定要先看整体的经济增长速度。  来自法国国家统计及经济研究所(INSEE)的预测,2007年上半年,美国经济放缓将连带着世界经济发展速度的回落。据INSEE的统计,2006年,中国工业…

    2022年10月4日
    0
  • 激活码 PhpStorm 2022.01-激活码分享2022.03.05

    (激活码 PhpStorm 2022.01)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年4月2日
    169
  • 23岁的一无所有,其实是理所应当的「建议收藏」

    23岁的一无所有,其实是理所应当的「建议收藏」23岁那年你正处在哪个状态?现在呢? 我,23岁,应届毕业生。生活,工作,爱情都处于人生的低谷,一穷二白,一无所有,一事无成。分享一下成长的建议吧。匿名用户23岁那年…就是去年…… 在22岁的时候我毕业,同时第二年准备考研,结果因为压力太大,期望太高,又失利了,但是我依然满怀信心和憧憬 在我23岁那年四月,当我深爱的女孩(在这之前我追了她四年)说她要去北京时,我在毫无准备的情况下,…

    2022年7月25日
    6
  • qt qtreewidgetitem_qtwidgets

    qt qtreewidgetitem_qtwidgetsQTreeWidget在添加了数据之后点击扩展箭头展开和收缩的时候会显得卡顿,这个是qt内核的一个bug,正常情况下应该是立即响应的,既然是qt的bug,就只能换种方式实现TreeWidget来解决这个bug,具体办法大致可以有一下几种,具体看需求来决定用哪一种方法更好:如果需求要求实现的TreeWidget不要求是完全的TreeWidget,扩展的层次是有限制的,就是只有2层,3层或者…

    2022年10月1日
    0
  • ODT入门_odt是什么

    ODT入门_odt是什么操作关键:推平一段区间cf896c题意:操作分四种,区间加上一个数、区间赋值、求区间第k小、求区间幂次和将序列中连续的相同的元素整合、用一个三元组(L,R,val)来表示set维护定义内部类:structnode{intl,r;//区间的左端点、右端点mutableLLv;//数值node(intL,intR=-1,LLV=…

    2022年9月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号