[转载] java虚拟机 jvm 出入java栈 栈空间内存分配

参考链接: Java虚拟机(JVM)堆栈区域

java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程最基本的执行行为就是函数的调用。每次函数调用其实是通过java栈传递数据的。 

数据结构中的栈的特性:先进后出,后进先出。FIFO. 

java内存中的栈跟数据结构中的特性相似也是FIFO.但是只支持进栈和出栈操作。 

java栈中保存的主要内容是栈帧。每一次函数调用都会有对应的栈帧被压进去java栈,执行完毕的时候被弹出java栈。如下图所示。 

  

 

函数1对应栈帧1,函数2对应栈帧2.函数3对应栈帧3.以此类推。 

函数1调用函数2,函数2调用函数3,函数3调用函数4,以此类推。 

函数1被调用的时候栈帧1入栈,函数2被调用的时候栈帧2入栈,以此类推。 

所以最后被调用的函数在栈顶,也是最先被弹出栈的。 

每一个栈帧保存着函数的局部变量、中间运算结果等数据。 

函数返回的时候,栈帧从java栈弹出。什么时候函数返回呢?两种情况: 

1.正常的return的时候。 

2.程序抛出异常。 

在一个栈帧内,至少包含局部变量表、操作数帧和帧数据区几部分。 

思考的问题:没一次函数调用生成栈帧,从而肯定会占用一定的栈空间。所以栈空间内存不足的时候,函数调用无法进行。当请求的栈深度大于最大栈深度的时候系统会抛出StackOverflowError异常。(内存溢出会在以后的章节深入的讲解和汇总) 

java虚拟机制定线程的最大栈空间参数为-Xss,这个参数决定了函数调用的最大深度。 

下面一段代码说明,是一个没有出口的递归。这段代码可能会栈溢出错误。如下所示: 

 

private static int count=0;

public static void recursion(){

count++;

recursion();

}

public static void main(String[] args) {

try {

recursion();

} catch (Exception e) {

System.out.println("deep of calling="+count);

e.printStackTrace();

}

}

 

 

 

使用参数-Xss128K执行代码,结果如下: 

 

deep of calling=2020

Exception in thread "main" java.lang.StackOverflowError

at cn.xhgg.test.TestStackDeep.recursion(TestStackDeep.java:6)

 

 

 

使用参数-Xss256K执行代码,结果如下: 

 

count=3665

Exception in thread "main" java.lang.StackOverflowError

at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)

 

 

 

两次内存不同对比: 

内存增大很明显调用次数增加了。 

结论: 

函数嵌套的层数很大程度上有栈的大小决定的。栈越大,函数调用的次数就越多。 

什么因素影响函数在栈中内存大大小呢?下一个章节介绍(java虚拟机jvm局部变量表)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVN命令行更新代码

命令列表 svn help查看帮助信息 Available subcommands: add auth blame (praise, annotate, ann) cat changeli…

[转载] Java中Runtime的使用

参考链接&#xff1a; Java中的JVM的关闭挂钩 1 JDK中Runtime的定义 http://blog.csdn.net/lysnow_oss/archive/2007/05/12/1606349.aspx <转载> 那就首先说点Runtime类吧&#xff0c;他是一个与JVM运行时环境有关的类&#xff0c;这个类是Singleton的。我…

窄带物联网(NB-IoT)初步了解

哪有什么天生如此&#xff0c;只是我们天天坚持。既然总有人要赢的话&#xff0c;为什么不能是我呢&#xff1f;[TOC] 什么是NB-Iot? 基于蜂窝的窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网…

ai人工智能_人工智能能力问答中的人工智能不确定性

ai人工智能1) Which of the following is true with respect to uncertainty in AI systems? Uncertainty arises when we are not 100 percent confident in our decisionsWhenever uncertainty arises, there is needs to be an estimation taken for getting to any conclu…

[转载] 弄懂JDK、JRE和JVM到底是什么

参考链接&#xff1a; JDK JRE和JVM之间的区别 首先是JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 在JDK的安装目录下有一个jre目录&#xff0c;里面有两个文件夹bin和lib&#xff0c;在这里可以认为bin里的就是jvm&#xff0c;lib中则是jvm工作所需要…

mcq 队列_人工智能搜索问题能力问题解答(MCQ)

mcq 队列1) The main Aim of the AI system is to provide a solution for real-life problems by acting and thinking humanly. Whenever an agent is confronted by a problem, what is the first step that it follows towards searching a solution to the problem? Sear…

JavaOne大事纪:IBM谈OpenJ9和Open Liberty

JavaOne大会以IBM陈述其最近对开源社区的贡献作为开场&#xff1a;OpenJ9、Open Liberty和MicroProfile。IBM杰出工程师John Duimovich做了“IBM和Java&#xff1a;助力下一代创新”的开场演讲。\\读者可以回看演讲视频。\\Duimovich说IBM之所以致力于推动Java生态系统的创新&a…

[转载] JVM中对象的回收过程

参考链接&#xff1a; JVM是否创建Main类(具有main()的类)的对象 当我们的程序开启运行之后就&#xff0c;就会在我们的java堆中不断的产生新的对象&#xff0c;而这是需要占用我们的存储空间的&#xff0c;因为创建一个新的对象需要分配对应的内存空间&#xff0c;显然我的内…

c语言格式对齐填充_C ++中类的大小 课堂上的填充和对齐| 派生类的大小

c语言格式对齐填充Prerequisite: 先决条件&#xff1a; sizeof() operator in C/C C / C 中的sizeof()运算符 Size of struct in C C中的struct大小 We know that a struct size is not only the summation of all the data members, rather its the minimum sum guaranteed. …

ELK系列~对fluentd参数的理解

这段时候一直在研究ELK框架&#xff0c;主要集成在对fluentd和nxlog的研究上&#xff0c;国内文章不多&#xff0c;主要看了一下官方的API&#xff0c;配合自己的理解&#xff0c;总结了一下&#xff0c;希望可以帮到刚入行的朋友们&#xff01; Fluentd&#xff08;日志收集与…

[转载] Java中的50个关键字

参考链接&#xff1a; Java平台如何独立 Java中的50个关键字 关键字也称为保留字&#xff0c;是指java语言中规定了特定含义的标示符。对于保留字&#xff0c;用户只能按照系统规定的方式使用&#xff0c;不能自行定义。Java中有50个常用关键字&#xff1a; 与数据类型相关…

MySQL 直接存储图片并在 html 页面中展示,点击下载

数据库实体类&#xff1a; package com.easy.kotlin.picturecrawler.entityimport java.util.* import javax.persistence.*Entity Table(indexes arrayOf(Index(name "idx_url", unique true, columnList "url"),Index(name "idx_category"…

css 文本背景色透明_如何使用CSS将文本或图像的背景设置为透明?

css 文本背景色透明Introduction: 介绍&#xff1a; In web development, there are numerous ways by which we can style our websites or web pages. You can make use of lots of properties for creating attractive and responsive websites. 在Web开发中&#xff0c;我…

[转载] 1.1Java使用JDBC原生方式连接MySql数据库

参考链接&#xff1a; Java数据库连接JDBC驱动程序 前言&#xff1a;今天有朋友问我原生的java连接数据库&#xff0c;因为框架的使用&#xff0c;如果基础不牢固的人&#xff0c;是很容易遗忘原生的连接方式。今天正好趁此做一下回顾&#xff1a; 这里只考虑原生方式&#x…

maven安装及集成myeclipse

第一步&#xff1a;下载和安装 1、官网下载Maven&#xff1a;http://maven.apache.org/download.cgi 2、解压到一个文件夹2、设置环境变量&#xff1a;如&#xff1a;M2_HOME&#xff1a;D:\JAVA\apache-maven-3.0.5在path中添加;%M2_HOME%\bin;第二步&#xff1a;和MyEclipse集…

[转载] Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例

参考链接&#xff1a; Java中的main()函数是强制性的吗 一、引入 1、泛型是什么 首先告诉大家ArrayList就是泛型。那ArrayList能完成哪些想不到的功能呢&#xff1f;先看看下面这段代码&#xff1a; [java] view plain copy ArrayList<String> strList new ArrayL…

数字和数字根的总和_使用8086微处理器查找8位数字的数字总和

数字和数字根的总和Problem statement: 问题陈述&#xff1a; Write an assembly language program in 8086 microprocessor to find sum of digit of an 8 bits number using 8 bits operation. 在8086微处理器中编写汇编语言程序&#xff0c;以使用8位运算找到8位数字的位数…

[转载] Java笔试题集锦

参考链接&#xff1a; 关于Java中文件名和类名的误解 Java笔试题集锦 1.MVC的各个部分都有那些技术来实现?如何实现? 答&#xff1a;MVC是Model&#xff0d;View&#xff0d;Controller的简写。"Model" 代表的是应用的业务逻辑&#xff08;通过JavaBean&#xff…

gcc -pthread_错误-在GCC Linux中使用C程序未定义对'pthread_create'的引用

gcc -pthread在Linux中修复对pthread_create的未定义引用 (Fixing undefined reference to pthread_create in Linux) This is a common error while compiling C program in GCC/G Linux. This error occurs when you are using pthread_create function to create threads in…

[转载] Java面试题全集(上)

参考链接&#xff1a; 如何运行不同目录中的Java类文件 2013年年底的时候&#xff0c;我看到了网上流传的一个叫做《Java面试题大全》的东西&#xff0c;认真的阅读了以后发现里面的很多题目是重复且没有价值的题目&#xff0c;还有不少的参考答案也是错误的&#xff0c;于是我…