java对象内存图堆栈方法区

原文链接:https://blog.csdn.net/weixin_43153854/article/details/102683579

Java的内存需要划分成为5个部分:

  • 栈(stack)

         存放的都是方法中的局部变量。
         方法的运行一定要在栈当中。
         局部变量: 方法中的参数,或者方法{}内部的变量。
         作用域: 一旦超出作用域,立刻从栈内存当中消失。

  • 堆(heap)

        凡是new出来的东西,都在堆当中。
        堆内存里面的东西都有一个地址值:16进制
        堆内存里面的数据,都有默认值。规则:
        如果是整数 默认为0
        如果是浮点数 默认为0.0
        如果是字符 默认为’\u0000’
        如果是布尔 默认为false
        如果是引用类型 默认为null

  • 方法区(method area)

       存储.class相关信息,包含方法的信息。

  • 本地方法栈(native method stack)

       与操作系统相关。

  • 寄存器(pc register)

      与CPU相关。

  • 一个对象的内存值图

 

 

 图片解释:

方法区:保存的是.class数据(1 成员变量 2 成员方法 )程序就要启动在运行main之前,方法区要最先有数据。

 栈:     谁有main方法的类从谁开始。main方法想要运行就要进栈,进入栈空间的动作叫进栈,也叫压栈。

 堆 :    进栈之后干什么事,首先new 了一个对象Phone() 存在堆里,我怎么知道存了什么内容呢,参考着方法区的成员变量,成员方法拷贝来赋上默认值,注意:成员方法存的是地址值,指向了方法区。

call运行,也是要进栈的。打完了,方法就出栈,从栈内存消失。最后方法运行完毕,主方法退出。

 两个对象的内存图

 

 

 two是重新new的,只要改变一行代码,就能产生联系

即两个引用指向同一个对象的地址图 

 

 

 

 

      (对象,数组)

 

 

 

 

 

posted @ 2021-05-17 14:09  每天都要进步啊  阅读(288)  评论(0编辑  收藏  举报