Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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.lang.OutOfMemoryError:java堆空间;_Java_Out Of Memory_Heap Memory_Fractals - Fatal编程技术网

分形与;java.lang.OutOfMemoryError:java堆空间;

分形与;java.lang.OutOfMemoryError:java堆空间;,java,out-of-memory,heap-memory,fractals,Java,Out Of Memory,Heap Memory,Fractals,我正在用java做,并将其保存在svg文件中 我用LineStrip2D类来记忆分形(它是实现iterable的Vec2D的ArrayList的包装器) 主要功能是: public static LineStrip2D repeatPatternIntoLineStrip2D( LineStrip2D pattern, LineStrip2D polygon, boolean repeatUp) { /* * pattern:

我正在用java做,并将其保存在svg文件中

我用LineStrip2D类来记忆分形(它是实现iterable的Vec2D的ArrayList的包装器)

主要功能是:

public static LineStrip2D repeatPatternIntoLineStrip2D(
        LineStrip2D pattern,
        LineStrip2D polygon, 
        boolean repeatUp) {

    /*
     * pattern: must be a pattern between Vec(0,0) and Vec(1,0)
     *          (normalized beetween 0-1 and in X axis)
     * */

    float angle, distance;
    Vec2D pivot, a, b, direction, b1;
    LineStrip2D new_polygon = new LineStrip2D();

    new_polygon.add(pattern.vertices.get(0));
    a = polygon.vertices.get(0);

    int count=0;
    for (int i = 1; i < polygon.vertices.size(); i++) {
        b = polygon.vertices.get(i);
        a = polygon.vertices.get(i-1);

        distance = b.distanceTo(a);
        direction = b.sub(a).normalize();
        angle = PApplet.atan2(direction.y, direction.x);
        pivot = a;

        for (int j = 1; j < pattern.vertices.size(); j++) {
            Vec2D _b1 = pattern.vertices.get(j);

            b1 =  _b1.copy() ;

            if(repeatUp)b1.y *= -1;             
            b1.scaleSelf(distance);
            b1 = b1.rotate(angle);
            b1.addSelf(pivot);

            new_polygon.add(b1);
            count++;
        }
        a = b;
    }
    System.out.println(count);
    return new_polygon;
}
现在的问题是:

经过一些迭代(851968),我得到了一个java.lang.OutOfMemoryError:java堆空间。 如何避免此错误并实现一个巨大的svg文件?
我想我可以通过不同的步骤完成这个过程,但我不知道如何以智能的方式实现它。

首先,为什么要使用变量
count
?您可以将其替换为
System.out.println(polygon.vertices.size()*polygon.vertices.size())
并删除一个无用的递增
计数操作


对于内存不足错误,请尝试增加VM的堆大小。首先,为什么要使用变量
count
?您可以将其替换为
System.out.println(polygon.vertices.size()*polygon.vertices.size())
并删除一个无用的递增
计数操作


对于内存不足错误,请首先尝试增加VM的堆大小,最简单的方法是为JVM提供更多内存。添加-Xmx=1g可能就足够了(在当今的大多数机器上都可以)。如果您需要更多,可以随意添加更多,直到超出您机器中的可用范围


这就是说,处理分形时,内存使用总是会有一个上限。首先,您应该分析您的应用程序,以查看所有内存的使用位置。一旦你发现了这一点,那么你可以考虑重新处理这个问题,让它变得更易于记忆。或者,您可以转换为在迭代之间迭代并将结果持久化到磁盘的设计,以节省以前迭代的内存。

首先也是最简单的是为JVM提供更多内存。添加-Xmx=1g可能就足够了(在当今的大多数机器上都可以)。如果您需要更多,可以随意添加更多,直到超出您机器中的可用范围


这就是说,处理分形时,内存使用总是会有一个上限。首先,您应该分析您的应用程序,以查看所有内存的使用位置。一旦你发现了这一点,那么你可以考虑重新处理这个问题,让它变得更易于记忆。或者,您可以转换为在迭代之间迭代并将结果持久化到磁盘的设计,以节省以前迭代的内存。

正如其他人所提到的,第一步是尝试看看是否可以通过修改JVM堆大小来实现所需的迭代次数(这是命令行参数-Xmx=…其中…是您希望分配的最大内存大小)。如果您的机器上有足够的RAM,那么您可以将其设置得非常高(也许有一种方法可以让JVM使用磁盘交换空间,因此它可能会非常高,但我不知道如何/是否可能)


如果这还不够,那么您将需要管理并序列化您在迭代(非递归)实现中使用的堆栈,并将其存储到磁盘上。这看起来像是您将堆栈作为参数传递给函数,函数将从堆栈中读取其参数(将其保留在堆栈上),然后在循环自身之前将参数写入堆栈(当达到所需的最大深度时,就开始从堆栈中弹出数据)。迭代实现和堆栈管理非常重要,堆栈的序列化/持久化也是如此(这将需要管理自身,以便在磁盘大小增加时将部分存储到磁盘上)。

正如其他人所提到的,第一步是尝试通过修改JVM堆大小(它是命令行参数-Xmx=…其中…是您希望分配的最大内存大小)来实现所需的迭代次数。如果您的机器上有足够的RAM,那么您可以将其设置得非常高(也许有一种方法可以让JVM使用磁盘交换空间,因此它可能会非常高,但我不知道如何/是否可能)


如果这还不够,那么您将需要管理并序列化您在迭代(非递归)实现中使用的堆栈,并将其存储到磁盘上。这看起来像是您将堆栈作为参数传递给函数,函数将从堆栈中读取其参数(将其保留在堆栈上),然后在循环自身之前将参数写入堆栈(当达到所需的最大深度时,就开始从堆栈中弹出数据)。迭代实现和堆栈管理非常重要,堆栈的序列化/持久化也是如此(随着磁盘大小的增加,它需要自行管理以将部件存储到磁盘上)。

我认为问题与装入ArrayList的LineStrip2D类有关:该列表实现是由一个数组作为后端的,该数组的大小呈线性增长(如本文所述)。 我认为内存不足是因为ArrayList在保留旧数组()的同时,分配了一个新大小的完整数组。
您应该增加总堆,但切换到LinkedList应该会改善这种情况。

我认为问题与包含ArrayList的LineStrip2D类有关:该列表实现是由一个数组的后端实现的,该数组的大小线性增长(如本文所述)。 我认为内存不足是因为ArrayList在保留旧数组()的同时,分配了一个新大小的完整数组。
您应该增加总堆,但切换到LinkedList应该会改善这种情况。

我怀疑消除一个变量是否能解决他的堆大小问题。我只是指他在他的内存中有一些无用的操作code@Jas
pattern = GeometryHelper.repeatPatternIntoLineStrip2D(pattern, pattern, false);