Java函数调用栈

Java的函数调用栈就是Java虚拟机栈,它是线程私有的,与线程一同被创建,用于存储栈帧。

栈帧随着方法的调用而创建,随着方法的结束而销毁。可以说栈帧是方法的抽象。

于是,可以通过打印出Java虚拟机栈中的栈帧信息来了解函数调用过程。用于实现这个过程的Java代码如下:

package methodcall;

public class Methods {
	public void method1() {
		method2();
	}

	public void method2() {
		method3();
	}

	public void method3() {
		Throwable ex = new Throwable();
		/**
		 * Throwable的getStackTrace()可以返回当前线程的虚拟机栈信息,返回
		 * 数组的第一个元素是栈顶元素,最后一个元素是栈底元素。
		 */
		StackTraceElement[] stackElements = ex.getStackTrace();
		System.out.println(stackElements.length);
		for (StackTraceElement stackTraceElement : stackElements) {
			System.out.println(stackTraceElement.getMethodName());
		}
	}

}
package methodcall;

public class MethodCall {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Methods methods = new Methods();
		methods.method1();
	}

}

输出结果如下:

4

method3

method2

method1

main

参考文献:

《Java虚拟机规范 Java SE 7》

时间: 2024-08-03 03:14:34

Java函数调用栈的相关文章

JVM运行时数据区--java虚拟机栈

虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 内存中的堆与栈 栈是运行时的单位,而堆是存储的单位1.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据.堆解决的是数据存储的问题,即数据怎么放.放在哪儿. 2.一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块 3.栈空间存放 基本数据类型的局部变量,以及引用数据类型

JAVA虚拟机栈

JAVA虚拟机栈几个重要概念 java 虚拟机栈 = java virtual machine stacks = jvms 1.JVMS 线程私有,生命周期与线程相同 2.JVMS 描述的是JAVA方法执行的内存模型:JVMS在方法执行时会创建一个"栈帧" stack frame,用于记录局部变量表.操作数栈.动态链接.方法出口等,每一个方法从调用到完成的过程,就是一个栈帧在JVMS中入栈到出栈的过程 3.局部变量表存放基本数据类型.对象引用.returnAddress(字节码指令地址

Java虚拟机栈和本地方法栈

Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java本地方法栈的特征 线程私有 后进先出(LIFO)栈 作用是支撑Native方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现 栈帧的概念和特征 Java虚拟机栈中存储的

C开发基础--函数调用栈

发现有一些问题几乎是所有的新人都会遇到,而且也常因为缺乏一些基本的知识而无从下手.函数调用栈的内容就是其中之一.于是花点时间把以前写的内容整理出来. 程序在运行期间,内存中有一块区域,用来实现程序的函数调用机制.这块区域是一块LIFO的数据结构区域,我们可以叫函数栈(调用栈).每个未退出的函数都会在函数栈中拥有一块数据区,我们叫函数的栈帧.函数的调用栈帧中,保存了相应的函数的一些重要信息:函数中使用的局部变量,函数的参数,另外还有一些维护函数栈所需要的数据,比如EBP指针,函数的返回地址.如下图

C语言函数调用栈(三)

6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: 1 //StackReg.c 2 #include <stdio.h> 3 4 //获取函数运行时寄存器%ebp和%esp的值 5 #define FETCH_SREG(_ebp, _esp) do{ 6 asm volatile( 7 "movl %%ebp, %0 \n" 8 "movl %%esp, %1 \n" 9 : "

Java中栈的两种实现

栈是先进后出的数据结构,主要有弹栈,入栈两种操作. 数组版 1 package stack; 2 3 /*** 4 * 栈的数组实现--java 5 * 栈是先进后出的数据结构,主要有弹栈,入栈两种操作 6 * 由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时, 7 * 必须将原数组数据复制到一个更长的数组中, 8 * 考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项, 9 * 故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1) 10 * @author bink

[Win32]一个调试器的实现(十一)显示函数调用栈

[Win32]一个调试器的实现(十一)显示函数调用栈 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 本文讲解如何在调试器中显示函数调用栈,如下图所示: 原理 首先我们来看一下显示调用栈所依据的原理.每个线程都有一个栈结构,用来记录函数的调用过程,这个栈是由高地址向低地址增长的,即栈底的地址比栈顶的地址大.ESP寄存器的

java的栈图形演示

1 import java.awt.*; 2 import javax.swing.*; 3 import java.awt.event.*; 4 /* 5 指示发生了组件定义的动作的语义事件.当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件. 6 事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件. 7 所以在给TextField类添加 ActionListener

浅析函数调用栈

1. 预备知识: 函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实现的呢? 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可执行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的