下列代码的红色部分会有Exception in thread "main" java.lang.OutOfMemoryError: Java heap space的异常,是由于tif图片分辨率为3307*4677,该如何处理import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.media.jai.JAI;
import javax.media.jai.TileCache;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.JDialog;
import javax.swing.JOptionPane;import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.media.imageio.plugins.tiff.TIFFImageReadParam;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDirectory;
import com.sun.media.jai.codecimpl.TIFFImageDecoder;public class TiffToPDF {
    Document document;
    PdfContentByte cb;    public TiffToPDF(String filename, String[] strImages) throws Exception {
        document = new Document();
        FileOutputStream rech = new FileOutputStream(filename);
        PdfWriter writer = PdfWriter.getInstance(document, rech);
        document.open();
        cb = writer.getDirectContent();
        for (int i = 0; i < strImages.length; ++i) {
            addImage(strImages[i]);
        }        document.close();
    }    public void addImage(String strImageName) throws Exception {
     TileCache cache =
         JAI.getDefaultInstance().getTileCache();
     long size = 1024*1024*1024L; // 32 megabytes
     cache.setMemoryCapacity(size);        System.out.println(strImageName);
        File file = new File(strImageName);
        SeekableStream stream = new FileSeekableStream(strImageName);
        TIFFDirectory dir = new TIFFDirectory(stream, 0);
        String[] names = ImageCodec.getDecoderNames(stream);
        ImageDecoder dec = ImageCodec
                .createImageDecoder(names[0], stream, null);
        int total = dec.getNumPages();
        ImageInputStream in = null; 
        in = ImageIO.createImageInputStream(file);
        
        for (int k = 0; k < total; ++k) {
            RenderedImage ri = dec.decodeAsRenderedImage(k);
            Raster ra = ri.getData();
            
            TIFFImageReadParam param = new TIFFImageReadParam();
            
            // (2.1) Decode as "BufferedImage"
           // PlanarImage pi1 = new RenderedImageAdapter(reader.read(k, param));            BufferedImage bi = new BufferedImage(ri.getColorModel(), Raster
                    .createWritableRaster(ri.getSampleModel(), ra
                            .getDataBuffer(), null), false, new Hashtable());
            Image img = Image.getInstance(bi, null, true);
            long h = 0;
            long w = 0;
            long IFDOffset = dir.getIFDOffset();
            while (IFDOffset != 0L) {
                dir = new TIFFDirectory(stream, IFDOffset, 0);
                IFDOffset = dir.getNextIFDOffset();
                h = dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_LENGTH);
                w = dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_WIDTH);
            }
            float percent = 100;
            int pos = 0;
            if (w > 895)
                percent = ((595 + 18) * 100 / w);
            if (h > 842)
                pos = (int) (842 - h * percent / 100);
            else
                pos = (int) (842 - h);
            System.out.println(percent);
            System.out.println(pos);
            img.scalePercent(percent);
            img.setAbsolutePosition(0, pos);
            System.out.println("Image: " + k);            cb.addImage(img);
            document.newPage();
        }
        stream.close();
        if(in != null){
         in.close();
        }
        // file.delete();
    }    public static void main(String[] args) {
        try {
            String[] temp = { "C:\\pic\\A4.tif" };
            TiffToPDF build = new TiffToPDF("A4.pdf", temp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }}