java 栈和堆(简单版)

1:概念

    栈:函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。栈内存特点,数据一执行完毕,变量会立即释放,节约内存空间。栈内存中的数据,没有默认初始化值,需要手动设置。存在栈中的数据可以共享,存放局部变量,基本类型变量,执行上下文,操作指令区,线程不共享 

补充:通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

  堆:堆内存用来存放new创建的对象和数组。堆内存中所有的实体都有内存地址值。堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除。只存放类对象(包括成员变量),线程共享

方法区:存储class文件和静态数据,线程共享。

这里写图片描述

1:Java虚拟机一看,不就是建立一个Phone实例吗,简单,于是就直奔方法区而去,先找到Phone类的类型信息(包括成员变量成员方法)再说。结果呢没找到,这会儿的方法区里还没有Phone类呢。Java立马加载了Phone类,把Phone类的类型信息存放在方法区里。
2:Java虚拟机做的第一件事情就是在堆区中为一个新的Phone实例分配内存, 这个Phone实例持有着指向方法区的Phone类的类型信息的引用(0x001)。这里所说的引用,实际上指的是Phone类的类型信息在方法区中的内存地址,
3:在JAVA虚拟机进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,每当线程调用一个方法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据。p是一个在main()方法中定义的变量,可见,它是一个局部变量,因此,它被会添加到了执行main()方法的主线程的JAVA方法调用栈中。而“=”将把这个p变量指向堆区中的Phone实例,也就是说,它持有指向Phone实例的引用。
4:JAVA虚拟机将继续执行后续指令,在堆区里继续依次执行它们的call()方法。当JAVA虚拟机执行p.call(“乔布斯”)方法时,JAVA虚拟机根据局部变量p持有的引用,定位到堆区中的Phone实例,再根据Phone实例持有的引用,定位到方法去中Phone类的类型信息,从而获得call()方法的字节码,接着执行call()方法包含的指令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值