AEM si arresta con OutOfMemoryError dopo il caricamento del PDF dovuto a Oracle JVM

Problema

Dopo aver caricato alcuni PDF, l'istanza di AEM si arresta.  Nei file di registro, si visualizza OutOfMemoryError.  Nelle immagini thread, si visualizzano thread come quello qui sotto che mostra i thread bloccati nel codice JVM sun.java2d.cmm.cmm.lcms.LCMS.createNativeTransform:

"JobHandler: /etc/workflow/instances/server0/2017-02-16/update_asset_833:/content/dam/geometrixx/documents/Test.pdf/jcr:content/renditions/original" #168 daemon prio=1 os_prio=0 tid=0x00007ff525c59800 nid=0x1ab7 runnable [0x00007ff3feffc000]
   java.lang.Thread.State: RUNNABLE
    at sun.java2d.cmm.lcms.LCMS.createNativeTransform(Native Method)
    at sun.java2d.cmm.lcms.LCMS.createTransform(LCMS.java:156)
    at sun.java2d.cmm.lcms.LCMSTransform.doTransform(LCMSTransform.java:155)
    - locked <0x000000077e9ae718> (a sun.java2d.cmm.lcms.LCMSTransform)
    at sun.java2d.cmm.lcms.LCMSTransform.colorConvert(LCMSTransform.java:268)
    at java.awt.image.ColorConvertOp.ICCBIFilter(ColorConvertOp.java:355)
    at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:282)
    at com.adobe.internal.pdftoolkit.image.ARGBImage.convertToRGB(ARGBImage.java:340)
    at com.adobe.internal.pdftoolkit.image.ARGBImage.handleICCColorSpace(ARGBImage.java:177)
    at com.adobe.internal.pdftoolkit.image.ARGBImage.convertToRGB(ARGBImage.java:310)
    at com.adobe.internal.pdftoolkit.image.ARGBImage.access$1300(ARGBImage.java:59)
    at com.adobe.internal.pdftoolkit.image.ARGBImage$ARGBTilesIterator.ConvertToRGB(ARGBImage.java:587)
    at com.adobe.internal.pdftoolkit.image.ARGBImage$ARGBTilesIterator.hasNext(ARGBImage.java:640)
    at com.adobe.internal.pdftoolkit.services.rasterizer.impl.RasterContentImageItem.writeToDisplayArea(RasterContentImageItem.java:211)
    at com.adobe.internal.pdftoolkit.services.rasterizer.impl.RasterDocument.createPage(RasterDocument.java:131)
    at com.adobe.internal.pdftoolkit.services.rasterizer.impl.PDFToRasterConverter.toBufferedImage(PDFToRasterConverter.java:127)
    at com.adobe.internal.pdftoolkit.services.rasterizer.PageRasterizer.next(PageRasterizer.java:98)
    at com.day.cq.dam.handler.standard.pdf.PdfHandler.getImage(PdfHandler.java:583)
    at com.day.cq.dam.handler.standard.pdf.PdfHandler.getImage(PdfHandler.java:546)
    at com.day.cq.dam.core.impl.cache.CQBufferedImageCache.getImage(CQBufferedImageCache.java:116)
    at com.day.cq.dam.core.impl.gfx.CommonsGfxRenderer.createImageLayer(CommonsGfxRenderer.java:460)
    at com.day.cq.dam.core.impl.gfx.CommonsGfxRenderer.createLayer(CommonsGfxRenderer.java:138)
    at com.day.cq.dam.core.impl.gfx.CommonsGfxRenderer.render(CommonsGfxRenderer.java:91)
    at com.adobe.cq.gfx.impl.GfxImpl.render(GfxImpl.java:94)
    at com.day.cq.dam.core.impl.RenditionMakerImpl$PlanBasedTemplate.apply(RenditionMakerImpl.java:127)
    at com.day.cq.dam.core.impl.RenditionMakerImpl.generateRenditions(RenditionMakerImpl.java:184)
    at com.day.cq.dam.core.process.CreateThumbnailProcess.createThumbnails(CreateThumbnailProcess.java:119)
    at com.day.cq.dam.core.process.ThumbnailProcess.execute(ThumbnailProcess.java:76)
    at com.day.cq.workflow.compatibility.CQWorkflowProcessRunner.execute(CQWorkflowProcessRunner.java:93)
    at com.adobe.granite.workflow.core.job.HandlerBase.executeProcess(HandlerBase.java:184)
    at com.adobe.granite.workflow.core.job.JobHandler.process(JobHandler.java:234)
    at org.apache.sling.event.impl.jobs.JobConsumerManager$JobConsumerWrapper.process(JobConsumerManager.java:512)
    at org.apache.sling.event.impl.jobs.queues.JobQueueImpl.startJob(JobQueueImpl.java:303)
    - locked <0x00000005cd6dab40> (a org.apache.sling.event.impl.jobs.queues.JobExecutionContextImpl)
    at org.apache.sling.event.impl.jobs.queues.JobQueueImpl.access$100(JobQueueImpl.java:66)
    at org.apache.sling.event.impl.jobs.queues.JobQueueImpl$1.run(JobQueueImpl.java:238)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Ambiente

AEM 6.x con JDK 8

Causa

Si tratta di un problema noto con l'elaborazione dei PDF in AEM (CQ-4202164) dovuto a un problema di Oracle JVM.

Risoluzione

Sui sistemi Windows e Mac che utilizzano Oracle JVM:

Se si utilizza Oracle JVM su Windows o Mac, configurare Java per utilizzare l'API KCMS legacy invece di LCMS.  C'è un problema noto che fa sì che questo non funzioni in JDK8 su Linux.

Modificare lo script di avvio AEM e aggiungere questo parametro JVM alla variabile CQ_JVM_OPTS:

-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider

Per esempio (snippet di script di avvio):

# default JVM options
if [ -z "$CQ_JVM_OPTS" ]; then
        CQ_JVM_OPTS='-server -Xmx1024m -XX:MaxPermSize=256M -Djava.awt.headless=true -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider'
fi

Altre soluzioni (tutti i sistemi operativi)

A. Elimina le operazioni di aggiornamento del flusso di lavoro delle risorse nei processi sling

  1. Vai su http://host:port/crx/de/index.jsp e accedi come utente amministratore.
  2. Sfoglia questo percorso dove {slingid} è lo sling id dell'istanza di AEM
    /var/eventing/jobs/assigned/{slingid}/com.adobe.granite.workflow.job.jobs etc.workflow models.dam update_asset.jcr_content model
  3. Fare clic con il pulsante destro del mouse e cancellare il nodo com.adobe.granito.workflow.job.job.etc.workflow models.dam.update_asset.jcr_content model
  4. Salva.
  5. Riavviare l'AEM.

Questo elimina tutti i processi sling attivi per i PDF che stanno arrestando l'AEM.

B. Installare lo strumento a riga di comando di PDF Rasterizer

  1. Scaricare questo file zip [1] sul server AEM.

  2. Decomprimere il file zip in una nuova cartella sul server.

  3. Caricare un file PDF sul server nella stessa cartella in cui è stato estratto il file zip.

  4. Eseguire questo comando in quella cartella per assicurarsi che il rasterizzatore funzioni (sostituire pdffilename.pdf con il nome del file del documento PDF).

    /opt/aem/author62/rasterizer/PDFRasterizer -d -p 1 -s 1280 -t PNG -i pdffilename.pdf

    L'output sarà qualcosa come sotto:

    Total time in image conversion (in ms): 163
    Total time (in ms): 896. Time to initialize: 12. Time for conversion: 884
  5. Supponendo che il rasterizzatore funzioni correttamente sulla riga di comando, seguire la procedura descritta in questo articolo per configurarlo in AEM.

  6. Oltre ai passaggi di quella pagina, è necessario modificare anche Aggiorna risorsa DAM passaggio flusso di lavoro Rasterizza rappresentazione anteprima immagine PDF/AI. Rimuovere l' applicazione/pdf dall'elenco di Tipi mime.

  7. Fare clic su Salva per salvare il modello di flusso di lavoro.

  8. Ora prova a caricare i PDF e le rappresentazioni generate velocemente e senza un elevato utilizzo di memoria.

Logo Adobe

Accedi al tuo account