Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果多次创建HashMap对象,则会导致内存泄漏 公共类测试处理器{ 公共数据(){ 布尔成功=真; HashMap hMap=null; 如果(成功){ hMap=新的HashMap(); hMap.put(“一”、“爪哇”); hMap.put(“两个”、“servlet”); } 如果(hMap!=null){ 过程数据(hMap); } } 公共void processData(HashMap映射){ String param1=map.get(“一”); String param2=map.get(“两个”); } }_Java_Memory Leaks - Fatal编程技术网

Java 如果多次创建HashMap对象,则会导致内存泄漏 公共类测试处理器{ 公共数据(){ 布尔成功=真; HashMap hMap=null; 如果(成功){ hMap=新的HashMap(); hMap.put(“一”、“爪哇”); hMap.put(“两个”、“servlet”); } 如果(hMap!=null){ 过程数据(hMap); } } 公共void processData(HashMap映射){ String param1=map.get(“一”); String param2=map.get(“两个”); } }

Java 如果多次创建HashMap对象,则会导致内存泄漏 公共类测试处理器{ 公共数据(){ 布尔成功=真; HashMap hMap=null; 如果(成功){ hMap=新的HashMap(); hMap.put(“一”、“爪哇”); hMap.put(“两个”、“servlet”); } 如果(hMap!=null){ 过程数据(hMap); } } 公共void processData(HashMap映射){ String param1=map.get(“一”); String param2=map.get(“两个”); } },java,memory-leaks,Java,Memory Leaks,在上面的代码中,如果我们调用fillData()方法多次,如果条件变为true,则将多次创建HashMap对象。这会导致内存泄漏问题吗?如果发生内存泄漏,我们如何修复它?它不应创建内存泄漏,因为您将替换现有的HashMap,这将允许对旧的HashMap进行垃圾收集 如果在外部将对hashmap中的对象的引用保留,则可能会导致保留这些对象 *根据您的语法,我假设这是java。java虚拟机(JVM)主动并自动管理应用程序使用的内存。关于Java的内存管理,需要记住以下几点: 内存在堆内存中自动分

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

它不应创建内存泄漏,因为您将替换现有的HashMap,这将允许对旧的HashMap进行垃圾收集

如果在外部将对hashmap中的对象的引用保留,则可能会导致保留这些对象

*根据您的语法,我假设这是java。

java虚拟机(JVM)主动并自动管理应用程序使用的内存。关于Java的内存管理,需要记住以下几点:

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

  • 当您的程序无法再访问某个对象时(通常是由于超出范围,无法访问引用该对象的变量),内存将由一个称为垃圾收集的进程自动回收

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

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

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

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

2。任何时候,只要有一个长寿命的对象,其中包含对一个您希望是短命的对象的引用。这可能导致内存泄漏的最常见情况是使用非静态内部类和匿名类(两者都包含对其封闭实例的引用)

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


为什么这会导致内存泄漏?假设您实现了缓存之类的东西。接下来,按照执行路径找到一个本地对象,该对象将其一些内部类对象存储到缓存中。本地对象超出范围后,将不再进行垃圾收集!缓存中的内部类对象持有对周围对象的引用,该对象仍然是可引用的,因此不再是垃圾收集的候选对象。匿名类也是如此

你在用什么编程语言?将其添加为标记。你的编程语言有垃圾收集功能吗?使用java语言你读过关于java如何处理垃圾收集的内容吗?为什么你认为这段代码有内存泄漏?Dodd 10x我更新了代码。这会导致内存泄漏吗?看起来你不会导致内存泄漏。如果不再有对旧地图的引用,它将被垃圾收集。也就是说,我不知道为什么需要多次调用fillData@Dodd10x因为Java 7可以使用菱形操作符,是的,但这并不会产生类似
Map m=new HashMap()的东西不正确。这两者都是合法的,而且都很好。布莱恩,他有一个新的HashMap(),这是不正确的。
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");
 }
}