I have this peculiar problem with running a Processing application in IntelliJ IDEA. I want to save a large image and to do this I run in to the following exception:
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)
So clearly there is some memory allocation problem here. The problem is that when i change the .vmoptions files in IntelliJ I get the same results, they have no effect. The "memory" number at the lower right corner of the IDE increases accordingly but it does not seem to let my application allocate more memory.
When I run the processing application in the processing IDE I can manage to save much larger files by setting a large heap size.
In IntelliJ nothing over 256mb seems to make a difference. So my question is how do I set a larger heap size in IntelliJ that allows my application to allocate more memory?
Thank you for your help!
I attach the code for my project in case anyone wants to test it out:
import processing.core.*;publicclassTestClassMainextendsPApplet{ publicstaticvoid main(String args[]) { PApplet.main(newString[]{"--present","TestClassMain"}); } //Global variables OffScreenRender screenRender; int c =0; //Variables for offScreenRender int resFactor =10; boolean offScreenRenderSwitch =false; publicvoid setup() { size(1000,700); background(0); stroke(255); //Initialize the render object screenRender =newOffScreenRender(this,11000,7950, resFactor); } publicvoid 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; } publicvoid keyPressed() { //Render the graphics to an offScreen buffer offScreenRenderSwitch =true; }}import processing.core.*;/**
* Renders the processingsketch to a .tif file at specified resolution.
*/publicclassOffScreenRender{ 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"); }}