对于Java对象的内存运行机制的简单通俗理解。

  • 什么是堆,栈,方法区。
  • 1、堆
  • 2、栈
  • 3、方法区
  • 对象内存的运行机制简述


什么是堆,栈,方法区。

要想了解java对象中内存的运行机制,就必须先了解java中堆,栈和方法区。明白它们是用来存储什么的。

1、堆

在JVM中只有一个堆,类的实例化对象,会被储存在堆内存中,而这个对象它的引用地址,则会被储存在stack栈中。堆中只存储实例化对象本身和数组。

2、栈

Java栈与堆不同每一个线程都有一个stack,栈的区域非常小,大概只有1M左右,但是存储速度非常快,所以我们把快速执行的任务存储在stack。栈中存储的就是基本数据类型和对象的引用地址。(并不是对象本身!!)

3、方法区

方法区(method)又叫静态区,这里主要存储的就是类(class)、静态方法、静态变量、常量以及成员方法。我们可以发现在方法区中存储的都是整个程序中唯一存在的元素,所以方法区与堆一样被所有线程共享。我们常说的常量池也是方法区的一部分。

对象内存的运行机制简述

由上面可知像类(class)、静态方法、静态变量、常量以及成员方法,这些代码段数据是存储在方法区的。
当我们在程序执行的过程,如果实例化了一个对象,那么这个对象本身是存储在堆区的。
一般这个存储在堆区里的对象本身,它含有自身的成员属性,以及指向方法区内其自身类成员方法(为啥没有直接将方法,也存在堆内中呢?因为规定了成员方法只能存在方法区中。所以只能通过一个指向地址来进行访问。)。
而指向这个堆内对象的地址,又被另外存在栈中(代码中的实例化的对象名,stu等,其本身内容就是这个指向堆内对象的地址)。
所以在这样七绕八绕的情况下,要先从栈中找到指向堆内对象的堆地址,然后才访问到堆中真正的实例化对象。并且有使用到成员方法的话,还要在从这个堆中真正的实例化对象本身中找到指向方法区内其自身类成员方法才行。