java - 使用自动装箱的内存泄漏

标签 java memory memory-management memory-leaks garbage-collection

我正在关注 tutorial以下是自动装箱内存泄漏的示例。

package com.example.memoryleak;
public class Adder {
  public long addIncremental(long l) {
    Long sum=0L;
    sum =sum+l;
    return sum;
  }
  public static void main(String[] args) {
    Adder adder = new Adder();
    for(long ;i<1000;i++)  {
      adder.addIncremental(i);
      }
    }
 }

现在,我可以理解由于自动装箱会创建不必要的对象,但它是如何导致内存泄漏的,我的理解是当您持有对死对象的强引用时会导致内存泄漏。现在,在这种情况下,一旦我退出 FOR 循环,就不会对那些 Long 对象进行强引用,那么它是如何导致内存泄漏的呢?

请注意,我想了解它是如何导致内存泄漏的,我知道那些对象是不必要的。

最佳答案

其他答案是正确的:这不是内存泄漏。

您显示的代码以非常高的速度创建对象;并且它们会立即进行垃圾回收。这些“临时”对象都不会以某种方式被遗忘;他们都有资格被收集; GC 会在某个时候收集它们。

内存泄漏是指已用内存不断增加的情况 - 而对象却没有达到垃圾回收的条件。

鉴于询问使用 map 的“缓存”示例的评论:

  • 只要有一个单一的(强!)引用来自另一个在 GC 术语中“活着”的对象,该 map 就是“活着的”。因此:该 map 中存储的所有对象都处于 Activity 状态(不符合 GC 条件)
  • 当对该映射的最后引用消失时,该映射本身就符合 GC 的条件。 map 中的值也是如此 - 除非有一些其他对仍然存在的值的引用。

关于java - 使用自动装箱的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025220/

相关文章:

java - 使用 For Each 或 Joins 过滤

Java Matcher.find $ 在单行模式下匹配换行符

c - 具有 4 Gb RAM 和 10 Gb 交换分区的 32 位内核中的无限循环 malloc

在 c 中创建我自己的 memset 函数

Ruby 大数组和内存

c++ - 为 POD 适当分配内存

java - 参数化内连接

java - 将方法添加到 Android 复制/粘贴全局上下文菜单中?

xml - valgrind 日志文件中缺少泄漏摘要

c++ - std::vector 元素在物理内存中是否连续?