zoukankan      html  css  js  c++  java
  • Java程序执行过程之内存分析

    基于下面的简单代码对其执行的内存进行一步步的分析,以更好的了解程序运行机制;代码如下:

    public class Person {
        String name;
        int age;
        public void show(){
            System.out.println("姓名:"+name+",年龄:"+age);
        }
    }
    public class TestPerson {
        public static void main(String[] args) {
            //创建p1对象
            Person p1 = new Person();
            p1.age = 24;
            p1.name = "张三";
            p1.show();
            //创建p2对象
            Person p2 = new Person();
            p2.age = 34;
            p2.name = "李四";
            p2.show();
        }
    }

    以上代码的执行结果如下:

    接下来对上述代码基于内存的执行过程进行分析:

    (0)首先我们将JVM的内存区域标注出来,如下图所示:

    (1)以上Java代码的入口为TestPerson类中的main()方法,所以形成main方法的栈帧,如下图所示:

    (2)执行代码:Person p1 = new Person();同时在方法区加载Person类信息,首先创建一个引用对象,占4个字节,然后执行构造方法创建开启一个Person的栈帧【图中未命名的栈帧为Person构造方法的栈帧】。如下图所示:

    (3)同时在堆中创建一个Person对象,假设该对象的地址为:0x11,当对象创建完成后,Person构造方法的栈帧完成,将p1对象的地址0x11赋给main的p1,同时构造方法的栈帧出栈。最后结果如下图所示

    (4)执行下一步,p1.age = 24;  p1.name = "张三";24为基本数据类型,所以直接在对象0x11中直接赋值,而String类型的“张三”不是基本数据类型,所以在方法区创建“张三”对象,同时将“张三”对象的地址赋给name。执行后的结果如下图所示:

    (5)接下来执行p1.show();首先在栈中创建p1.show()的栈帧,同时传递隐式参数this,this指当前对象。如下图所示:

    在show方法中执行打印操作,打印结果为:姓名:张三,年龄:24;

    打印结束后,p1.show()方法执行完毕。p1.show()出栈。如下图所示:

    (6)执行代码:Person p2 = new Person();,首先创建一个引用对象,占4个字节,然后执行构造方法创建开启一个Person的栈帧【图中未命名的栈帧为Person构造方法的栈帧】。如下图所示:

    (7)同时在堆中创建一个Person对象,假设该对象的地址为:0x12,当对象创建完成后,Person构造方法的栈帧完成,将p2对象的地址0x12赋给main的p2,同时构造方法的栈帧出栈。最后结果如下图所示:

    (8)执行下一步,p2.age = 34;  p1.name = "李四";34为基本数据类型,所以直接在对象0x12中直接赋值,而String类型的“李四”不是基本数据类型,所以在方法区创建“李四”对象,同时将“李四”对象的地址赋给name。执行后的结果如下图所示:

    (9)接下来执行p2.show();首先在栈中创建p2.show()的栈帧,同时传递隐式参数this,this指当前对象。如下图所示:

    在show方法中执行打印操作,打印结果为:姓名:李四,年龄:34;

    打印结束后,p2.show()方法执行完毕。p2.show()出栈。如下图所示:

    (10)同时:main()方法执行完成,main()方法出栈。如下图所示

    (11)最后,堆内存中的对象和方法区的信息也没有调用,被回收。最终如下图所示:

  • 相关阅读:
    用三张图宏观把握数据库
    MySQL数据库安装与配置详解(图文)
    如何彻底的删除MySQL数据库(图文教程)
    几个常用网络/服务器监控开源软件
    tomcat服务器虚拟目录的映射方式
    手动开发动态资源之servlet初步
    软件项目开发没规划好就注定会失败
    在系统设计中,如何控制层次的问题
    软件系统架构中的分层思想
    鸟哥谈PHP的架构与未来发展
  • 原文地址:https://www.cnblogs.com/warylee/p/13545489.html
Copyright © 2011-2022 走看看