“java.lang.OutOfMemoryError : Java heap space”오류를 처리하는 방법은 무엇입니까? 5.0 Java Virtual Machine 에서 Ergonomics를

Java 5 에서 클라이언트 측 Swing 응용 프로그램 (그래픽 글꼴 디자이너)을 작성 중 입니다. 최근 메모리 사용량이 보수적이지 않아 오류가 발생했습니다. 사용자는 무제한으로 파일을 열 수 있으며 프로그램은 열린 개체를 메모리에 유지합니다. 빠른 연구 후 5.0 Java Virtual Machine 에서 Ergonomics를 발견 했으며 Windows 시스템에서 JVM의 최대 힙 크기는로 기본 설정되어 있습니다.java.lang.OutOfMemoryError: Java heap space64MB

이 상황 에서이 제약 조건을 어떻게 처리해야합니까?

커맨드 라인 옵션을 사용하여 최대 힙 크기 를 java로 늘릴 수 있지만 사용 가능한 RAM을 파악하고 시작 프로그램 또는 스크립트를 작성해야합니다. 게다가, 유한 한 최대 값으로 증가시키는 것이 궁극적으로 문제를 제거 하지는 않습니다 .

메모리를 비우기 위해 데이터베이스를 사용하는 객체를 파일 시스템에 자주 유지하기 위해 일부 코드를 다시 작성할 수 있습니다. 작동 할 수는 있지만 아마도 많은 작업 일 것입니다.

위의 아이디어에 대한 세부 사항이나 자동 가상 메모리 와 같은 일부 대안 , 힙 크기를 동적으로 확장 하는 방법을 알려 주면 좋을 것입니다.



답변

궁극적으로 실행중인 플랫폼에 관계없이 항상 최대의 힙을 가지고 있습니다. Windows 32 비트에서 이것은 주변에 있습니다 2GB(특히 힙이 아니라 프로세스 당 총 메모리 양). Java가 기본값을 더 작게 선택하는 것만으로 발생합니다 (아마도 프로그래머 가이 문제를 겪지 않고 실행중인 메모리를 정확하게 검사하지 않고도 메모리 할당량이 많은 프로그램을 만들 수 없음).

따라서 필요한 메모리 양을 결정하거나 사용중인 메모리 양을 줄이기 위해 취할 수있는 몇 가지 방법이 있습니다. Java 또는 C #과 같은 가비지 수집 언어의 일반적인 실수 중 하나는 더 이상 사용 하지 않는 객체에 대한 참조를 유지 하거나 대신 재사용 할 수있을 때 많은 객체를 할당 하는 것입니다. 객체가 객체를 참조하는 한 가비지 수집기는 객체를 삭제하지 않으므로 힙 공간을 계속 사용합니다.

이 경우 Java 메모리 프로파일 러를 사용하여 프로그램에서 많은 수의 오브젝트를 할당하는 메소드를 판별 한 후 더 이상 참조되지 않는지 또는 우선 할당하지 않는 방법을 판별 할 수 있습니다. 과거에 사용한 한 가지 옵션은 “JMP” http://www.khelekore.org/jmp/ 입니다.

이유 때문에 이러한 오브젝트를 할당하고 참조를 유지해야하는 경우 (이 작업을 수행하는 경우에 따라 다름) 프로그램을 시작할 때 최대 힙 크기를 늘려야합니다. 그러나 메모리 프로파일 링을 수행하고 객체 할당 방법을 이해하면 필요한 메모리 양에 대해 더 잘 알고 있어야합니다.

일반적으로 프로그램이 유한 한 양의 메모리에서 (아마도 입력 크기에 따라) 실행될 것이라고 보장 할 수없는 경우 항상이 문제가 발생합니다. 이 모든 것을 다 사용한 후에 만 ​​객체를 디스크 등으로 캐싱해야합니다.이 시점에서 무언가를 위해 “Xgb의 메모리가 필요합니다”라고 말할만한 충분한 이유가 있어야하며 개선하여 해결할 수 없습니다. 알고리즘 또는 메모리 할당 패턴. 일반적으로 이는 데이터베이스 또는 과학적 분석 프로그램과 같은 대규모 데이터 세트에서 작동하는 알고리즘의 경우에만 해당되며 캐싱 및 메모리 매핑 IO와 같은 기술이 유용합니다.


답변

-Xmx최대 크기 를 설정 하는 명령 행 옵션으로 Java를 실행하십시오 .

자세한 내용은 여기를 참조하십시오 .


답변

프로젝트별로 원하는 힙 공간을 프로젝트별로 지정할 있습니다.

을위한 다음 이클립스 헬리오스 / 주노 / 케플러 :

마우스 오른쪽 클릭

 Run As - Run Configuration - Arguments - Vm Arguments, 

그런 다음 이것을 추가하십시오

-Xmx2048m


답변

힙 크기를 늘리는 것은 “수정”이 아니라 100 % 일시적인 “석고”입니다. 다른 곳에서 다시 충돌합니다. 이러한 문제를 피하려면 고성능 코드를 작성하십시오.

  1. 가능하면 지역 변수를 사용하십시오.
  2. 올바른 객체를 선택했는지 확인하십시오 (예 : String, StringBuffer 및 StringBuilder 사이의 선택)
  3. 프로그램에 적합한 코드 시스템을 사용하십시오 (예 : 정적 변수 사용 및 비 정적 변수 사용)
  4. 코드에서 작동 할 수있는 다른 것들.
  5. 멀티 스레딩으로 이동해보십시오

답변

큰 경고 —- 내 사무실에서 (일부 Windows 시스템에서) Java 힙에 512m 이상을 할당 할 수 없다는 것을 발견했습니다. 이것은 일부 컴퓨터에 설치된 카스퍼 스키 안티 바이러스 제품 때문인 것으로 나타났습니다. 해당 AV 제품을 제거한 후 1.6GB 이상을 할당 할 수 있음을 발견했습니다. 즉, -Xmx1600mm은 다른 초기에는 “너무 작은 초기 힙”이라는 다른 오류가 발생합니다.

이것이 다른 AV 제품에서 발생하는지는 모르지만, 아마도 AV 프로그램이 모든 주소 공간에 작은 메모리 블록을 예약하여 실제로 단일 할당을 막기 때문에 발생하는 것 같습니다.


답변

VM 인수는 일식에서 나를 위해 일했습니다. Eclipse 버전 3.4를 사용중인 경우 다음을 수행하십시오.

로 이동하여 Run --> Run Configurations -->maven build에서 프로젝트를 선택한 다음 “JRE”탭을 선택하고 입력하십시오 -Xmx1024m.

또는 Run --> Run Configurations --> select the "JRE" tab -->다음을 입력 해도됩니다.Xmx1024m

모든 빌드 / 프로젝트의 메모리 힙이 증가합니다. 위의 메모리 크기는 1GB입니다. 원하는 방식으로 최적화 할 수 있습니다.


답변

예, -XmxJVM에 더 많은 메모리를 구성 할 수 있습니다. 메모리가 누출되거나 낭비되지 않도록하십시오. 힙 덤프를 가져와 Eclipse 메모리 분석기 를 사용하여 메모리 소비를 분석하십시오.