java - 分形和 "java.lang.OutOfMemoryError: Java heap space"

标签 java out-of-memory heap-memory fractals

我在做Koch fractal snowflake在java中并将其保存在svg文件中。

我正在使用 LineStrip2D 类(它是实现可迭代的 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;
}

我有一个带有初始科赫曲线的模式:

enter image description here

我打电话:

pattern = GeometryHelper.repeatPatternIntoLineStrip2D(pattern, pattern, false);

现在的问题是:

经过一些迭代(851968),我遇到了java.lang.OutOfMemoryError:Java堆空间。 如何避免此错误并获得巨大的 svg 文件? 我认为我可以通过各个步骤来完成这个过程,但我不明白如何以聪明的方式实现它。

最佳答案

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

话虽这么说,处理分形时内存使用总会有一个上限。首先,您应该分析您的应用程序以查看所有内存的使用情况。一旦发现这一点,您就可以考虑重新解决问题,使其对内存更加友好。或者,您可以转向一种设计,在迭代之间迭代并将结果保存到磁盘,以节省先前迭代的内存。

关于java - 分形和 "java.lang.OutOfMemoryError: Java heap space",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8718229/

相关文章:

java - 在Hibernate4中配置查询缓存

java - 将 SWT DateSpinner 与 RAP 结合使用不会在焦点丢失时处理日历小部件

linux - 为什么用户进程可以由于内存碎片而调用 Linux OOM-killer,即使有足够的 RAM 可用?

java - BufferedReader 就绪方法

python - 将 rbf 与 scipy 一起使用时出现内存错误

android - 如何更正此错误 : java. lang.OutOfMemoryError

c++ - 避免堆损坏

命令行中的 Java 堆空间错误

C++堆栈数组限制?

Java绝对文件路径没有给出所需的路径