최근에 자바 프로그램 작업을 하고 있습니다. 원래 저는 자바의 메모리 관리를 항상 좋아했어요. 메모리 할당에 대해 걱정할 필요 없이, 그냥 할당만 하면 가비지 콜렉터가 메모리를 되찾아줍니다. 이제 프로그램이 방대한 데이터를 가지고 개발되었고, 속도를 위해 모든 정보를 메모리에 로드할 예정입니다. 이를 통해 빠른 응답을 보장할 것입니다. 저는 여전히 메모리를 계속 세면서 제 데이터 양을 생각하고 있는데, 처음에는 이 정도면 충분할 것 같습니다(제 기기는 4G 메모리를 사용하지만, 윈도우는 3.5G를 인식하지만 현재 데이터 용량과 비교하면 괜찮을 것 같습니다).
예상치 못하게도 첫 번째 실험 프로그램은 몇 시간 동안 실행되었고 메모리 외 예외(Out of Memory Exception)를 만났습니다. 제 가상 머신 설정을 보니 -Xms512M -Xmx1024M을 설정했습니다. 생각할 겨를도 없이 바로 -Xms512M -Xmx2048M으로 변경했는데, 그 결과 오브젝트 힙을 위한 공간을 충분히 예약할 수 없었습니다. 프로그램이 일어나지 못해. 그때서야 원래 최대 메모리에도 한계가 있다는 것을 깨달았습니다. 인터넷을 검색해 보니 이 문제를 다룬 많은 글들을 찾았습니다. 마지막으로, BEA DEV2DEV 포럼에서 가장 유용한 글을 찾았습니다
여기서 진행자 YuLimin이 테스트를 진행했고 다음과 같은 결론에 도달했습니다:
회사 JVM 버전 최대 메모리(메가) 클라이언트 최대 메모리(메가) 서버
태양 1.5.x 1492 1520
SUN 1.5.5 (Linux) 2634 2660
태양 1.4.2 1564년 1564년
SUN 1.4.2 (Linux) 1900 1260
IBM 1.4.2(Linux) 2047 해당 없음
BEA JRockit 1.5 (U3) 1909 1902
지금은 JDK1.6.0_05 사용 중이고, 테스트해봤어요. 클라이언트 상태에서 가장 큰 문제는 제 JDK가 -Server 매개변수를 인식하지 못해 서버 상태를 테스트할 수 없다는 점입니다. 추정치는 거의 비슷합니다.
SUN 1.6.0 1442 노
자바에서 대용량 메모리를 사용하는 것은 불가능한 것 같습니다. 일반적인 말은 메모리가 너무 크면 가비지 컬렉션 시간이 길어진다는 것입니다. 이 역시 이해할 만합니다. 일반적으로 메모리가 부족할 때 수집되며, 2G 메모리 스캔은 1G보다 훨씬 느리고, 메모리 객체도 더 많기 때문에 추정 관계가 기하급수적으로 증가하고 있습니다.
아래에는 유리민의 시험 방법과 시험 기록이 첨부되어 있습니다.
테스트 방법: java -XmxXXXXM -version 명령어를 사용해 명령줄에서 테스트한 후, XXXX의 값을 점차 늘립니다. 정상적으로 실행되면 지정된 메모리 용량이 사용 가능하다는 뜻입니다, 그렇지 않으면 오류 메시지가 출력됩니다. |