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.