【问题标题】:Will local variables declared in a Java function automatically be deallocated?Java 函数中声明的局部变量会自动释放吗?
【发布时间】:2015-03-24 11:54:49
【问题描述】:

如果在 Java 中的函数中声明了一个变量,该变量是否会在该函数完成时自动释放,而不管其类型如何?一旦退出该变量的范围,是否会释放原始类型、非原始 Object 和/或原始类型的 arrayObjects 占用的内存?

【问题讨论】:

  • 马上?也许,但不太可能。总是?取决于,而不是在某处仍然引用它时。

标签: java function memory scope allocation


【解决方案1】:

Java 中的原始类型是在堆栈上分配的,因此当它们超出范围时,它们的内存会自动释放。对象引用是类似管理的原语,但对象本身是垃圾收集的。它们会被垃圾收集器自动删除,但不保证需要多长时间。

当内存压力变紧时,JVM 垃圾收集器会自动运行,因此只要不再有对某个对象的引用,您就可以有效地假设其内存将被释放。

【讨论】:

  • 所以基本上我不需要太担心它会占用堆上的空间并在程序超出其范围时对其进行重载,对吗?
  • @user2649681 是的,在大多数情况下,垃圾收集器将为您处理内存管理。当然,分配大量对象仍然会很慢,但这不是因为 Java 的内存管理。那只是因为无论你的语言如何管理内存,大量的分配和释放都会很慢。
【解决方案2】:

如果没有对对象的引用,垃圾收集器会自动删除它。但我们不能说什么时候会发生。

article 很好地解释了垃圾收集器的工作原理。

【讨论】:

    【解决方案3】:

    除了Allexis King的答案

    在较新的 Java/JVM 中还有一种技术可以决定本地对象应该在堆栈还是堆中分配。通过这种技术在堆栈中分配的本地对象将在超出范围时被释放

    逃逸分析

    逃逸分析是一种技术,Java 热点服务器编译器可以通过该技术分析新对象的使用范围并决定是否将其分配到 Java 堆上。

    Java SE 6u23 及更高版本默认支持并启用转义分析。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2023-02-08
      • 2014-01-17
      • 2012-05-23
      相关资源
      最近更新 更多