2012-04-08 5 views
0

Eclipse Indigo를 사용하여 Java로 응용 프로그램을 만들고 있습니다. Eclipse를 사용하여 실행하면 작업 관리자는 javaw.exe가 50MB의 메모리를 사용하고 있음을 보여줍니다. 응용 프로그램을 실행 파일 .jar로 내 보낸 후 .jar을 실행하면 작업 관리자가 javaw.exe가 500MB를 사용하고 있음을 보여줍니다. 이유가 무엇인가요? 어떻게 해결할 수 있을까요?Java .jar에서 너무 많은 메모리를 사용합니다.

편집 : Windows 7 64 비트를 사용하고 있으며 시스템에 Java 1.7이 설치되어 있다고 나와 있습니다. 분명히 메모리 문제는 while 루프에 의해 발생합니다. 나는 문제를 일으키는 while 루프 안에있는 것을 연구 할 것이다.

편집 : 문제가 발견되었습니다. while 루프의 한 지점에서 새로운 BufferedImage 인스턴스가 생성되는 대신 동일하게 교체됩니다. BufferedImage.

+1

Eclipse 인스턴스를 앱 인스턴스와 혼동하지 않으시겠습니까? 이클립스는 자바 앱이기도하다. 그 외에도 프로파일 러를 사용하여 진행 상황을 파악할 수 있습니다. – jefflunt

답변

0

코드에 대한 추가 세부 정보가 없으면 프로필러를 사용하여 문제를 분석하는 것이 좋습니다. YourKit과 NetBeans에서 사용할 수있는 것이 매우 훌륭하다는 것을 알고 있습니다.

프로파일 러에서 앱을 실행 한 후에는 먼저 응용 프로그램 패키지에서 생성 된 객체와 수신기를 확인해야합니다. 문제가없는 경우 컨트롤이 확장되는 상황을 식별하고 해당 엔터티를 처리하는 코드를 살펴볼 때까지 다른 패키지로 검색을 확장 할 수 있습니다.

코드의 특정 부분을 여러 번 실행하고 해당 코드가 실행을 중지 한 후에도 여전히 메모리 사용률을 확인하면 누출이있을 수 있으며 종료시 변수/수신기가 null이되거나 비워질 수 있습니다.

좋은 출발점이되어야하지만 결과를 다시보고하십시오. 그래서 우리는 그것이 어떻게 진행되는지 알 수 있습니다. 그런데 어떤 운영 체제를 사용하고 있으며 어떤 Java 버전입니까?

--Luiz는

0

당신은 정확한 답을 얻을 수 있도록 코드를 프로파일 링 할 필요가 있지만 비슷한 사물을 내 경험에서 나는 종종 쓰레기 수집에 동일시. 예를 들어, 나는 같은 직업을 운영하고 10 개의 공연과 다른 2 개의 공연을했다. 두 게임은 모두 달리고 완성되었지만 10gigs는 더 많은 메모리를 사용했고 더 빨랐으며 두 번째 (2gig)는 쓰레기를 수집했다. 그래서 그것은 여전히 ​​완료되었지만 더 적은 메모리로 더 많은 시간을 보냈습니다. 나는 가비지 수집을 가정하지만 아마 당신이 말하는 것을 보았다.

당신은 .. (자바에 포함되어 jconsole를, 또는 VisualVM과 체크 아웃) 가장 독특한 소리

0

를 코드를 프로파일 링 할 필요가있다.

나는 두 가지 가능한 설명을 생각할 수 있습니다 : 당신은 잘못 javaw.exe 예를 바라 보았다

  • . 아마도 Eclipse를 실행하는 인스턴스를 살펴 보았을 것입니다.이 인스턴스는 크거나 클 수 있습니다.

  • 기본적으로 큰 힙으로 실행되도록 Java를 구성했습니다. 리눅스에서는 래퍼 (wrapper) 스크립트, 쉘 함수 또는 쉘 별칭으로이 작업을 수행 할 수 있습니다. 적어도 Windows에서 처음 실행하면됩니다.

나는 그것이 JAR 파일 자체라고 생각하지 않는다. AFAIK, JAR 파일에서 JVM 매개 변수를 설정할 수 없습니다. JAR 파일에 어떻게 든 다른 버전의 내용이 포함되어있을 수는 있지만 그 정도의 스트레치가 있습니다 ...

이러한 아이디어가 도움이되지 않는다면 프로파일 링을 시도하십시오.


문제 발견했다. while 루프에서는, 같은 BufferedImage를 옮겨 놓는 대신에, 생성 된 새로운 BufferedImage 인스턴스를 루프합니다.

아 예. BufferedImage는 많은 양의 힙 (out-of-heap) 메모리를 사용하므로 신중하게 관리해야합니다.

그러나 이것은 응용 프로그램에 다른 작업을 수행하라는 지시가없는 한 응용 프로그램이 Eclipse에서 실행될 때보 다 JAR에서 실행될 때 더 많은 메모리를 사용하는 이유를 설명하지 않습니다.

관련 문제