He hecho y MVC aplicación web en Java, pero cuando voy a ejecutarlo, una vez al día, se vuelve de nuevo hacia abajo debido a un error de memoria.

Este error es este:
Excepción en el hilo «http-abr-12136-exec-42» de java.lang.OutOfMemoryError: Java heap space

java.sql.SQLException: java.lang.OutOfMemoryError: Java heap space

Tengo el hprof con las estadísticas del accidente, donde específicos de cómo es la memoria utilizada. Si abro la hprof con el Eclipse de Memoria analizador de atención, tengo los resultados:

Rar: https://mega.co.nz/#!Ht41xJDJ!MooePBSv5yOYSNN5OuvF7Afn2rcN-KJ2tXGSsgqtsaI

O en una carpeta: https://mega.co.nz/#F!6hJUyKbQ!D_Kb23E3KfAJqcd5EeAt0A

En el informe general, tengo este gráfico (OverviewEMA.JPG):
No sé lo que este gráfico de decir… no lo entiendo.

En la segunda pestaña, el informe predeterminado, tengo este gráfico (DefaulReport_EMA.JPG):
Es decir que el problema puede ser una instancia de «org.hibernate.interna.SessionFactoryImpl». Pero no sé cómo resolver esa instancia.

En el siguiente pestañas. En el dominador del árbol, aparece de nuevo la instancia anterior, que el uso de alrededor de 42MB de la memoria (el mismo que se muestre el primer gráfico). La imagen es DominatorTree_EMA.JPG

Si puedo ampliar la primera clase (la clase que da problemas), tengo este gráfico (DominatorTreeExpanded_EMA.JPG):

En la siguiente pestaña, en el histograma de la imagen es esta (Histogram_EMA.JPG):

Y en el Inalcanzable objetos, el resultado es este (UnreachableObjects_EMA.JPG):

No entiendo muy bien este último 2 de gráficos

Por último, también tengo el informe de Java VisualVM, donde tengo los resultados (Heapdump_JVM.JPG):

De acuerdo a este gráfico, el HashMap objetos son el problema, además de un número Entero y objetos de Cadena. El Hashmap objetos que creo que son los objetos del modelo que el de las clases de enviar a los archivos jsp, y proceder a partir de la JPA Objetos (los objetos de la Hibernación), por lo que el problema podría ser esto, pero no sé cómo resolverlo…

Podría alguien ayudarme? Alguien sabe cómo puedo solucionarlo? ¿Necesita más información?

Gracias!

OriginalEl autor pitu_rfr | 2013-07-24

3 Comentarios

  1. 4

    Sobre la revisión de DominatorTree_Expanded, que parece ser la creación de SessionFactorys repetidamente (hay 144 en la memoria). Este debe ser creado sólo una vez, al inicio, a continuación, utilizar para crear cualquier número de Sesiones.

    Ver también mis comentarios a continuación sobre el uso adecuado de la Sesión de Hibernate.


    Su sesión de Hibernate debe ser local a la solicitud-y cerrado cuando finalice la solicitud. Usted puede utilizar el «OpenSessionInView» patrón de unirse a una sesión para el hilo durante el procesamiento en el Controlador & Vista (JSP) de representación.

    Sospecho, ya que se va OutOfMemory, que están manteniendo una Sesión de Hibernate como una «variable de instancia» de su Controlador — o como un conjunto estático en algún lugar. Esto nunca debe hacerse.

    Desde la web de peticiones puede ser concurrente, un Controlador nunca debe compartir el procesamiento de solicitudes estado (como Hibernate Sesiones, o mutable variables) como variables de instancia. Esto podría causar interacciones no deseadas entre las distintas solicitudes de & hilos.

    Gracias. Estoy tratando de hacer esto, pero no sé cómo tengo que usar el OpenSessionInView. Usted piensa que el error en el Controlador? Tal vez esto? @Controlador de clase pública HelloController { @RequestMapping(valor=»/hello.htm») público ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Controlador de la multa, no puede ser algo extraño cómo configurar el SessionFactory o ApplicationContext. Lo que estás haciendo, lo estás haciendo muchas veces cuando debe hacerse una vez. Ver: static.springsource.org/spring/docs/3.0.x/reference/…

    OriginalEl autor Thomas W

  2. 1

    Lo siento, yo no puedo escribir con espacios de línea, por lo que voy a escribir en una nueva respuesta.

    El problema podría ser el texto que puse antes en el comentario de tu respuesta? Yo declare las Clases Controlador como este.

    @Controller
    public class HelloController {
    
        @RequestMapping(value="/hello.htm")
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    El objeto que me cree muchas veces es que HttpServletRequest y la Respuesta? O es otro?

    No sé donde puedo crear la SessionFactorys.

    Otro lugar posible, podría ser en el Dao, donde declaro un Gerente de la Entidad como esta en todos los Dao.

    @Repository(value = "contratoDao")
    public class JPAContratoDao implements ContratoDao {
    
        private EntityManager em = null;
    
        /*
         * Sets the entity manager.
         */
        @PersistenceContext
        public void setEntityManager(EntityManager em) {
            this.em = em;
        }

    Algo de esto podría ser el problema?

    Gracias de nuevo!

    No me gusta el EntityManager ser declarado como una variable de instancia en su DAO.. Si este es un DAO Servicio/Fachada/Administrador, en contraposición a los Datos de la Entidad, está mal. EntityManagers (hibernate Sesiones) están destinados a ser por petición de web & distintos para separar los hilos, no se & cultivo y la acumulación de datos para el tiempo de vida de la aplicación.
    Compartir la HB período de Sesiones (JPA EntityManager) también es completamente incorrecta para multi-usuario/ uso simultáneo.
    Ok. Estaba leyendo la Primavera tutorial de nuevo cuidadosamente. ¿Usted dice que yo no debería compartir HB Sesión. Es la verdad? Si dices esto, ¿qué debo hacer? Debo usar SessionFactory en lugar de EntityManager? O debo cambiar mi applicationContext o la declaración de mi JPADao?
    Uso SessionFactoryUtils.getSession() para obtener el actual período de sesiones, y OpenSessionInView Filtro para enlazar una Sesión de Hibernate para el subproceso actual para la duración de la solicitud de procesamiento de & vista (JSP) de representación. Hibernate Sesiones debe ser por solicitud, no de larga duración & compartida a nivel mundial, ya que es la causa de su crecimiento perpetuo & M’problema, así como la de ser totalmente incorrecta de roscado & multi-usuario puntos de vista.
    También puede utilizar SessionFactory o EntityManagerFactory (JPA equivalente), y crear una Sesión/EntityManager por el método de llamada. Sin embargo los objetos devueltos de esta manera, no puede perezoso-carga después de cerrar la Sesión. Ya he ayudado a usted & respondió correctamente la pregunta, se puede aceptar mi respuesta anterior, ahora. Thx.

    OriginalEl autor pitu_rfr

  3. 1

    Aceptar. Gracias.

    Y cómo debo declarar el EntityManager??

    Estoy leyendo el enlace de Hibernación en Springsource, pero no veo nada extraña en mi código. No sé cómo tengo que hacer…

    Mi applicattionContext.xml es este:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!-- holding properties for database connectivity /-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- enabling annotation driven configuration /-->
    <context:annotation-config/>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username"  value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </bean>
    <bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource"
    p:jpaVendorAdapter-ref="jpaAdapter">
    <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
    </property>                             
    <property name="persistenceUnitName" value="springappPU"></property>
    </bean>
    <bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:database="${jpa.database}"
    p:showSql="${jpa.showSql}"/>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory"/>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <!-- Scans the classpath of this application for @Components to deploy as beans -->
    <context:component-scan base-package="com.companyname.springapp.repository" />
    <context:component-scan base-package="com.companyname.springapp.service" />
    </beans>

    Cómo tengo que hacer la applicationContext.xml? Y cómo debo declarar el EntityManager en las clases?

    ¿O crees que debo usar SessionFactory??

    Lo siento por las molestias.

    OriginalEl autor pitu_rfr

Dejar respuesta

Please enter your comment!
Please enter your name here