2016-12-29 15 views
1

누출 memorry 때, 최대 절전 모드 - jpa2.1
을 내 프로젝트에만 100이있는 경우 너무 많은 개체 (약 2,000 개체)
이 개체 엔티티, 그것은 시작 정상.
하지만 이제는 모든 비즈니스 엔티티 클래스 (2000)를 추가했으며 Pergem 공간 오류가 발생했습니다.
는 글래스 피쉬 시작이 매우 느리게, JPA 최대 절전 모드에서 너무 많은 개체를 스캔 또는 내가 JavaEE7을 사용하고

2016-12-29T11:40:36.903+0700|Severe: Exception in thread "DynamicReloader" 
    2016-12-29T11:40:36.904+0700|Severe: java.lang.OutOfMemoryError: GC overhead limit exceeded 
    2016-12-29T11:40:37.899+0700|Severe: Exception in thread "AutoDeployer" 
    2016-12-29T11:40:37.900+0700|Severe: java.lang.OutOfMemoryError: GC overhead limit exceeded 

나는 JVM 메모리 매개 변수를 개선했습니다하지만 지금은 내 응용 프로그램이 시작하는 동안 매우 느립니다.
그래서이 엔티티를 더 빨리로드 할 수있는 옵션이 있는지 알고 싶습니다. 사전에 감사는

이 예 엔티티

@Entity 
@Table(name = "TBL_USER") 
@NamedQueries({ 
     @NamedQuery(name = "TblUserO.findAll", query = "SELECT t FROM TblUserO t") 
}) 
public class TblUserO implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "USER_ID", unique = true, nullable = false, precision = 11) 
    private Long userId; 

앱 지금 시작할 수 있도록 충분한 (permgen되지 않음) 힙 메모리를 증가하였으나으로 한

 <persistence-unit name="c1spostgre1" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>jdbc/__PSG1</jta-data-source> 
     <!-- Named JPQL queries per entity, but any other organization is possible --> 
     <properties> 
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/> 
      <property name="hibernate.enable_lazy_load_no_trans" value="true"/> 
      <!-- <property name="hibernate.archive.autodetection" value="class" /> --> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL92Dialect" /> 
      <property name="hibernate.jdbc.batch_size" value="20" /> 
      <property name="hibernate.order_updates" value="true"/> 
      <property name="hibernate.order_inserts" value="true"/> 
     </properties> 
    </persistence-unit> 
    <persistence-unit name="c1spostgre2" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>jdbc/__PSG2</jta-data-source> 
     <properties> 
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/> 
      <property name="hibernate.enable_lazy_load_no_trans" value="true"/> 
      <!-- <property name="hibernate.archive.autodetection" value="class" /> --> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL92Dialect" /> 
      <property name="hibernate.jdbc.batch_size" value="20" /> 
      <property name="hibernate.order_updates" value="true"/> 
      <property name="hibernate.order_inserts" value="true"/> 
     </properties> 
    </persistence-unit> 

답변

0

의 persistence.xml 메모리에로드해야 할 필요가 많은 모든 가비지 수집을 수행하는 동안 거의 모든 가비지 콜렉션을 수행하는 반면 느리게로드가 발생합니다. 앱의 광범위한 성능 튜닝이 필요한 것처럼 들리지만, 이는 StackOverflow 질문 범위 밖입니다.

0

응용 프로그램이 시작할 때 너무 많은 데이터를 데이터베이스에서로드하는 것 같습니다. 내 생각 엔 추가 엔티티가 너무 많은 열의 관계를 가지고 있으며 응용 프로그램이해야 할 일에 대해 너무 많은 불필요한 데이터를로드합니다.

엔티티 매핑을 검토하고 가능한 많은 게으른 관계를 줄이는 것이 좋습니다 (특히 * ToMany 릴레이션 모두가 게으르게 페치되어야합니다. 기본값 임). 불필요한 데이터가로드되는 것을 검색하여 SQL 쿼리의 로깅을 설정하여 데이터를 작성하는 데 사용되는 SQL 스크립트를 검색 할 수 있습니다. 응용 프로그램이 일부 테이블의 모든 엔티티를 메모리로로드하고 나중에 필터링 할 수 있습니다. 이는 효율적이지 않습니다.

JPQL 쿼리에 필터링을 다시 고려해야합니다. getResultList()을 호출하기 전에 findAll 쿼리 사용을 줄이거 나 적어도 검색된 엔터티의 수를 setMaxResult()으로 제한해야합니다.