2016-05-22 37 views
3

私はPrimeFaces 5.3、JSF 2.2、Omnifaces 2.3でアプリケーションを作成しています。 私はjdk v8、Glassfish 4.1.1、MySQL 5を使用しています。JSF Out of Memory

セキュリティの観点からより多くの情報を提供するために、OWASP ZAPアプリケーションを使用しています。

問題は、私は、「メモリ不足 - JavaHeapSpace」いくつかを経験してるということです

Avvertenza: #{detailsController.loadDetail}: java.lang.OutOfMemoryError: Java heap space 
    javax.faces.FacesException: #{detailsController.loadDetail}: java.lang.OutOfMemoryError: Java heap space 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) 
    at javax.faces.component.UIViewAction.broadcast(UIViewAction.java:562) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.glassfish.tyrus.servlet.TyrusServletFilter.doFilter(TyrusServletFilter.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at com.classicvirus.jsf.LoggedUserWebFilter.doFilter(LoggedUserWebFilter.java:66) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:745) 
    Caused by: javax.faces.el.EvaluationException: java.lang.OutOfMemoryError: Java heap space 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    ... 46 more 
    Caused by: java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:3236) 
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) 
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) 
    at org.hibernate.type.descriptor.java.DataHelper.extractBytes(DataHelper.java:170) 
    at org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor.wrap(PrimitiveByteArrayTypeDescriptor.java:108) 
    at org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor.wrap(PrimitiveByteArrayTypeDescriptor.java:25) 
    at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$1.doExtract(BlobTypeDescriptor.java:48) 
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:235) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:231) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:222) 
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:296) 
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2762) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.loadFromResultSet(EntityReferenceInitializerImpl.java:307) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.hydrateEntityState(EntityReferenceInitializerImpl.java:235) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:103) 
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:238) 
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:112) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3991) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1142) 
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1025) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:632) 

を、私はいくつかの分を待っていれば、私は、これは私の推測が関連する

WARN: WELD-000714: HttpContextLifecycle guard leak detected. The Servlet container is not fully compliant. The value was 1 
    WARN: WELD-000225: Bean store leak was detected during org.jboss.weld.context.http.HttpRequestContextImpl association: [email protected] 
    WARN: WELD-000225: Bean store leak was detected during org.jboss.weld.context.http.HttpSessionContextImpl association: [email protected] 
    WARN: WELD-000335: Conversation context is already active, most likely it was not cleaned up properly during previous request processing: [email protected] 
    Grave: Unable to load class: 
    java.lang.OutOfMemoryError: GC overhead limit exceeded 

    Avvertenza: StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception 
    java.lang.OutOfMemoryError: GC overhead limit exceeded 

記録します参照します画像管理。私はありません、私は

<p:graphicImage value="#{applicationScopedBean.imagesFromDb}"> 
     <f:param name="imageId" value="#{actualAd.favouriteImageId}" /> 
     <f:param name="cvlTimeStamp" value="#{now}" /> 
    </p:graphicImage> 

アプリケーションは、私がomnifacesのアプローチだけに切り替えた豆

public StreamedContent getImagesFromDb() { 
    FacesContext context = FacesContext.getCurrentInstance(); 

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
     return new DefaultStreamedContent(); 
    } else { 
     String imageId = context.getExternalContext().getRequestParameterMap().get("imageId"); 
     return new DefaultStreamedContent(new ByteArrayInputStream(advertisingImageManager.getById(Long.valueOf(imageId)).getContent())); 
    } 
} 

スコープ過去 のFacelets実装でのこぎりをしたアプローチでは、データベースから取得した画像を使用しています運

Faceletsの

<o:graphicImage value="#{applicationScopedBean.getImageById(actualAd.favouriteImageId)}" class="img" lastModified="#{now}"/> 

applica明細スコープ付き

public byte[] getImageById(Long imageId){ 
    return advertisingImageManager.getById(imageId).getContent(); 
} 

「この問題をどのように解決できるか」という質問はありません。 しかし、まず第一に。 OWASP ZAPアプリケーションで作成されたこの問題について調査するのは正しいですか? 「はい」の場合、どこから調査を開始できますか?

+0

を使用して解決されます。これがメモリ消費量を調査する唯一の方法です。 – BalusC

答えて

0

NetBeansでbult-inプロファイラを使用しました。

私は問題が画像を表すbyte []型のフィールドにあるのを見ました。 私の場合、このフィールドのサイズは1.8Mbであり、多くのセッションでこの状況はメモリ不足エラーを引き起こしていました。

エラーは、プロファイラを実行して新しいエンティティに[]バイトをラッピングし、FetchMode.LAZY

+1

いい仕事です。私はこれものドキュメントで暗示されていたことに気付きたいと思います。 – BalusC

+1

はい、あなたが正しいと私はすべての疑問が始まったので、私はomnifacesのドキュメントを読んだ。おめでとうございます。これは、私の意見では人々が思うよりも有用であり、 "試してみる"の前に私はいつもすべてのドキュメンテーションを読んでいます。この方法であなた自身の知識を作ることができるからです。ありがとうございました! – Gavi

関連する問題