java .lang.OutOfMemoryError при печати файла TIFF с использованием Java Print Service - PullRequest
0 голосов
/ 24 апреля 2020

Я использую Java Print Service для печати файла TIFF, это вызывает "java .lang.OutOfMemoryError: Java heap space".

      private void sendToPrinter(String fileToPrint) throws PrintException, IOException
      {
          /* Use the pre-defined flavor for a GIF from an InputStream */
          DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;

          /* Create a set which specifies how the job is to be printed */
          PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
          aset.add(MediaSizeName.NA_LETTER);
          aset.add(new Copies(1));

          /* Create a Print Service using the default printer */
          PrintService ps=PrintServiceLookup.lookupDefaultPrintService();
          DocPrintJob job=ps.createPrintJob();

//          System.gc();
          try (FileInputStream fis=new FileInputStream(fileToPrint))
          {
              Doc doc=new SimpleDoc(fis, flavor, null); 
              job.print(doc, aset);
          }
      }

Трассировка стека:

2020-04-23 15:32:03|DEBUG|SHPSKD010_160_TEST|Printing \\kanesrv02\imagedocs\certs\61107282.tif
2020-04-23 15:32:20|ERROR|SHPSKD010_160_TEST|java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(Unknown Source)
    at java.awt.image.Raster.createPackedRaster(Unknown Source)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at java.awt.image.BufferedImage.<init>(Unknown Source)
    at sun.java2d.loops.GraphicsPrimitive.convertFrom(Unknown Source)
    at sun.java2d.loops.GraphicsPrimitive.convertFrom(Unknown Source)
    at sun.java2d.loops.MaskBlit$General.MaskBlit(Unknown Source)
    at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Unknown Source)
    at sun.java2d.pipe.DrawImage.renderImageXform(Unknown Source)
    at sun.java2d.pipe.DrawImage.transformImage(Unknown Source)
    at sun.java2d.pipe.DrawImage.scaleImage(Unknown Source)
    at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
    at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
    at sun.java2d.pipe.ValidatePipe.copyImage(Unknown Source)
    at sun.java2d.SunGraphics2D.copyImage(Unknown Source)
    at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
    at sun.awt.windows.WPathGraphics.drawImageToPlatform(Unknown Source)
    at sun.print.PathGraphics.drawImage(Unknown Source)
    at sun.print.PathGraphics.drawImage(Unknown Source)
    at sun.print.ImagePrinter.print(Unknown Source)
    at sun.print.RasterPrinterJob.printPage(Unknown Source)
    at sun.print.RasterPrinterJob.print(Unknown Source)
    at sun.print.Win32PrintJob.printableJob(Unknown Source)
    at sun.print.Win32PrintJob.print(Unknown Source)
    at com.kanebridge.op.ui.SHPSKD010_160_TEST.sendToPrinter(Unknown Source)
    at com.kanebridge.op.ui.SHPSKD010_160_TEST.PRTALL_actionPerformed(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.kanebridge.common.ui.BasePanel.callMethod(Unknown Source)
    at com.kanebridge.common.ui.BasePanel.callMethod(Unknown Source)

TIF-файл довольно маленький, чуть более 500 КБ и содержит 7 страниц. Погуглил совсем немного, но не смог найти большой помощи. Увидел пост, предлагающий явно вызвать сборщик мусора перед печатью. Пробовал, но не сработало. Размер кучи JVM уже установлен на максимум 512 МБ.

java-vm-args="-Xms128m -Xmx512m -XX:PermSize=32m -XX:MaxPermSize=128m"

Цель программы - автоматически распечатать копию сертификата (без взаимодействия с пользователем) на принтере пользователя по умолчанию после завершение обработки отгрузки.

Почему это может вызвать проблемы с памятью, поскольку файл не так велик, и как решить?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 апреля 2020

Пожалуйста, попробуйте выполнить следующие шаги.

  1. Запустите ваше приложение из командной строки, используя следующую команду

    java -jar -Xmx1024M -XX: + PrintGCDetails - XX: + PrintGCDateStamps «\ your.jar» >> C: \ Temp \ Log.txt

  2. Откройте новую командную строку и перейдите в каталог JDK Bin и введите

    jcmd

  3. Теперь запишите идентификатор процесса и введите

    jmap -heap

  4. Теперь вы будете знать, сколько памяти выделено молодым, старым и куче и сколько процентов используется.

Это поможет вам понять, что происходит с ваше приложение. Пожалуйста, попробуйте и дайте нам знать, если это помогло.

...