有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jsp java。lang.OutOfMemoryError:Java堆空间(仅在服务器上)

我有一个上传文件的应用程序。每次我试图上传一个大于几mb(只有1或2)的文件时,我都会遇到这个错误。只有当我试图将文件上传到托管我的网站的服务器上时,才会发生这种情况。当我在电脑上做测试时,我没有问题

我确信每次使用完InputStreamBufferedImagePart对象后,我都会关闭它们无论如何,即使我没有关闭它们,我也会遇到同样的错误

我怎样才能理解问题出在哪里?有办法或工具吗

服务器上的内存为64mb

我将向您展示主要的方法(您不可能阅读并理解所有的方法)

在我的servlet中,我用request.getPart();上传了文件,并将其放在我的对象Immagine的一个部分字段中

这是方法GestioneImmagine,它调用其他方法来检查文件是否是图像,以及文件是否太大

        public void gestioneImmagine(Immagine immagine) throws ImmagineException {

        try {

            //here i call the method the check if the file is a valid image
            if (getImmagineValida(immagine.getImmagineObbligatoria(), immagine.getPart())) {

// if is a "valid file" i  put in my image object a buffered image              
immagine.setImmagineBufferizzata(getImmagineBufferizzata(immagine.getPart().getInputStream()));

                // here i call the method that make 3 resizes for every image
                resizeMultiplo(immagine);
            }

            else {
                immagine.setImmagine(null);
            }           



            if(immagine.getImmagine()!= null){              
                immagine.getImmagine().close();

            }

            if(immagine.getImmagineBufferizzata()!= null){              
                immagine.getImmagineBufferizzata().flush();

            }

            if(immagine.getPart()!= null){              
                immagine.getPart().delete();

            }




        }
        catch (ImmagineException e) {
            throw new ImmagineException("(" + immagine.getDescrizione() + ") " + e.getMessage());
        }
        catch (Exception e) {
            throw new ImmagineException("Si è verificato un errore durante la gestione dell'immagine: " + e.getMessage());
        }   


    }

这里我调整了图片的大小,问题可能就在这里。如果我不使用这种方法,我没有任何问题

    public void resizeMultiplo(Immagine immagine) throws ImmagineException {

            String nomeOriginaleDelFile = immagine.getNomeFile();
            int[] dimensioniDasalvare = null; // here i put the 3 sizes, getting the sizes from a static array
            boolean immaginePrincipale = false;

            if (nomeOriginaleDelFile.equalsIgnoreCase(ApplicationInfo.nomeImmaginePrincipale)) {
                dimensioniDasalvare = ApplicationInfo.formatiImmaginePrincipale;
                immaginePrincipale = true;
            }

            else {
                dimensioniDasalvare = ApplicationInfo.formatiImmagineClassica; 
            }

            for (int i = 0; i < dimensioniDasalvare.length; i++) {

                try {

                    // i set the width of the image
                    immagine.setLarghezza(dimensioniDasalvare[i]);  


// here i make some test to understand  how to rename the file and which of the 3 sizes i have to use

                    if (dimensioniDasalvare[i] == ApplicationInfo.maxWidthImage) {
                        immagine.setNomeFile(nomeOriginaleDelFile);
                    } else if (immaginePrincipale) {


                        if (dimensioniDasalvare[i] == 500) {
                            immagine.setNomeFile(ApplicationInfo.nomeImmaginePrincipale);
                        } else {
                            immagine.setNomeFile(dimensioniDasalvare[i] + ApplicationInfo.separatoreTraDimensioneFotoENome
                                    + ApplicationInfo.nomeImmaginePrincipale);


                            immagine.setImmagineBufferizzata(getThumbnailQuadrato(immagine));
                        }

                    } else {
                        immagine.setNomeFile(dimensioniDasalvare[i] + ApplicationInfo.separatoreTraDimensioneFotoENome
                                + nomeOriginaleDelFile);

                        immagine.setImmagineBufferizzata(getThumbnailQuadrato(immagine));
                    }




                    if (immagine.getImmagineBufferizzata().getWidth() > dimensioniDasalvare[i]) {

                        immagine.setImmagineBufferizzata(getBufferedImageResized(immagine));

                    }





                    //here i call the method that write the file on filesystem
                    scriviImmagine(immagine);
                }
                catch(ImmagineException e){
                    throw new ImmagineException(e.getMessage());                
                }
                catch(MyFileException e){
                    throw new ImmagineException(e.getMessage());                
                }
                catch (Exception e) {
                    throw new ImmagineException("Si è verificato un errore durante il salvataggio su disco dell'immagine " + immagine.getNomeFile() + ": " + e.getMessage());

                }





            }

            immagine.setNomeFile(nomeOriginaleDelFile);
            immagine.setImmagineBufferizzata(null);
            immagine.setImmagine(null);

        }
    }

这就是错误所在

Exception in thread "http-bio-12418-exec-3" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(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.<init>(BufferedImage.java:331)
    at JeansEdizioni.Funzioni.ImmagineFunzioni.getBufferedImageResized(ImmagineFunzioni.java:148)
    at JeansEdizioni.Funzioni.ImmagineFunzioni.resizeMultiplo(ImmagineFunzioni.java:622)
    at JeansEdizioni.Funzioni.ImmagineFunzioni.gestioneImmagine(ImmagineFunzioni.java:397)
    at JeansEdizioni.Controller.ArtistiController.inserisciArtista(ArtistiController.java:244)
    at JeansEdizioni.Controller.ArtistiController.doPost(ArtistiController.java:307)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at JeansEdizioni.Filter.SessionFilter.doFilter(SessionFilter.java:83)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

共 (0) 个答案