2008-10-30 5 views
1

Linux, AIX 및 HP-Ux (PA-RISC)에서 실행되는 Java 응용 프로그램을 제공합니다. 우리는 다른 두 환경에서 정상적으로 작동하는 응용 프로그램에서 HP-UX에서 허용 가능한 수준의 성능을 얻으려고 애 쓰고 있습니다. 이는 실행 시간과 메모리 소비 모두에 해당됩니다.Java 메모리 소비, "top"및 HP-Ux

"왜"에 대한 결정적인 기사를 아직 찾지는 못했지만, "최고"를 사용하여 메모리 소비를 측정하는 것은 공유 코드가 오해의 소지가있는 결과를 가져 오는 것과 같은 이유로 조잡한 접근이라고 믿습니다. 그러나 HP-Ux에서의 메모리 소비가 문제가되는 고객 사이트에서 계속해야 할 모든 것입니다. 이번에는 Java 1.4에서 Java 1.5 (HP-Ux 11.23 PA-RISC)로 전환했을 때만 문제가되었습니다. "하나의 이슈"란 16GB의 물리적 메모리를 모두 소모했기 때문에 기계가 새로운 프로세스를 만드는 것을 중단했음을 의미합니다.

"before"와 "after"총 "여유 메모리"를 측정함으로써 Java 어플리케이션에서 얼마나 많은 양을 소비했는지 측정하려고합니다. ArrayList에 10,000 개의 무작위 64 비트 문자열을 저장하는 빠른 응용 프로그램을 작성하여 Java 1.4 및 Java 1.5에서 Linux 및 HP-Ux의 사용량을 측정하는 방법을 시도했습니다.

결과 : 자바는 1.4 ~ 60메가바이트

HP 자바 1.5 ~ 1백50메가바이트이 ​​

리눅스 자바 1.4 ~ 24메가바이트

리눅스 자바 1.5 ~ 16메가바이트

사람이 설명 할 수

HP 왜 이러한 결과가 발생할 수 있습니까? 이것은 "최고"가 여유 메모리를 측정하는 방식의 특이한 점입니까? HP의 Java 1.5는 Java 1.4보다 2.5 배 많은 메모리를 실제로 사용합니까?

감사합니다.

답변

1

현재 가설을 테스트 할 HP 박스가 없습니다. 그러나 내가 너라면 JConsole (JDK와 함께 제공됨) 또는 yourkit과 같은 프로파일 러를 사용하여 현재 상황을 측정 할 수 있습니다.

그러나 뭔가 어리석은 것을 본 후에 측정을 시작한 것으로 보입니다. 그래서, 나는 그것이 일어나고있는 것을 할인하지 않고 있습니다 - 단지 당신이 똑같은 상황에서했을 것 같은 것을 지적합니다.

+0

JConsole은 이상한 것을 보여줍니다. 물론 1.4 버전이 아니라 자바 1.5에서만이 방법을 시도 할 수 있습니다. 그러나 두 플랫폼 모두에서 힙 크기가 비슷합니다. "커밋 된"메모리는 동일한 최대 힙 크기 (512M)에 대해서도 대략 동일한 크기입니다. – Gareth

+0

Sun Java 포럼을 사용해 보셨습니까? 질문이 다른 포럼을 넘어 섰을 때 나는 소스 --- Sun Java 포럼으로 간다 - http://forums.sun.com/forum.jspa?forumID=31 – anjanb

0

먼저 "10,000 임의 64 비트 문자열"테스트로 측정 한 내용이 명확하지 않습니다. 응용 프로그램을 시작하고 부트 스트랩 메모리 사용량을 측정 한 다음 테스트를 실행해야합니다. Java 1.5는 시작 후 바로 힙을 획득 할 수 있습니다 (예 : 힙 관리자 설정 등).

두 번째로 우리는 HP-UX에서 1.4, 1.5 및 1.6의 Java 응용 프로그램을 실행하며 특별한 메모리 요구 사항을 보여주지 않습니다. 우리는 Itanium 하드웨어를 가지고 있습니다.

셋째, 왜 톱을 사용합니까? 왜 그냥 Runtime.getRuntime(). totalMemory()를 인쇄하지 않을까요?

넷째, ArrayList에 값을 추가하면 메모리 조각화가 생성됩니다. ArrayList는 내부 저장소를 두 배로 늘려야합니다. GC 설정 및 ArrayList.ensureCapacity() 구현에 따라 수집되지 않은 메모리 양이 1.4에서 1.5 사이에서 크게 다를 수 있습니다.

기본적으로 문제의 원인을 알아내는 대신 유용한 정보가없는 임의의 테스트를 실행했습니다. 응용 프로그램에서 프로파일 러를 실행하여 메모리 누수 위치를 파악해야합니다.

+0

힙 매개 변수는 -Xm 매개 변수를 통해 명시 적으로 설정됩니다. . Java가 실행되기 전과 이후에 차이점을 테스트하려고합니다. Java가 실행되지 않는 동안에는 totalMemory()를 호출 할 수 없습니다. ArrayList가 크기에 초기화되고 동적으로 크기가 지정되지 않습니다. 프로파일 러에는 누출이 없습니다. – Gareth

1

JVM에는 다른 기본 매개 변수가있을 수 있습니다. 힙은 사용자가 허용하도록 구성한 크기로 증가합니다. Sun VM의 기본값은 컴퓨터의 RAM의 일정 비율입니다. 즉, 메모리가 많은 컴퓨터를 사용하는 경우 Java는 기본적으로 더 많은 메모리를 사용합니다.

HP-UX VM이 HP에서 이런 종류의 튜닝을 많이하지 않았다면 정말 놀랍습니다. 두 가지 모두에 대한 매개 변수를 사용하는 것이 좋습니다. 성능이나 처리량에 영향을 미치지 않으면 서 사용할 수있는 가장 작은 최대 힙 크기를 파악하십시오.

0

해결하려는 문제를보고 싶을 수도 있습니다 ... 16GB의 메모리를 먹는 많은 문제가 있다고 생각하지 않습니다.

여러 VM을 시작 하시겠습니까? 대용량 데이터 세트를 메모리에 저장하고 신속하게 폐기하지 않습니까? 등

+0

예, 우리는 여러 VM을 시작합니다. 그것은 별개의 문제입니다. 이는 여러 물리적 사이트에서 많은 사용자를 지원하고 하나의 서버에 동일한 애플리케이션을 설치하는 Jini 서비스입니다. 서버는 상태가 유지되지 않기 때문에 객체 유지에 문제가 없습니다. – Gareth