如果我们多次创建HashMap对象,则内存泄漏

时间:2015-08-20 18:11:54

标签: java memory-leaks

public class TestProcessor{
  public void fillData(){
    boolean success = true;
    HashMap<String,String> hMap = null;
    if (success){
      hMap = new HashMap<String,String>();
      hMap.put("one","java");
      hMap.put("two","servlet");
   }
   if(hMap! = null){
     processData(hMap);
   }
 }
 public void processData(HashMap<String,String> map){
     String param1 = map.get("one");
     String param2 = map.get("two");
 }
}

在上面的代码中,如果我们多次调用fillData()方法并且if条件变为true,那么将多次创建HashMap对象。这会导致内存泄漏问题吗?如果发生内存泄漏,那么我们该如何修复呢? / p>

2 个答案:

答案 0 :(得分:1)

它不应该创建内存泄漏,因为您将替换现有的hashmap,这将允许旧的hashmap被垃圾收集。

如果您在外部对hashmap中的对象进行引用,则可能会导致它们被保留。

*我假设你的语法是java。

答案 1 :(得分:1)

Java虚拟机(JVM)主动并自动管理应用程序使用的内存。有关Java内存管理的一些注意事项:

  • 内存在堆内存中自动分配给程序创建的对象。

  • 当程序无法再访问某个​​对象时(通常超出范围,以便不能访问引用该对象的变量),内存将被称为垃圾回收的进程自动回收。 p>

  • 垃圾收集是自动且不确定的。您的程序无法知道(或预测)何时会发生垃圾收集(因此您无法确切知道何时将回收无法访问的对象)。

在大多数情况下,JVM管理内存非常好,即使程序运行很长时间(并创建和回收许多对象)也不会发生内存泄漏。

通过上述推理,您显示的代码段不会导致任何内存泄漏。只有少数几种情况会在Java中发生内存泄漏:

<强> 1。当您进行自己的内存管理时。如果您为对象实现自己的数据结构,则可能发生内存泄漏。例如,如果您创建自己的堆栈实现,那么从堆栈“弹出”的对象仍然可以对它们进行活动引用。发生这种情况时,即使对象不再位于堆栈的活动部分,也不会对对象进行垃圾回收。这是少数情况之一,在这些情况下,将null主动分配给可能引用不再“被使用”的对象的元素非常重要。

<强> 2。任何时候你有一个长期存在的对象,它持有对你想要短暂存在的对象的引用。这可能导致内存泄漏的最常见情况是使用非静态内部类和匿名类(两者都包含对其封闭实例的引用)。

每个非静态内部类都有一个对其周围类的隐式引用。匿名类是类似的。要成功创建内存泄漏,只需将Inner Class对象传递给一个方法,该方法保持对提供的对象的引用,然后就完成了。

为什么这会导致内存泄漏?假设你实现了像缓存这样的东西。接下来是遵循本地对象的执行路径,该对象将一些内部类对象存储到缓存中。在本地对象超出范围之后,它将不再被垃圾收集!缓存中的内部类对象包含对周围对象的引用,并且该引用仍然是可引用的,因此不再是垃圾收集的候选者。匿名类也是如此!