2012-05-25 7 views
1

Java 응용 프로그램에 문제가 있습니다. 어제, 테스트를 실행하기 위해 배포했을 때, 우리는 우리 시스템이 스와핑을 시작했다는 것을 알아 차렸습니다. 이것이 진짜 괴물 앱이 아니지만, 내 말이 무슨 뜻인지 아시면 알 수 있습니다. 어쨌든 의 결과를 확인하여을 조사한 결과 약 100MB의 메모리를 먹는 것을 보았습니다. 메모리를 프로파일 링하고 메모리 누수가 있는지 확인하려고했으나 찾을 수 없었습니다. 나는 고정되어 있지 않은 PreparedStatement가 있었지만 그다지 의미는 없었다. 최소 및 최대 힙 크기 (일부는 힙 힙 크기가 필요하지 않다고 말함)를 설정하려고 시도했지만 아무런 차이가 없었습니다. 여기 Java 높은 메모리 사용량

#!/bin/sh 

$JAVA_HOME/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9025 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:MaxPermSize=40m -Xmx32M -cp ./jarName.jar uk.co.app.App app.properties 

최고의 결과입니다 :

이 내가 지금 실행하는 방법입니다

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                                           
16703 root  20 0 316m 109m 6048 S 0.0 20.8 0:14.80 java 

내가 최대 PermSize 및 최대 힙을 구성하는 것이 이해하지 못하는 것은 크기는 최대 72MB입니다. 어떤 것이 든 앱이 잘 돌아갑니다. 왜 그것은 109MB의 메모리를 먹고, 무엇을 먹고 있습니까? 그것은 꽤 높은 비율 인 37mb의 차이입니다. (34 %). 최대 힙 크기가 설정되고 메모리 부족 오류가 없기 때문에 이것이 메모리 누수라고 생각하지 않습니다.

인터 텍스 검사 중 하나는 VisualVM으로 힙 덤프를 만든 다음 EclipseMAT에서 검사 한 결과로 클래스 누수가 누출 될 수 있다고합니다. 이 그것을 말씀입니다 :

클래스 로더/구성 요소 "sun.misc.Launcher $ AppClassLoader 0x87efa40는 @"9,807,664 (64.90 %) 바이트를 차지합니다. 메모리는 내가이 대부분을 만들 수는 없지만, 유용 할 수있다 "짧은 [] []"0x87efa40

@ "".Keywords sun.misc.Launcher $ AppClassLoader에 의해로드의 한 인스턴스에 축적된다.

미리 도움을 주셔서 감사합니다.

편집 나는이 하나를 발견

는, 어쩌면 Tomcat memory consumption is more than heap + permgen space

답변

1

당신이 응용 프로그램을 프로파일 링하는 JConsole의 사용하려고 했 ... 내가 할 수있는 일은 없다 http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html 그렇지 않으면 당신은 또한 JProfiler와 재판을 사용할 수 있습니다 응용 프로그램을 프로파일 링하는 버전 http://www.ej-technologies.com/products/jprofiler/overview.html?gclid=CKbk1p-Ym7ACFQ176wodgzy4YA

그러나 높은 메모리 사용량을 확인하는 첫 번째 단계는 사용자가 우리인지 확인해야합니다 map, set, list 등의 응용 프로그램에서 객체 컬렉션을 수집합니다. 그렇다면 객체에 대한 참조를 객체와 함께 유지하고 있는지 확인합니다 (사용하지 않더라도).

+0

필자가 작성한 것처럼 필자는 프로파일 링을했기 때문에 어떤 문제도 발견 할 수 없었습니다. –

+0

다음 플래그를 조정 해보십시오. -XX : MaxHeapFreeRatio 및 -XX : MinHeapFreeRatio. 자세한 내용은 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html의 '성능 옵션' – Saurabh

4

자바의 메모리는

  • 힙 공간이 포함되어 있습니다.
  • perm gen 공간
  • 스레드 스택 영역.
  • JVM의 공유 라이브러리 (공유 됨)
  • 직접 메모리 크기.
  • 메모리 매핑 된 파일 크기는

내부 용으로 다른 사람이 될 가능성이있다 (공유됩니다).

37MB의 PC 메모리가 약 20 센트의 가치가 있다고 가정하면, 나는 그다지 걱정하지 않을 것입니다. ;)

+0

내 컴퓨터에 더 많은 메모리가 필요할 때마다 20 센트 씩 던져 넣을 수 있다면, 나는 가난한 사람이 될 것입니다 ...;) – brimborium

+0

내 관심사의 요점은이 응용 프로그램을 실행하는 서버가 512MB의 RAM을 가지고 있고이 응용 프로그램을 실행하면 컴퓨터가 스왑을 시작한다는 것입니다. 그래서이 37MB는 내가 그것을 줄일 수 있다면 그것이 나를 도울 수있는 방식에서 중요합니다. –

+0

메모리를 늘리는 데 드는 비용은 얼마입니까? 그것은 또한 당신을 도울 것입니다. –