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) 실행 시간과 함께 실패합니다. 짓다!!!
이 권리를 얻으면 의도적으로 메모리 누수를 만들려고합니까? 또는 파일이 항상 메모리에 있어야합니까? 귀하의 유스 케이스에 대해 알고 싶습니다. – lobster1234
파일을로드 한 후'byte [] file'에 대한 참조를 유지합니까? 시스템 메모리 용량은 얼마입니까? 나머지 코드는이 파일에서 무엇을합니까? – WhiteFang34
실제로 ...원래 BufferReader를 사용하여 1GB 파일을 읽고 BufferedWriter로 입력을 처리하고 출력하는 중이었습니다 ... 시스템에서 처리 된 데이터의 거의 5GB 상당을 생성합니다. 슬픈 부분은 6 시간 안에 30K에서 .5G로 매우 천천히 증가하는 메모리 사용량을보고, k 바이트마다 2 ~ 3 회의 IO 읽기가 증가한다는 것입니다. –