Java eclipse在堆状态栏中正常时显示“内存不足”

Java eclipse在堆状态栏中正常时显示“内存不足”,java,eclipse,memory,configuration,out-of-memory,Java,Eclipse,Memory,Configuration,Out Of Memory,我正在运行JUnit测试 根据eclipse状态栏,我的堆空间最大为497M 我的另一个程序开始时接管441。然而,我尝试运行的测试显示“内存不足”。只需要304分钟 我不知道为什么会出现这种情况,有没有检查清单 下面是我的错误消息: SRCTest.testChannelsWithPrograms testChannelsWithPrograms(com.test.svc.SRCTest) java.lang.OutOfMemoryError: Java heap space at j

我正在运行JUnit测试

根据eclipse状态栏,我的堆空间最大为497M

我的另一个程序开始时接管441。然而,我尝试运行的测试显示“内存不足”。只需要304分钟

我不知道为什么会出现这种情况,有没有检查清单

下面是我的错误消息:

SRCTest.testChannelsWithPrograms
testChannelsWithPrograms(com.test.svc.SRCTest)
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
    at java.lang.StringBuilder.append(StringBuilder.java:119)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at java.util.AbstractCollection.toString(AbstractCollection.java:422)
    at java.lang.String.valueOf(String.java:2826)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at java.util.AbstractMap.toString(AbstractMap.java:490)
    at java.lang.String.valueOf(String.java:2826)
    at java.io.PrintStream.println(PrintStream.java:771)
    at com.zinnaworks.test.svc.SRCTest.testChannelsWithPrograms(SRCTest.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
谢谢

===============================================================================

附加部分代码以获得更好的解决方案:D

public class ProgramTbody {
    public static List<Map<String, Object>> injectProgram2Channel (
            List<Map<String, Object>> channelList, List<Map<String, Object>> programList) throws Exception {

        List<Map<String, Object>> returnChannelArray = new ArrayList<Map<String,Object>>();
        for(int i = channelList.size() - 1; i >= 0; i--){
            Map<String, Object> returnElement = new HashMap<String, Object>();

            returnElement.putAll(channelList.get(i));

            String sid = returnElement.get("SID").toString();
            List<Map<String, Object>> programsForChannel = new ArrayList<Map<String,Object>>();

            for(int j = programList.size() - 1; j >= 0; j--){
                if(programList.get(j).get("SID").equals(sid)){
                    programsForChannel.add(programList.get(j));
                    programList.remove(j);
                }
            }

            returnElement.put("pros", programsForChannel);
            returnChannelArray.add(returnElement);
            channelList.remove(i);
        }
        return returnChannelArray;
    }
};

异常表示在调用java.io.PrintStream.println期间发生异常。您需要找到println所在的行,并可能将其删除。

JVM需要连续的内存。例如,如果要复制一个100MB的阵列,则需要超过100MB的阵列是连续的。仅仅拥有200MB是不够的。你用什么方法来确定它只需要304?merlin2011我不确定这个数字到底代表什么,但它称为“eclipse堆状态栏”。它以条形图的形式显示堆内存使用情况。@juneyongoh,有没有可能堆在数组副本之前只有304,然后数组副本在Eclipse检测到它之前将其推到边缘?@Java1根据Eclipse堆状态栏,它只需要304M,最大值是497M。