专栏首页Java知其所以然Java 程序执行过程的内存分析

Java 程序执行过程的内存分析

Java 程序执行过程的内存分析

内存分析先知

栈:

1、每个线程私有,不能实现线程间的共享!

2、局部变量放置于栈中。

3、栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆:

1、放置new出来的对象!

2、堆是一个不连续的内存空间,分配灵活,速度慢!

方法区:

1、被所有线程共享!

2、用来存放程序中永远不变或唯一的内容。(类代码信息、静态变量、字符串常量)

注:常量池具有共享的机制,不同类的常量池之间共享数据。比如:Student 类常量池下有个 "老叶"字符串常量,那么当 Test 类中用到"老叶"这个字符串常量时就会去方法区的其他类的常量池中找,刚好 Student 类有,所以它直接就引用Student 类的"老叶"

开始分析

Student 类

public class Student {
    //静态的数据
    String name;
    int id;    //学号
    int age;
    String gender;
    int weight;

    //动态的行为
    public void study(){
        System.out.println(name+"在学习");
    }
    public void sayHello(String sname){
        System.out.println(name+"向"+sname+"说:你好!");
    }

}

Test1类

重点:注意看代码里的注释,我把每一条的语句的执行过程都做了很详细的讲解

public class Test1 {

    public static void main(String[] args) {
        //去方法区找Student类,发现没有,通过Class Loader(类加载器)加载Student类,将Student类加载到方法区中。
        //创建 s1 局部变量
        //在堆中创建一个Student对象,并将这个对象的地址赋值给 s1
        Student s1 = new Student();
        //通过 s1 这个引用先找到Student对象,然后找到 name 属性
        //创建"老叶"这个字符串常量,并将它放在常量池中
        // 将 s1 的 name 属性 赋值为这个字符串的引用
        s1.name = "老叶";
        //通过 s1 这个引用先找到Student对象,然后找到 study() 方法的引用,然后去方法区内找到方法,执行该方法,开一个栈帧,执行完成后释放这个栈帧。
        s1.study();
        s1.sayHello("老王");

        //这个和上面同理
        Student s2 = new Student();
        s2.age = 18;
        s2.name="老李";
    }

}

注:基本数据类型会直接赋值,引用类型是把对象的地址赋值

这是对上面 Test1 类执行代码的内存分析图!!!

本文分享自微信公众号 - Java知其所以然(gh_37a1335e2608),作者:帅飞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 枚举以及使用场景

    在 java 编程过程中,我们通常需要定义一些固定数量的常量,在 jdk1.5 以前,通常的做法是定义一个静态常量类,但自 jdk1.5 后,java 引入了枚...

    帅飞
  • 从字节码深刻理解内部类

    例如,Map 中的 Entry,每个 entry 都与一个 Map 关联,但是 entry 上的方法(getValue 和 setValue)并不需要访问该 M...

    帅飞
  • 装饰模式

    从这里我们看出来,一个具体装饰器可以装饰多个具体构建组件,一个具体构建组件也可以有多个具体装饰器。它们之间没有耦合,彼此独立,从而可以达到动态增加功能。

    帅飞
  • MyBatis-Plus | 最简单的查询操作教程(Lambda)

    对于这部分的测试,我想结果是毫无因为,那么你应该关注什么呢?没错,SQL,所以,我们直接看SQL。当然,结果也是可以看到的。

    chenchenchen
  • Objective-C 原型模式 -- 简单介绍和使用

    Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将...

    周希
  • 托管安全服务提供商(MSSP)保障SD-WAN安全

    虽然网络在过去几年一直处于转型期,但传统的网络连通性却带来了一系列的障碍。主要是它历来是依赖于静态网络连接、设备和策略基础设施,以适应临时资源分配和动态工作负载...

    SDNLAB
  • ArrayList浅、深拷贝

    ArrayList深拷贝和浅拷贝。ArrayList的clone()方法用于创建list的浅表副本。在新列表中,仅复制对象引用。如果我们在第一个ArrayLis...

    八音弦
  • 5G未至,却触手可及

    5G目前是业界最引人注目的新技术,也是业界关注的中心。无线通信领域的标准化进程和管理机构不断发展,以及新提出的毫米波(mmWave)频率和正在开发的技术渠道的理...

    SDNLAB
  • Android sdk配置 常见问题及处理方法

    Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml Fetched ...

    用户3030674
  • 云计算术语

    全球网络的一种比喻说法,起初用于表示电话网络,现在通常用于表示 Internet。

    小诸葛

扫码关注云+社区

领取腾讯云代金券