일반 작업, 일괄 작업 테이블 데이터, 테스트 데이터를 쓰기에서, paramList 및 tmBeanList이 정보를 통해 찾아 복구되지 만든 개체는 결국이 발견 Paozhaopaozhe 메모리 오버 플로우가 발생 테스트 중에 발견 된 약 10 만, 그리고, 발견 된 오브젝트 레퍼런스 카운트의 일부, 메모리의 그 비용이 있으며, 메모리를 원형 기준으로 객체를 생성하거나, 다른 사람이 계속해서주기를 카운트하지 않는, 각각의 사이클 (NULL로 설정) 오브젝트 레퍼런스의 파괴를 완료했다; 또는 루프의 본문에 참조 된 객체를 만드는 직접 체외 순환 용 오브젝트를 선언되도록 메모리에 하나의 오브젝트 레퍼런스, 각각의 새로운 객체 오브젝트 참조 다른 점이지만 메모리 하나만.
/ ** * 일반 작업 XXXX * @author XXX * XXX @date * @version XXX * / @Component (값 = "xxxJob" ) 공개 수업 xxxJob { @Transactional 공공 무효 doService (지도 <문자열, 개체> scheduleJob) { logger.info ( "----------------------- 작업, XXXXX ---------- 타이밍 시작" ) // 비즈니스 로직 --- --- 생략 서비스 코드를 위해 ( 지도 <문자열, 개체> 지도 : 목록) { 은 try { --- --- 생략 서비스 코드 목록 <지도 <문자열, 객체 >> tmBeanList = tMemberRfmDao.queryBeanForMap (TMR); 목록 <지도 <문자열, 객체 >> paramList = 새로운 ArrayList를 <> (); 만약 (! {CollectionUtils.isEmpty (tmBeanList)) ---省略业务代码--- 에 대한 (지도 <문자열, 개체> 회원 : tmBeanList) { 문자열 MEMBERID = (문자열) member.get ( "MEMBER_ID" ); 지도 <문자열, 개체> TML = 새로운 HashMap의 <> (); ---省略业务代码--- tml.put ( "data_status", 0 tml.put ( "CREATE_TIME" , DateUtils.getDate ( "YYYY-MM-DD HH : MM : SS" )); tml.put ( "UPDATE_TIME" , DateUtils.getDate ( "YYYY-MM-DD HH : MM : SS" )); paramList.add (TML); 경우 (paramList.size () == INT_TWO_THOUSAND) { tMemberLabelDao.saveBatch (paramList); paramList.clear (); } } 경우 (paramList.size ()! = 0 ) { tMemberLabelDao.saveBatch (paramList) } paramList = NULL ; tmBeanList = NULL; --- --- 로그 } 다른 { --- --- 로그 } } 캐치 (예외 E) { - - 예외 } } logger.info ( "----------------------- 종료시기 작업은 XXXX는" ); } }
주 (루프 외부에서 선언 된 객체는 객체 참조를 만드는 루프 본문은 개체 다른 개체에 대한 참조를 객체) :
개체 = null이 객체;
에 대한 (INT I = 0; 나는 <= COUNT, 나는 ++) {
객체 = 새 새 개체 ();
}