资讯专栏INFORMATION COLUMN

java的栈和堆

_ivan / 916人阅读

摘要:每个方法被调用和完成的过程,都对应一个栈帧从虚拟机栈上入栈和出栈的过程。执行的方法,找到堆上的实例。下面用一段十分简单的代码段描述一下栈的运行过程。

先用一张图展示一下Java堆栈的概况

方法区:class文件信息,运行时常量池,以及编译器编译后的代码
堆:存储对象,对象包含类的信息,指向方法区

虚拟机栈:表示Java方法执行的内存模型,每调用一个方法就会为每个方法生成一个栈帧(Stack Frame),用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用和完成的过程,都对应一个栈帧从虚拟机栈上入栈和出栈的过程。虚拟机栈的生命周期和线程是相同的

本地方法栈:一个支持native方法调用的JVM实现

程序计数器:程序计数器用来记录当前正在执行的指令

用一个十分简单的代码段模拟一下Java堆栈的运行过程:

public class AppTest {
    public static void main(String[] args) {
        Person person = new Person("张三");
        person.sayHello();
    }
}

class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    public void sayHello() {
        System.out.println("hello " + name);
    }
}

新建一个main线程的一个栈

jvm在方法区寻找是否存在Person类的信息

如果没找到类加载器加载Person类信息到方法区,然后在堆中创建Person对象,并持有方法区的引用

把person添加到main主线程栈中,并指向堆上的Person实例。

执行person的sayhello方法,找到堆上的Person实例。

根据堆上Person的方法区引用,找到方法区上sayhello的字节码,然后执行完成。

下面用一段十分简单的代码段描述一下栈的运行过程。

public class AppTest {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int c = add(a , b);
    }

    private static int add(int a, int b) {
        return a + b;
    }
}

总结:

学习了一段时间Java虚拟机之后才发现Java虚拟机是如此的复杂,也体会到了自己的内功的不足,学习的过程中很大程度上参考的云析学院的视频,和Java虚拟机精讲这本书,在此表示感谢。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74309.html

相关文章

  • Java数据结构与算法[原创]——栈

    摘要:前言数据结构与算法专题会不定时更新,欢迎各位读者监督。方法调用编写的程序在进行方法函数调用时,会完成对方法的压栈操作,等方法执行结束后,对应的会完成对方法的弹栈操作。 声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文介绍数据结构中的栈的概念、存储结构、栈的特点以及栈的适用场景,另外会穿插介绍面试中的一些经典问题...

    hiyang 评论0 收藏0
  • 深度理解JVM-----运行时数据区域

    摘要:在之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。 以下内容部分转载于: CS-Notes showImg(http://ww1.sinaimg.cn/large/005NT19Ply1g385uooqv9j30kd0slmyw.jpg); 程序计数器(Program...

    tuantuan 评论0 收藏0
  • java学习(四) —— 内存分配浅析

    摘要:内存分配解析四方法执行完毕,立即释放局部变量所占用的栈空间。内存分配解析五调用对象的方法,以实例为参数。堆和栈的小结以上就是程序运行时内存分配的大致情况。 前言 java中有很多类型的变量、静态变量、全局变量及对象等,这些变量在java运行的时候到底是如何分配内存的呢?接下来有必要对此进行一些探究。 基本知识概念: (1)寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序...

    henry14 评论0 收藏0
  • Java内存区域划分和内存分配

    摘要:运行时数据区域虚拟机在执行的过程中会把管理的内存划分为若干个不同的数据区域。方法区的内存收集还是会出现,不过这个区域的内存收集主要是针对常量池的回收和对类型的卸载。当方法区无法满足内存分配需求时将抛出异常。 运行时数据区域Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区...

    BDEEFE 评论0 收藏0
  • Java内存模型

    摘要:内存模型指定了如何与计算机内存协同工作。内部的内存模型内存模型在内部使用,将内存分为了线程栈和堆。下面的图从逻辑角度给出了内存模型每个运行在内部的线程都有自己的线程栈。部分线程栈和堆可能在某些时候会占用缓存和内部寄存器。 Java内存模型指定了JVM如何与计算机内存协同工作。JVM是整个计算机的模型因此这个模型包含了内存模型,也就是Java内存模型。 如果你像要设计正确行为的并发程序,...

    fantix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<