在无限循环中的ArrayList中添加随机整数期间是否存在堆空间异常?

时间:2014-10-28 08:46:11

标签: java arraylist memory-leaks garbage-collection

package com.org;

import java.util.ArrayList;
import java.util.Random;

public class MemoryProb {

   /**
    * @param args
    */
   public static void main(String[] args) {
       Random random = new Random();

       // Map<Integer, String> sampleMap = new HashMap<Integer, String>();
       ArrayList<Integer> a = new ArrayList<Integer>();

       while (true) {
           // Create and store a random pair.

           int randomValue = random.nextInt();
           System.out.println("ssss   " + randomValue);
           a.add(randomValue);
           System.gc();// i have added this and it delays or it handles the problem 
           // sampleMap.put(randomValue, String.valueOf(randomValue));
       }

   }

}

但我担心的是我需要ArrayList中所有插入的对象,我不确定System.gc();调用是否会删除ArrayList中最初存储的随机数,请帮忙什么应该是真正的解决方案 PS:在调用System.gc()之前,程序在大约7分钟后失败,但是在添加它之后它运行了2个多小时,但我再次确定它是否删除了{{1}中最初添加的数字}。

请帮忙。

4 个答案:

答案 0 :(得分:0)

基本上这是由无限循环引起的。

您正在添加并添加到ArrayList

要求系统gc无效,因为内存仍在使用中。

没有办法克服这一点。

答案 1 :(得分:0)

我认为您误解了System.gc的用法。你仍然将你的值添加到你的列表中 - 所以你仍然有一个指向那个inifite长列表的指针。

按照这种方式思考:每次你做一个新的任务时,旧值都会转到垃圾箱。 System.gc只是清理垃圾箱。 在你的情况下,你的垃圾箱里什么都没有,因为你从来没有分配过一个新值 - 你只需要创建一个新值,你就可以堆积在桌面上。

希望我能告诉你为什么这不是记忆问题。

编辑:System.gc不会删除您存储在数组中的任何值!所以你有无数的变量,永远不会被删除。

答案 2 :(得分:0)

首先,system.gc()不是提交命令,它只是一个触发命令,它将生成一个线程来检查是否需要垃圾收集,如果需要,那么它将清除堆大小仅用于未使用的对象。

其次垃圾收集不能在任何未被null初始化的元素上完成,因此如果你的程序在使用system.gc()之后运行超过7分钟,那么肯定是其他一些内存位置取消分配但是当你的堆大小变满并且无法完成垃圾收集时,你的代码肯定会产生outofmemory异常。

答案 3 :(得分:0)

System.gc()不会以任何方式更改您的程序,因为JVM无论如何都会执行垃圾收集。可以保证,在抛出OutOfMemoryError之前,可以尝试释放未使用的对象。

但是更频繁地调用System.gc()可能只会让你的程序更慢这就是为什么它看起来好像后面出现的错误,但程序仍然和以前完全一样;它只需要更多的时间。