2011-05-02 3 views
0

나는 자바로 개발 될 웹 기반 컴포넌트에 대해 연구 중이다. 그것의 일부는 webservices를 기반으로하고, 다른 하나는 Spring-MVC 프레임 워크와 지속성 레이어를위한 Hibernate를 가지고있다.구성 요소의 설계 단계에서 메모리 누출을 방지하는 방법은 무엇입니까?

나는 아직 디자인 과정에 있습니다 - 사용 사례, 활동 다이어그램 및 시퀀스 다이어그램 준비.

저는 궁금한 점은 - 디자인이 본질적으로 메모리 누수의 원인이 될 수있는 특정 방법이 없음을 보장하는 구체적인 방법은 무엇입니까? 적절한 코딩 가이드 라인에 이어 코드 검토를하면 메모리 누수가 프로그램에 존재하지 않지만 디자인 레벨은 어떻게 보장 할 수 있습니다. 우리는 모자를 씌우는 몇 가지 방법을 사용하여 개발자가 상상력을 거침없이 누출되지 않도록 보호 할 수 있습니다.

의견을 보내주세요.

감사합니다, Ujjwal

+0

자바에서는 처음부터 메모리 누수가 전혀 발생하지 않도록 프로그래밍해야합니다 :-) –

+0

간단하지 않은 두 가지 간단한 문제가 HashMap과 ThreadLocal과 관련되어 있습니다. C/C++로 누출되면 오류가 빨리 표시됩니다. Java에서는 좀 걸릴 수 있습니다. – Pih

답변

2

대부분의 메모리 누수는 사용 된 기술을 충분히 이해하지 못하는 Java 기반의 구현 오류로 인해 발생합니다. (예 : 4 가지 종류의 내부 클래스)

여기에서 도움이되는 유일한 방법은 개발자 기술에 시간과 돈을 투자하는 것입니다. - 최상의 독서 Effective Java Second Edition by Joshua Bloch

메모리 음을 자주 일으키는 다른 영역은 동시성입니다. -이 지식 (및 다른 동시성 문제)을 처리하는 가장 좋은 방법은 구현하기 전에 어느 구성 요소를 저장해야하는지 (단일 스레드 환경에서 실행해야하는지)를 정의하는 것입니다. 그리고 그들이 쓰레드 저장을 구현할 필요가 있다면, 누가 쓰레드를 확실히 저장 하는지를 구현하기 전에 정의하십시오 (함수와 메소드는 무엇에 의해 보호되는지).

디자인에서 마지막으로 할 수있는 일은 정적 필드에주의하십시오.

다른 하나는 디자인으로 할 수 있다고 생각하는 것은 워치 독을 만드는 것입니다.목록의 일부 항목이 손실 될 때 큰 문제가 아닌 동적 목록 (예 :)이 있고 목록이 일부 문제 (스레딩 또는 구현 실패)의 원인이 될 수 있음을 알고 있다면 그것은 당신이 기대했던 것보다 훨씬 커지면 목록을 지우는 워치 독입니다. (그런 다음 문제를 일으키는 버그를 수정하십시오!) - 그런 목록의 예는 증권 거래소 GUI 업데이트 이벤트 목록 (주식 관련 웹 사이트가 아님) 일 수 있습니다. 코스 업데이트 하나가 클라이언트에 전송되지 않고 다음 서버로 전송되는 경우 (1 초 후), 전체 서버를 다운시키는 것보다 한 번의 업데이트 손실이 훨씬 낫습니다.

0

그것은 당신이 걱정해야뿐만 아니라 메모리입니다. 스레딩, 파일 및 네트워크 연결과 같은 리소스도 고려해야합니다.

Pattern-Oriented Software Architecture, Volume 3: Patterns for Resource Management 책을 읽을 것을 권유 할 수 있습니다. 여기에는 고려해야 할 몇 가지 유용한 패턴이 포함되어 있습니다. 자바에서 메모리 누수의 가장 일반적인 사례

1

하나 캐싱이다

연결이 종료
Map<String, Connection> userConnection = new HashMap<String, Connection>(); 
// cache connections: 
userConnection.put("User X", connectionInstance); 
// connectionInstance is closed but never the userConnection.remove("User X") is called. 

,이 매핑은 메모리 누수를 갖는 클리어되지 않는다.

질문에 대답하기 위해 "normal"HashMap을 사용하는 대신 WeakHashMap (http://download.oracle.com/javase/6/docs/api/java/util/WeakHashMap.html)을 사용하여 가이드 라인을 작성하십시오.

+0

+1 -로드/사용자 수를 늘리면 보통 몇 달 후에 물지 않습니다. – SimonJ

0

디자인 단계에서 메모리 누수를 방지 할 수 있다고 생각하지 않습니다. 그러나 JMeter/Grinder/Loadrunner와 같은 기존로드 테스트 도구를 사용하면 메모리 누수를 발견하여 릴리스 전에 해결할 수 있습니다.

성능 테스트는 단위 테스트 및 통합 테스트와 마찬가지로 개발 프로세스의 모든 단계에 참여해야합니다.

0

시스템을로드하는 것은 리소스 누출을 발견하는 데 어려움이 있습니다. 두 번째 과제는 리소스가 어떻게 사용되고 잠재적으로 충돌 하는지를 이해할 수있는 적절한 모니터 및 진단 유틸리티 시스템을 갖추는 것입니다.

결국 리소스 누출은 메모리, 디스크, 네트워크 및 CPU의 네 가지 범주로 나뉩니다. 앱 코드, 자바 또는 데이터베이스와 같은 게스트 운영체제 또는 핵심 운영체제를 사용하는 경우 수집 할 수있는 모든 측정 항목은 이러한 항목의 하위 집합입니다.

모니터링은 시스템 성능에 오버 헤드를 줄 수 있기 때문에 엔지니어링 담당자는 문제가 확인 될 때까지 최고 수준의 통계로 이동 한 다음 코어 및 게스트에 대해 확인 된 리소스 누수 클래스에서 더 높은 수준의 모니터링을 배포하는 경향이 있습니다 OS가 가능성있는 원인을 찾아야합니다.

단위 테스트 및 구성 요소 어셈블리 단계로 돌아가는 과정을 프로파일 링하는 데 도움이 될 수있는 경량의 깊은 진단을 찾고 성능 테스트 노력을 통해 동일한 도구를 가지고 있다면 다음에서 솔루션을 추천 할 수 있습니다. 이 조직은 http://www.rtiperformance.com/입니다.

제임스 풀리

사회자 : SQAForums의로드 러너 | WinRunner, 구글 그룹스 LR-로드 러너, YahooGroups로드 러너 | 고급 -로드 러너, 링크드 인로드 러너 (소유자) | LoadRunnerbyTheHour (owner)

관련 문제