2009-06-19 4 views
4

네이티브 C++ 라이브러리를 사용하는 Java로 작성된 서버 응용 프로그램을 조정하는 가장 좋은 방법은 무엇입니까?네이티브 프로세스로 Java 메모리 사용

환경은 4GB RAM이있는 32 비트 Windows 시스템입니다. JDK는 Sun 1.5.0_12입니다.

시작시 Java 프로세스에 1024MB의 메모리 (-Xmx)가 제공되지만 힙 공간 부족으로 인해 OutOfMemoryErrors가 자주 표시됩니다. 메모리가 1200MB로 증가하면 스왑 공간 부족으로 인해 OutOfMemoryErrors가 발생합니다. JVM과 네이티브 프로세스간에 메모리를 어떻게 공유합니까?

Windows/3GB 스위치가 기본 프로세스 및 Sun JVM에 영향을 줍니까?

답변

2

32 비트 시스템 (msw 및 기타)의 Java 설정과 관련하여 많은 문제가 있었으며 JVM에 1GB 미만의 RAM을 예약하여 모두 해결되었습니다.

그렇지 않으면 명시된 바와 같이 해당 프로세스에 대한 시스템의 실제 사용 된 메모리는 2GB 이상입니다. 그 시점에서 저는 프로세스의 '침묵의 죽음'을 겪고있었습니다. 오류도 경고도없고 단지 조용히 끝나는 프로세스였습니다.

동일한 시스템에서 여러 JVM (각각 1GB RAM 이하)을 실행하면 안정성과 성능이 향상되었습니다.

0

메모리가 JVM과 기본 프로세스간에 어떻게 공유됩니까?

Sun의 JVM 가비지 컬렉터는 마크 앤 스위프 방식이며 동시 및 증분 GC를 사용할 수있는 옵션이 있습니다.

더 정확하게 말하자면 위의 내용은 tenured (long-lived) 객체에만 적용됩니다. 젊은 오브젝트의 경우 GC는 스톱 앤 카피 콜렉터로 계속 수행되며 수명이 짧은 오브젝트로 작업 할 때 훨씬 좋습니다 (모든 전형적인 Java 프로그램은 많은 단 수명 오브젝트를 작성합니다).

복사 수집기는 힙의 모든 요소를 ​​탐색하고 참조되는 경우 새 힙으로 복사 한 다음 이전 힙을 삭제합니다. 따라서 1M 개체의 실제 개체에는 최대 2M의 실제 메모리가 필요합니다. 모든 개체가 살아 있으면 가비지 수집 중에 모든 개체가 2 부씩 생성됩니다.

그래서 JVM은 관리 및 가비지 수집에 상당한 오버 헤드가 있기 때문에 VM 내에서 실행되는 코드보다 많은 시스템 메모리를 필요로합니다.

Windows/3GB 스위치는 기본 프로세스 및 Sun JVM에 영향을 줍니까?

/3GB 허용하는 사용자 가상 메모리 주소 공간 만 그 헤더 IMAGE_FILE_LARGE_ADDRESS_AWARE 표시되는 실행 파일, 3기가바이트한다. 내가 아는 한, Sun의 java.exe은 아닙니다. 여기에 Windows 시스템이 없으므로 확인할 수 없습니다.

1

JNI memory management here에 대한 정보를 찾았습니다. 다음은 JVM JNI section on memory management입니다.

사용자 공간이 2GB 이상인 사용자 공간이 3GB인데 도움이 될 것입니다.하지만 스왑 공간이 2GB로 부족하여 문제가 발생하는 경우 3GB는 더 나빠질 것입니다. 페이지 파일의 크기는 얼마나 큽니까? 그게 끝났어?

jconsole을 jvm에 연결하여 힙 할당에 대해 더 잘 알 수 있습니다.

0

불행히도 문제를 충분히 설명하지 못했습니다. 진짜 질문은 --- 왜 자바 프로세스가 그렇게 많이 성장하고 있는지입니다. 메모리 누출이 있습니까? JVM에서 많은 양의 데이터를 가질 진정한 이유가 있습니까?

C++ 라이브러리가 C 스택에서 자체 메모리를 할당하고 있습니까? 아니면 Java 객체 공간에서 메모리를 할당하고 있습니까? 아니면 완전히 다른 작업을하고 있습니까?

관련 문제