문제

수백만의 장기 객체가있는 응용 프로그램의 힙 크기 사용량을 어떻게 최적화합니까? (큰 캐시, DB에서 많은 레코드를로드)

  • 올바른 데이터 유형을 사용하십시오
    • 다른 데이터 유형을 나타내려면 java.lang.string을 피하십시오
  • 복제 된 물체를 피하십시오
    • 값이 미리 알려진 경우 열거를 사용하십시오
    • 객체 풀을 사용하십시오
    • String.intern () (좋은 생각?)
  • 필요한 객체 만로드/보관하십시오

일반 프로그래밍 또는 Java 특정 답변을 찾고 있습니다. 펑키 컴파일러 스위치가 없습니다.

편집하다:

힙에 수백만 번 나타날 수있는 포조의 메모리 표현을 최적화하십시오.

사용 사례

  • 메모리에 거대한 CSV 파일을로드 (pojos로 변환)
  • 최대 절전 모드를 사용하여 데이터베이스에서 백만의 레코드를 검색하십시오.

답변 이력서 :

  • 플라이급 패턴을 사용하십시오
  • 쓰기에 복사하십시오
  • 3 개의 특성을 가진 10m 객체를로드하는 대신 크기 10m의 3 배열 (또는 다른 데이터 구조)을 갖는 것이 더 효율적입니까? (데이터를 조작하는 데 고통 스러울 수 있지만 기억이 실제로 부족하다면 ...)
도움이 되었습니까?

해결책

당신은 어떤 종류의 물건을 보관하고 싶은지 말하지 않으므로 자세한 조언을 제공하기가 조금 어렵습니다. 그러나 일부 (독점적이지 않은) 접근 방식은 특별한 순서가 아닙니다.

  • a 플라이급 패턴 가능한 한.
  • 디스크로 캐싱. 거기 있습니다많은 Java 용 캐시 솔루션.
  • String.intern이 좋은 생각인지에 대한 논쟁이 있습니다. 보다여기 질문을 위해. String.intern () 및 적합성에 대한 토론의 양.
  • 활용 부드러운 또는 약한주문에 대한 참조는 주문시를 재현/다시로드 할 수있는 데이터를 저장합니다. 보다여기 캐싱 기술과 함께 소프트 참조를 사용하는 방법.

저장하는 물체의 내부와 수명에 대해 더 많이 알면 더 자세한 답변이 생길 수 있습니다.

다른 팁

메모리 프로파일 러를 사용하고 메모리가 소비되는 위치를보고 최적화하는 것이 좋습니다. 정량적 정보가 없으면 효과가 없거나 실제로 상황을 악화시키는 변화를 일으킬 수 있습니다.

객체가 작 으면 데이터 표현을 변경하는 것을 볼 수 있습니다. 예를 들어, 데이터 테이블을 행당 하나의 객체가 아닌 각 열에 대한 객체 배열이있는 일련의 열로 데이터 테이블을 나타낼 수 있습니다. 개별 행을 나타내지 않아도되면 각 객체에 대해 상당한 양의 오버 헤드를 절약 할 수 있습니다. 예를 들어 12 개의 열과 10,000,000 행이있는 테이블은 1 천만 (행당 1 회)이 아닌 12 개의 객체 (열당 1 개)를 사용할 수 있습니다.

객체 모델을 잘 정규화하고 값을 복제하지 마십시오.

Ahem, 그리고 그것이 수백만 개의 물체라면 나는 괜찮은 64 비트 VM과 많은 RAM을 갈 것이라고 생각합니다.)

일반적인 "프로파일 러"는 모든 "라이브"객체에 대한 개요가 필요하기 때문에 많은 도움이되지 않습니다. 힙 덤프 분석기가 필요합니다. 나는 추천한다 일식 메모리 분석기.

문자열로 시작하여 복제 된 객체를 확인하십시오. Flightweight, Lakonwrite, Lazy 초기화와 같은 패턴을 적용 할 수 있는지 확인하십시오 (Google은 친구가됩니다).

여기에서 링크 된이 프레젠테이션을 살펴보십시오. 그것은 공통 자바 객체와 프리미티브의 메모리 사용을 제시하고 모든 추가 메모리가 어디로 가는지 이해하는 데 도움이됩니다.

메모리 효율적인 Java 응용 프로그램 구축 : 관행 및 과제

메모리에 더 적은 물체를 저장할 수 있습니다. :) 디스크에 유출되는 캐시를 사용하거나 테라코타를 사용하여 힙 (가상)을 클러스터링하여 사용하지 않은 부품을 메모리에서 플러시하고 투명하게 결함이 발생할 수 있습니다.

Peter Alredy가 만든 점에 무언가를 추가하고 싶습니다 (그의 대답에 대해 언급 할 수 없습니다 :() 메모리 프로파일 러를 사용하는 것이 항상 낫습니다 (확인 Java 메모리 프로파일 러) intution에 의해가는 것보다 80% 시간의 시간은 우리가 무시하는 것이 일상적인 일이 있습니다.

수백만 개의 정수와 수레가있는 경우 알고리즘이 프리미티브 배열로 데이터를 나타낼 수 있는지 확인하십시오. 즉, 각 쓰레기 수집의 참조와 CPU 비용이 줄어 듭니다.

멋진 하나 : 대부분의 데이터를 RAM으로 압축하십시오. 현재 작업 세트 만 확장하십시오. 데이터에 잘 작동 할 수있는 좋은 지역이있는 경우.

더 나은 데이터 구조를 사용하십시오. Java의 표준 컬렉션은 오히려 메모리 집약적입니다.

더 나은 데이터 구조는 무엇입니까

  • 컬렉션 소스를 살펴보면 컬렉션에 액세스하는 방법을 제한하면 요소 당 공간을 절약 할 수 있습니다.
  • 컬렉션이 성장하는 방식은 큰 컬렉션에 좋지 않습니다. 너무 많은 복사. 대형 컬렉션의 경우 Btree와 같은 블록 기반 알고리즘이 필요합니다.

시간을 보내십시오 VM 명령 줄 옵션, 특히 쓰레기 수집에 관한 것들. 이것은 객체가 사용하는 메모리를 변경하지는 않지만 RAM이 많은 기계의 메모리 집약적 인 앱을 사용하면 성능에 큰 영향을 줄 수 있습니다.

  1. Assign null 모든 것에 대한 가치 variables 그 어느 것입니다 no longer 사용된. 따라서 make it available for Garbage collection.
  2. De-reference the collections 사용이 끝나면 GC는이를 스윕하지 않습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top