2011-04-25 1 views
0

Windows 7 64 비트에서 1.6.0_25 64 비트를 실행 중입니다.Java JVM 운영 체제에 대한 메모리 할당 유지

내 응용 프로그램이 매우 많은 메모리를 사용하기 때문에 최대 메모리를 사용하여 JVM을 실행하려고합니다.하지만 슬프게도 ... 메모리 할당이 이루어지지 않고 계속 Windows에서 많은 페이지 폴트가 발생합니다 가상 메모리의 다음 세트.

내가 -Xms2G -Xmx3G 테스트

다음 코드는 내가 페이지 오류로 실행하지 않는 것이에 ... 같은 전체 파일을 가져 오는 나의 시도 자바를 실행하고 읽기.

File f = new File("veryLARGEfile.txt"); 
FileInputStream in = new FileInputStream(f); 
int i = (int) f.length(); 
System.out.println("Bytes in file: " + i); 

byte[] file = new byte[i]; 
i = in.read(file); 
System.out.println("Bytes read: " + i); 

이 방법은 내가 Windows 작업 관리자에서 파일을 읽는 동안 시스템이 2G 가치의 메모리에 도달 한 것을 볼 수 있습니다 ...하지만 일단 그것을 읽으면 ... 메모리가 다시 아래로 떨어집니다 !!!!

이것은 큰 문제입니다 ... 나는 활성 메모리에 머무르기 위해 전체 바이트 배열을 필요로합니다.

내가 내 데이터 대신 INT의의를 포함하는 개체의 유지 ArrayLists를 개최 기본 배열 유형 값 int [] [] 및 [] [] 떠 코드를 수정 한


어이, 감사 떠 다니고.

내 자바 메모리가 스왑되지 않는다는 것을 알았습니다. (힙 메모리는 여기에서 스택과 다르게 처리됩니다) [오, 정적 인 모든 코드를 변경했습니다. 알고, 매우 나쁜 프로그래밍 스타일]

내가 지금 실행중인 문제는 내 HashMap을 처리하는 방법입니다. 조회 테이블을 작성하려는 모든 시도가 O (n^2) 실행 시간과 함께 실패합니다. 짓다!!!

+0

이 권리를 얻으면 의도적으로 메모리 누수를 만들려고합니까? 또는 파일이 항상 메모리에 있어야합니까? 귀하의 유스 케이스에 대해 알고 싶습니다. – lobster1234

+0

파일을로드 한 후'byte [] file'에 대한 참조를 유지합니까? 시스템 메모리 용량은 얼마입니까? 나머지 코드는이 파일에서 무엇을합니까? – WhiteFang34

+0

실제로 ...원래 BufferReader를 사용하여 1GB 파일을 읽고 BufferedWriter로 입력을 처리하고 출력하는 중이었습니다 ... 시스템에서 처리 된 데이터의 거의 5GB 상당을 생성합니다. 슬픈 부분은 6 시간 안에 30K에서 .5G로 매우 천천히 증가하는 메모리 사용량을보고, k 바이트마다 2 ~ 3 회의 IO 읽기가 증가한다는 것입니다. –

답변

1

프로세스 메모리의 어떤 부분을 RAM에 유지할지, 스왑 아웃할지 결정하는 것은 JVM이 아니라 OS에 의해 결정됩니다. 일반적으로 OS는 RAM에 자주 액세스하는 메모리를 유지합니다. 그렇지 않은 경우 왜 필요합니까?

RAM의 특정 메모리를 "고정"할 수있는 OS API가있을 수 있지만이 기능은 Java에 의해 노출되지 않습니다.

그러나 사용자의 요구 사항에 따라 파일을 명시 적으로 읽는 대신 memory-mapped이 있어야합니다. 그것은 훨씬 더 빠를 것 같다.

+0

ok ... 그래서, 내가 읽고있는 데이터가 ArrayLists와 HashMaps에 미리 설정된 시작 크기로 끝나고 있다는 사실을 어떻게 처리해야합니까? 이것은 페이징되는 부분입니다 ... 그리고 그 알고리즘은 나는 매우 메모리 집약적 인 구현입니다 ... 리눅스로 이동하는 것이 좋습니다 ... 여기 질문 ... 그것은 다르게 행동하고 ArrayLists 활성 메모리에 계속 허용 할 것인가? –

+0

@Enas : 페이징은 OS 문제이기 때문에 다른 OS가 다른 방식으로 작동 할 수도 있습니다. Windows의 소비자 버전은 데이터 처리보다는 최종 사용자 응용 프로그램에 대해 최적화되는 경향이 있습니다. Windows Server OS로 이동하면 페이징 동작이 달라질 수 있습니다. 일단 알고리즘이 모든 데이터와 함께 집중적으로 작동하면 모든 정상적인 OS에서 페이지 아웃해야한다고 말합니다. –

+0

감사합니다. 그것은 많은 의미가 있습니다. 내가 시스템을 기반으로 Linux를 설치하여 문제가 해결되는지 확인하려고합니다 ... 우분투를 권하고 싶습니다. 아니면 Linux 배포판을 운영하는 더 나은 '서버'가 있습니까? 감사합니다. –

0

Java는 메모리에 응용 프로그램을 모두 유지하려고 시도하거나 다른 방법으로 넣습니다. 메모리가 디스크로 스왑 된 경우 Java는 매우 나쁘게 수행되므로 최후의 수단으로 교체됩니다.

Java 응용 프로그램이 디스크로 스와핑하는 경우 응용 프로그램이 보유한 시스템에 너무 많은 메모리를 사용하기 때문입니다. 응용 프로그램이 메모리 집약적이고이 많은 메모리를 사용해야하는 경우 시스템에 충분한 메모리가 있는지 확인하십시오. BTW. ~ $ 500에서 8GB, $ 1000에서 새 16GB 워크 스테이션을 구입할 수 있습니다. ;)

+0

24G의 메모리와 24G의 가상 메모리가있는 시스템에서 실행됩니다. 지금은 가상 메모리를 제거하여 시스템에서 사용 가능한 실제 메모리를 모두 사용하도록 계획하고 있습니다 ... –

+0

24GB가 있고 ~ 3GB를 사용하는 경우 이것이 스와핑을 일으키는 것이 확실합니까? 가상 메모리로 바꾸는 이유는 모르겠다. 이 문제를 일으키는 시스템에 다른 것이 있어야합니다. –