JAVA笔记:虚拟机内存划分和工作机制

笔记:JAVA虚拟机内存划分和工作机制

寄存器:给CPU使用,和开发无关。
本地方法栈:JVM在使用操作系统功能的时候使用,和开发无关。
方法区:存储可以运行的class文件。
堆内存:存储对象或者数组,new来创建的,都存储在堆内存。
方法栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

  以下代码,从虚拟机内存层面分析运行机制,(只看栈,堆和方法区)如下图:

在这里插入图片描述

  代码编译后,方法区将保存代码中创建的各个类的属性信息,包括成员变量和成员方法,还保存了其他方法,如main方法。在方法区扫描到main方法后,虚拟机将main方法压入栈,并执行。另外,当在堆中建立了对应的对象后,方法区将自动在堆中创建成员变量并赋默认值,并将在方法区中保存该类的成员方法的地址值(0x333)保存在堆中相应对象被分配到的内存中。

  第一行代码是建立一个引用类型Phone类的变量one,由new指令,虚拟机在堆中创建了一个Phone类的对象,假设对象在堆中的地址为0x666,即(new Phone)的值为该对象在堆中的内存地址0x666,由此可知第一行代码将创建的Phone的第一个对象的地址0x666赋值给变量one,此时one的值为0x666.

  执行main方法的第5,6,7行代码时,one.price = “苹果”; 中one给出了堆地址,虚拟机按照地址在堆中找到了相应的对象,并在次对象分配到的内存中寻找其变量成员price,将字符串苹果赋值给price。未赋值前,在对象创建的那一刻,基本类型默认为0/0.0/false/(/u0000),引用类型默认为null。

  执行main方法第一部分的最后两行代码时,one提供了堆地址,由于call和sendMessage非成员变量,虚拟机根据堆中该对象保存的成员方法地址(0x333)扫描该类在方法区中被分配内存范围中是否由call和sendMessage成员方法,找到后将成员方法call压入栈,此时call在main的上边,main被中断,优先执行call,call执行结束后被弹出栈,此时sendMessage被压入栈继续执行,执行后该方法被弹出栈,这时处于栈最上方的为main方法,main方法方可继续执行。

  main第二部分代码执行过程同上,main执行完毕后,main方法被弹出栈,栈空,所有程序运行结束。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值