Java内存模型举例说明

时间:2020-02-23 14:37:12  来源:igfitidea点击:

内存可以描述为一个字节数组,我们可以其中单独访问每个字节。在内存中的每个字节(或者更确切地说是位置)中,都有可以访问的数据,就像Java中的数组一样。在32位体系结构中,每个内存“插槽”包含32位,或者也称为1个字,或者只包含4个字节。

在上面的表示法中,4000、4004、4008等表示内存插槽的地址,或者在我与数组、数据索引或者内存位置的比较中。这些“随机值”代表32位。由于每个内存槽占用32位或者4个字节,内存地址每次递增4个字节。

通常,在Java和编程中,有两种*类型的变量作用域- 全局局部。全局变量是那些可以从程序中的任何地方访问的变量,而局部变量是那些只能在给定函数中访问的变量,它们是在给定函数中创建的。因此,这两种不同类型的变量作用域被存储在不同的存储区域- 堆栈数据

堆栈

public void doSomething() {
 int v = 0;
 System.out.println(v);
}

在上面的简单Java示例中,v存储在堆栈内存区域中。因为v是局部变量。

静态数据

public class Example {
 int globalVar = 3;

 public int showVar() {
     return globalVar;
 }
}

在上面的Java示例中,globalVar位于静态数据内存区域中。因为正如我们所见,可以从方法访问它,即使它不是其中创建的。此外,它可以在整个程序中访问。

public class Person {
  int pid;
  String name;

  public Person(int id, String name) {
     this.pid = id;
     this.name = name;
  }
}
public class Driver {
  public static void main(String[] args) {
      int id = 1;
      String pName = "Rick";
      Person p = new Person(id, pName);
  }
}

在上面的Java示例中,我们创建了Person类的一个新实例并将其存储在“p”中,本质上我们使用Heap区域来动态地分配我们使用* new*关键字创建这样一个实例所需的内存。换言之,它并没有固定到一定的大小。无论实例的字节数是多少,如果有足够的内存(很可能会有),实例将被创建,并且只保留创建它所需的字节量。

Java在动态内存分配方面为我们节省了很多麻烦,因为在其他一些语言中,比如C,你必须手动分配内存,并在不再需要时手动“释放”相同的内存;而在Java中,一切都是在幕后发生的,只需调用关键字 new.