当前位置: 首页 > 面试题库 >

在Java中将final用于变量会改善垃圾回收吗?

谭曦
2023-03-14
问题内容

今天,我和我的同事们讨论了如何final在Java中使用关键字来改善垃圾回收。

例如,如果您编写如下方法:

public Double doCalc(final Double value)
{
   final Double maxWeight = 1000.0;
   final Double totalWeight = maxWeight * value;
   return totalWeight;  
}

final在方法退出后,在方法中声明变量将有助于垃圾回收从方法中未使用的变量中清除内存。

这是真的?


问题答案:

这是一个稍有不同的示例,其中包含最终引用类型字段而不是最终值类型局部变量:

public class MyClass {

   public final MyOtherObject obj;

}

每次创建MyClass实例时,都将创建对MyOtherObject实例的传出引用,GC必须遵循该链接来查找活动对象。

JVM使用标记扫描GC算法,该算法必须检查GC“根”位置中的所有实时裁判(如当前调用堆栈中的所有对象)。每个活动对象都被“标记为”活动,活动对象所引用的任何对象也都被标记为活动。

标记阶段完成后,GC会扫描堆,释放所有未标记对象的内存(并压缩剩余活动对象的内存)。

同样,重要的是要认识到Java堆内存被划分为“年轻”和“旧”。所有对象最初都是在年轻一代(有时称为“苗圃”)中分配的。由于大多数对象都是短命的,因此GC在从年轻一代释放最新垃圾方面更加积极。如果某个对象在年轻一代的收集周期中幸存下来,则将其移入旧一代(有时称为“终身一代”),该对象的处理频率较低。

因此,我想说的是:“不,’最终’修饰符无法帮助GC减少工作量”。

我认为,在Java中优化您的内存管理的最佳策略是尽快消除虚假引用。您可以通过在使用完对象后立即为对象引用分配“ null”来做到这一点。

或者更好的是,最小化每个声明范围的大小。例如,如果您在1000行方法的开头声明了一个对象,并且该对象在该方法作用域关闭之前(最后一个大括号)一直保持活动状态,则该对象可能会存活更长的时间必要。

如果您使用小的方法,只有十几行代码,则在该方法中声明的对象将更快地超出范围,并且GC将能够在效率更高的范围内完成大部分工作年轻一代。除非绝对必要,否则您不希望将对象移入较早的一代。



 类似资料:
  • 问题内容: 我是一名进入Java世界的C ++程序员。而且我不能摆脱必须让Java垃圾收集器进行清理的不良感觉。 例如,此代码在Java中的行为如何? 当myFunction()退出时,是否将删除局部变量对象? 我是否必须在退出之前将object设置为null,否则它将超出范围并被GC删除?或者,在最坏的情况下,它会像在C ++中那样泄漏吗? 问题答案: 不再使用后 ,将 在某个时候 将其收集 为

  • 主要内容:1 什么是Java 垃圾回收,2 Java 垃圾回收的优势,3 如何取消对象引用,4 finalize()方法,5 gc()方法,6 Java 垃圾回收的例子1 什么是Java 垃圾回收 在Java中,垃圾意味着未引用的对象。 垃圾回收是自动回收运行时未使用的内存的过程。换句话说,这是销毁未使用对象的一种方法。 我们在C语言中使用free() 函数,在C ++中使用delete()。但是,在Java中它是自动执行的。因此,java提供了更好的内存管理。 2 Java 垃圾回收的优势 它

  • 问题内容: 我想知道Java中发生的垃圾回收。它真的能够处理所有未使用的对象并释放最大可能的内存吗? 我还想知道Java垃圾收集与另一种语言(例如C#)相比如何?然后,如何自动垃圾收集与从像C这样的语言中进行手动收集相比又能达到更好的效果呢? 问题答案: 是的,这就是垃圾收集的重点。 有许多不同形式的垃圾收集。如果不增强算法,最简单的形式即引用计数就无法处理某些类型的垃圾(循环引用)。 Java(

  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal

  • 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的

  • 垃圾收集,引用计数,显式分配 和所有的现代语言一样,OCaml提供垃圾收集器,所以你不用像C/C++一样显式地分配和释放内存。 JWZ在他的文章 "Java sucks" rant(Java蛋疼(怒)!): 第一个好家伙是Java没有 free()。其他的都没有所谓了。这几乎掩盖了所有的缺点,不管有多糟糕, 这个有点让后续文档基本都没有意义了,但是...(译注:但是啥大家自己看吧) OCaml的垃