ヒープ割り当てが大きいためにメモリ不足の問題が発生しています。HP Diagnosticsツールから検証しましたが、コード内でarraylistの要素を追加しています。オブジェクトを早期にリリースできるように、このコードをどのように記述すればよいかわかりません。以下のコードされていますJavaでOutOfMemoryの問題が発生しました
private List<UpperDTO> populateRecords(List<BaseEntity> baseEntityList,List<DataEntity> dataEntityList) {
List<UpperDTO> masterDTOList = new ArrayList<UpperDTO>();
if(baseEntityList !=null && baseEntityList.size()>0){
BigDecimal conId = null;
for(BaseEntity baseEntity :baseEntityList){
conId = baseEntity.getConsignmentId();
ArrayList<StatusData> statusDataList = new ArrayList<StatusData>();
if(dataEntityList !=null && dataEntityList.size()>0){
for(DataEntity data : dataEntityList){
if(conId.equals(data.getConsignmentId())){
//making null to supress from the response
data.setConsignmentId(null);
statusDataList.add(TrackServiceHelper.convertStatusDataToDTO(data));
}
}
}
masterDTOList.add(TrackServiceHelper.populateDTO(baseEntity, statusDataList));
}
}
return masterDTOList;
}
public static UpperDTO populateDTO(TrackBaseEntity baseEntity,
List<StatusData> statusList) {
UpperDTO upperDTO = new UpperDTO();
//Setter methods called
upperDTO.setStatusData(statusList);
return upperDTO;
}
問題は、コードの行を次のように指摘されています
masterDTOList.add(TrackServiceHelper.populateDTO(baseEntity, statusDataList));
これは、JMSキューからメッセージを受信して、MDBは、これらのメッセージに耳を傾け、残りのAPIです。私はローカルまたはDev環境でこれをシミュレートすることができません。なぜなら、要求の数が多いときにパフォーマンステスト中に問題が発生するからです。これをどうすれば解決できますか?
これはHP Diagnosticsから収集漏れのスタックトレースです:
Chart Collection Class Contained Type Probe Collection Growth Rate Collection Size Leak Stack Trace Maximum Size
0, 0, 255 java.util.ArrayList com.rex.ih2.dtos.UpperDTO gtatsh645 3,848 122,312 java.util.ArrayList.add(ArrayList.java:413)
com.rex.ih2.utils.AppDAO.populateConsignment(AppDAO.java:168)
com.rex.ih2.utils.AppDAO.searchConsignment(AppDAO.java:93)
com.rex.ih2.service.AppService.fetchConDetail(AppService.java:131)
com.rex.ih2.service.AppService.getConDetail(AppService.java:69)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:76)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:607)
org.apache.webbeans.intercept.InterceptorHandler.invoke(InterceptorHandler.java:297)
org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.invoke(NormalScopedBeanInterceptorHandler.java:98)
com.rex.ih2.service.TrackService_$$_javassist_0.getConsignmentDetail(TrackService_$$_javassist_0.java)
com.rex.ih2.beans.TrackBean.action(TrackBean.java:35)
com.tnt.integration.bean.AbstractServiceBean.invokeService(AbstractServiceBean.java:259)
com.tnt.integration.bean.AbstractServiceBean.onMessage(AbstractServiceBean.java:157)
com.rex.ih2.beans.TrackBean.onMessage(TrackBean.java)
これはあなたが提供した2つの方法よりもはるかに大きい質問です。これは、コードの質問ではなく、IMHOという設計上の疑問です。私がここで尋ねる質問は、この情報はどこから来ているのか、そしてどこへ行くのでしょうか? JMSとMDBについて言及します。一度に小さな塊で情報を扱うことは可能ですか? – dcsohl
これは、データベース内で検索を行う必要のあるパラメータがほとんどないメッセージブローカからのリクエストメッセージを受け取るget APIです。この検索は、最初のメソッドで記述された2つのエンティティに移入します。これらのエンティティからは、別のDTOのリストもメンバー変数として持つDTOに値を設定する必要があります。このDTOは、応答オブジェクトに設定されます。 – Neel
ページネーションなどを適用できますか?とにかく 'baseEntityList'と' dataEntityList'の大きさはどれくらいですか?多分もっと大きなヒープサイズが必要なだけかもしれません。 – dcsohl