在IntelliJ IDEA中正确设置堆大小

12

我在IntelliJ IDEA中运行Processing应用程序时遇到了一个奇怪的问题。我想保存一张大图像,但实际上却遇到了以下异常:

Exception in thread "Animation Thread" java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferInt.(DataBufferInt.java:75) at java.awt.image.Raster.createPackedRaster(Raster.java:467) at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032) at java.awt.image.BufferedImage.(BufferedImage.java:331) at processing.core.PImage.saveImageIO(PImage.java:3117) at processing.core.PImage.save(PImage.java:3297) at OffScreenRender.stopRender(OffScreenRender.java:38) at MainVecField.draw(MainVecField.java:93) at processing.core.PApplet.handleDraw(PApplet.java:2305) at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243) at processing.core.PApplet.run(PApplet.java:2176) at java.lang.Thread.run(Thread.java:724)

很明显这里有一些内存分配问题。问题是,当我更改IntelliJ中的.vmoptions文件时,我得到了相同的结果,它们没有任何效果。IDE右下角的“memory”数字相应增加,但似乎不允许我的应用程序分配更多的内存。

当我在Processing IDE中运行处理应用程序时,通过设置大的堆大小,我可以成功保存更大的文件。

在IntelliJ中,似乎256mb以上的大小都没有什么影响。所以我的问题是如何在IntelliJ中设置更大的堆大小,以允许我的应用程序分配更多的内存?

感谢您的帮助!

如果有人想测试一下,我附上了我的项目代码:

import processing.core.*;

public class TestClassMain extends PApplet
{

    public static void main(String args[])
    {
        PApplet.main(new String[] { "--present", "TestClassMain" });
    }

    //Global variables
    OffScreenRender screenRender;
    int c = 0;

    //Variables for offScreenRender
    int resFactor = 10;
    boolean offScreenRenderSwitch = false;

    public void setup()
    {
        size(1000,700);
        background(0);
        stroke(255);

        //Initialize the render object
        screenRender = new OffScreenRender(this, 11000, 7950, resFactor);
    }

    public void draw()
    {
        frameRate(30);
        stroke(255);

        //Check if the render should be saved
        if(offScreenRenderSwitch == true){screenRender.startRender();}
        background(0,0,0);
        rect(20+c,height/2,60,60);

        if(offScreenRenderSwitch == true)
        {
            screenRender.stopRender();
            offScreenRenderSwitch = false;
        }
        c += 2;
    }

    public void keyPressed()
    {
        //Render the graphics to an offScreen buffer
        offScreenRenderSwitch = true;
    }
}


import processing.core.*;

/**
 * Renders the processingsketch to a .tif file at specified resolution.
 */

public class OffScreenRender
{
    PApplet parent; // The parent PApplet
    PGraphics render;
    int width;
    int height;
    int resFactor;

    OffScreenRender(PApplet p, int width_, int height_, int resFactor_)
    {
        //Initialize variables
        parent = p;
        width = width_;
        height = height_;
        resFactor = resFactor_;

        render = parent.createGraphics(width, height);
    }

    //Render the image
    void startRender()
    {
        parent.beginRecord(render);
        render.scale(resFactor);
        PApplet.println("first step");
    }

    //Render the image
    void stopRender()
    {
        parent.endRecord();
        PApplet.println("second step");
        render.save("hej");
        PApplet.println("final step");
    }
}
2个回答

39
改变vmoptions文件可以调整IntelliJ使用的内存,但您现在遇到的是由IntelliJ启动来执行应用程序的JRE的内存不足。 您需要调整运行/调试配置的VM选项部分中的内存设置,例如:

当我尝试在IntelliJ IDEA 15 CE中按照答案操作时,我的电脑实际上失败了 -Invalid maximum heap size: -Xmx (1024m)。 - stian
11
我使用-Xmx1024m(无空格)而不是-Xmx 1024m - Josiah Yoder

4

IntelliJ显示堆的使用量和当前大小。您正在尝试设置最大值,但它不会显示。

您可以通过运行jvisualvm将VisualVM附加到IntellIJ以查看最大值。


谢谢您的回答!您能否请再详细解释一下我该如何启动VisualVM?谢谢! - Lukas Arvidsson
2
你可以打开X-Term或MS-DOS提示符,或者点击“开始”->“运行”,然后输入jvisualvm。启动并找到在你的系统上运行的JVM后,选择IntelliJ IDEA。这非常简单,你应该试一试。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接