多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java 内存模型解释示例 > 原文: [https://javatutorial.net/java-memory-examples](https://javatutorial.net/java-memory-examples) 内存可以描述为字节数组,您可以在其中单独访问每个字节。 就像在 Java 中的[数组](https://javatutorial.net/java-array)中一样,在内存中的每个字节或更确切的位置上,都有可以访问的数据。 在 32 位架构中,每个内存“插槽”包含 32 位,也称为 1 个字,或仅 4 个字节。 ![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg) ![Memory visual representation](https://img.kancloud.cn/dd/e0/dde0ff0b93882eecc344e35293383a7d_357x404.jpg) 内存视觉展示 在上面的表示中,4000、4004、4008 等表示内存插槽的地址,或者在与数组,数据的索引或内存位置进行的比较中。 这些“随机值”中的每一个代表 32 位。 由于每个内存插槽占用 32 位或 4 个字节,因此内存地址每次增加 4。 通常,在 Java 和一般的编程中,有两种类型的可变范围 – **全局**和**局部**。 全局变量是可以从程序中的任何地方访问的变量,而局部变量是只能在给定函数中创建它们的地方访问的变量。 因此,这两种不同类型的变量作用域存储在不同的存储区域中 - **栈**和**数据**。 ![Memory regions](https://img.kancloud.cn/6b/08/6b08d7a6cd6d3de37a9d93e88176c449_358x404.jpg) ![](https://img.kancloud.cn/58/9c/589c85093e1f1348baebc7c2771bd1ee_779x413.jpg) ## 堆 ```java public void doSomething() { int v = 0; System.out.println(v); } ``` 在上面的简单 Java 示例中,`v`存储在栈存储区域中。 这是因为`v`是局部变量。 ## 静态数据 ```java public class Example { int globalVar = 3; public int showVar() { return globalVar; } } ``` 在上面的 Java 示例中,`globalVar`位于静态数据存储区中。 因为如您所见,即使未在其中创建方法,也可以通过该方法进行访问。 此外,可以在整个程序中对其进行访问。 ## 堆 ```java public class Person { int pid; String name; public Person(int id, String name) { this.pid = id; this.name = name; } } ``` ```java public class Driver { public static void main(String[] args) { int id = 1; String pName = "Rick"; Person p = new Person(id, pName); } } ``` 在上面的 Java 示例中,我们创建了`Person`类的新实例并将其存储在`p`中,实际上,我们使用堆区域为动态分配我们创建此类内存所需的内存。 使用`new`关键字的实例。 换句话说,它不固定为一定大小。 无论实例有多少字节,如果有足够的内存(可能),将创建该实例,并且该实例将仅保留创建该实例所需的字节数。 Java 在动态内存分配方面为我们省去了很多麻烦,因为在某些其他语言(例如 C)中,您必须手动分配内存并在不再需要该内存时手动“释放”相同的内存, 而在 Java 中,一切都在幕后发生,只需调用关键字`new`。 我将建议以下有关如何调整 JVM 以使用特定内存量的教程 > [Java 增加内存](https://javatutorial.net/java-increase-memory)