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
필자가 작성한 것처럼 필자는 프로파일 링을했기 때문에 어떤 문제도 발견 할 수 없었습니다. –
다음 플래그를 조정 해보십시오. -XX : MaxHeapFreeRatio 및 -XX : MinHeapFreeRatio. 자세한 내용은 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html의 '성능 옵션' – Saurabh