Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.介绍

为了以最佳方式运行应用程序,JVM将内存划分为堆栈内存和堆内存。每当声明新的变量和对象时,调用new方法,声明一个字符串或者执行类似的操作,JVM会从堆栈内存或堆空间中将内存指定给这些操作。

在本教程中,我们将讨论这些内存模型。我们将列举它们之间的一些关键区别,它们如何存储在RAM中,它们提供的特性以及在哪里使用它们。

2.Java中的堆栈内存

Java中的堆栈内存用于静态内存分配和线程的执行。它包含特定于方法的基本值,以及从该方法引用的堆中对象的引用。

对该内存的访问是后进先出(LIFO)顺序。每当调用一个新方法时,就会在堆栈顶部创建一个新块,该块包含特定于该方法的值,比如原始变量和对象引用。

当方法完成执行时,它对应的堆栈帧被刷新,流返回到调用方法,空间可以用于下一个方法。

2.1。堆栈内存的关键特性

除了我们目前所讨论的以外,下面是堆栈内存的一些其他特性:

  • 当分别调用和返回新方法时,它会增长和收缩
  • 只有在创建它们的方法运行时,堆栈内的变量才会存在
  • 当方法完成执行时,它会被自动分配和释放
  • 如果该内存已满,Java将抛出java.lang.StackOverFlowError
  • 与堆内存相比,对该内存的访问速度更快
  • 这个内存是线程安全的,因为每个线程都在自己的堆栈中操作

3.Java中的堆空间

Java中的堆空间用于在运行时为Java对象和JRE类动态分配内存。新对象总是在堆空间中创建,对该对象的引用存储在堆栈内存中。

这些对象具有全局访问权,可以从应用程序中的任何地方访问。

这个内存模型被进一步分解为更小的称为代的部分,它们是:

  1. 年轻的一代,这里是分配和老化所有新对象的地方。当它被填满时,会发生一个小的垃圾回收
  2. 年老或年老的一代-这是存储长期存活的对象的地方。当对象存储在年轻代时,将设置对象的年龄阈值,当达到该阈值时,将对象移动到老代
  3. 永久的一代,它由运行时类和应用程序方法的JVM元数据组成

这些不同的部分也在本文中讨论-JVM、JRE和JDK的区别。

我们总是可以根据需要操作堆内存的大小。欲了解更多信息,请访问这里有关Baeld金宝搏188体育ung文章

3.1。Java堆内存的关键特性

除了我们已经讨论过的以外,下面是堆空间的一些其他特性:

  • 它可以通过复杂的内存管理技术访问,这些技术包括年轻代、年老代和永久代
  • 如果堆空间已满,Java将抛出java.lang.OutOfMemoryError
  • 对这个内存的访问相对来说比堆栈内存慢
  • 与堆栈不同,这种内存不会自动释放。它需要垃圾收集器来释放未使用的对象,以保持内存使用的效率
  • 与堆栈不同,堆不是线程安全的,需要通过正确地同步代码来保护它

4.例子

基于我们到目前为止所学的内容,让我们分析一个简单的Java代码,并评估内存是如何管理的:

类Person {int id;字符串名称;public Person(int id, String name);id = id;this.name =名称;}} public class PersonBuilder {private static Person buildPerson(int id, String name) {return new Person(id, name);} public static void main(String[] args) {int id = 23;String name = "John";Person Person = null;person = buildPerson(id, name);}}

让我们一步一步来分析这个问题:

  1. 在进入main ()方法时,将在堆栈内存中创建一个空间来存储该方法的原语和引用
    • integer的基本值id将直接存储在堆栈内存
    • 引用变量类型的也将在堆栈内存中创建,将指向堆中的实际对象
  2. 对参数化构造函数的调用人(int,字符串)main ()将在之前的堆栈上分配更多的内存。这将存储:
    • 调用对象在堆栈内存中的对象引用
    • 原始值id在堆栈存储器中
    • 的参考变量字符串论点的名字哪个将指向堆内存中的字符串池中的实际字符串
  3. 主要方法进一步调用buildPerson ()静态方法,对于该方法,进一步的分配将在前一个分配的堆栈内存中进行。这将再次以上述方式存储变量。
  4. 但是,对于新创建的对象类型的,所有实例变量都将存储在堆内存中。

这个分配在这个图表中解释:

5.总结

在我们结束这篇文章之前,让我们快速总结一下堆栈内存和堆空间之间的区别:

参数 栈内存 堆空间
应用程序 堆栈是按部分使用的,在线程执行期间一次一个 整个应用程序在运行时使用堆空间
大小 根据操作系统,堆栈有大小限制,通常比堆小 堆上没有大小限制
存储 只存储在堆空间中创建的基本变量和对对象的引用 所有新创建的对象都存储在这里
订单 使用后进先出(LIFO)内存分配系统访问 该内存可以通过复杂的内存管理技术访问,这些技术包括年轻代、年老代或年老代以及永久代。
生活 堆栈内存只在当前方法运行时存在 只要应用程序运行,堆空间就存在
效率 相对于堆来说,分配要快得多 与堆栈相比,分配速度较慢
分配/回收 当分别调用和返回方法时,将自动分配和释放该内存 当新对象被创建时分配堆空间,当它们不再被引用时由Gargabe收集器回收堆空间

6.结论

堆栈和堆是Java分配内存的两种方式。在本文中,我们了解了它们是如何工作的,以及何时使用它们来开发更好的Java程序。

要了解更多关于Java内存管金宝搏官网188be理的知识,看一看本文在这里。我们还简要地讨论了JVM垃圾收集器在本文中

Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
2评论
最古老的
最新的
内联反馈
查看所有评论
本文评论关闭!