2012-11-18 3 views
3

답변을 검색했지만 100 % 내 질문에 답변 할 수있는 것을 찾지 못했습니다. : D
그래서 hashmap을 다른 3 개의 새로운 hasmaps에서 만들 필요가 있습니다. 3 가지 다른 방법으로 값을 교환해야합니다. (나중에 map2.putAll(map1)을 사용하고 나중에 2 개의 값을 바꿉니다.) 나중에 순서가 지정된 우선 순위 큐에 hashmaps를 저장해야합니다. 나중에 그 중 하나를 폴링하고 프로세스를 반복합니다.Java GC 오버 헤드 한도를 초과했습니다. 많은 해시 맵과 우선 순위 큐. 내가 무엇을 할 수 있을지?

특수 조건이 만족스럽지 않기 때문에이 작업을 여러 번해야하기 때문에 문제가 발생합니다 ... 그리고 내가하는지도의 수를 줄일 수있는 방법이 없습니다 (음, 하지만 그것은 매우 비쌀 것입니다 : /).

사실 나는 모든지도를 어딘가에 저장했는지 (내가 읽은 것에서 GC 결함이라고 생각했는지) 아니면 다른 트릭을해야하는지는 모르겠다. 단지 코드를 얻고 싶다. (가능한 경우) '-XX : -UseGCOverheadLimit'과 같은 것들을 사용하지 않고 (일지라도 마크가없는 경우에도) 일종의 숙제이기 때문에 프롬프트에서 'java classname'으로 작동해야합니다.

유일한 제한은 정시입니다 (문제는 아니며 이미 100 % 확신 됨, 이미 테스트 됨). 간단한 입력 (이미 좋은 상태 임)으로 테스트되지만, 어려운 것조차 할 수있게했다.

조언 해 주셔서 감사합니다.

아,지도 종류는 <Integer,Integer>이고 크기는 16입니다. 불행히도, 숙제가 아직 끝나지 않았기 때문에 여기에 코드를 게시 할 수 없습니다 (심지어 제가 제출 한 경우에도).

+1

어쨌든 메모리가 부족할 때 GC 오버 헤드 제한이 발생하지만 여전히 조금씩 교정하여 계속 진행할 수 있습니다. 힙 한도를 높이거나 메모리를 적게 사용하도록 응용 프로그램을 수정하십시오. –

+0

나는 그것을 알아 냈다. 그러나 나는 그것을하기 위해 호를 정말로 모른다.지도를 깨끗하게 할 수 있냐? – user1834153

+0

해시 맵 작업을 마쳤 으면 해시 맵을 'null'로 설정하십시오. – apnorton

답변

1

코드에서 일어나는 일을 정확하게 판단하기는 어렵지만지도를 할당하고 삭제하는 메모리 오버 헤드로 인해지도 인스턴스를 캐싱하고 다시 사용할 수 있습니다. 일부 객체 풀링 구현을 사용하십시오. 주변에 부하가 있거나 단지 하나의 스레드 만 있으면 객체 풀로 스택을 사용하십시오.

다른 문제는 Integer를 사용하면 대량의 메모리 변동이 발생하고 Integer는 변경되지 않으므로 약간의 고통입니다. 지도를 Trove int/int 맵으로 바꾸면 정렬되었습니다.

0

HashMaps는 메모리 측면에서 비용이 많이 들며 대용량 데이터 집합에서 빠른 검색이 필요한 경우에만 사용하십시오. "크기가 16이고"해시 맵이 전혀 필요하지 않은 것처럼 보입니다.

0

주어진 작업에 대해 더 자세히 설명해 주시면 도움이 될 것입니다. 그러나 내 생각을 공유하겠습니다.

우선, Integer (클래스) 대 int (원시)의 사용에는 너무 많은 잘못이 있어서는 안됩니다. 이 더 많은 메모리를 사용하지만, 여전히 정수입니다. 거대한 트럭을 가지고 있지 않으면 어떤 문제에도 부딪치지 않아야합니다. HashMap과 같습니다. 커뮤니티를 신뢰하십시오. HashMap에 심각한 문제가있는 경우 지금까지 알아 냈을 것입니다.

메모리 누수가있는 것 같습니다. 프로그램을 확인하십시오. 기억 한계 (당신이 나에게 묻는다면 현명한 결정)를 원하지 않는다고 말하지만, 시험을 위해서 이것을 시도 할 수도 있습니다. 메모리 누출이있는 경우 정확히 동일한 문제가 발생하기 전에 프로그램이 약간 더 오래 실행됩니다. 메모리 누수를 감지하는 특수 도구가 있지만 표준 Windows 프로세스 관리자를 사용하고 시간 경과에 따른 프로그램의 메모리 소비를 주시하면 누출이 있는지 신속하게 알 수 있습니다. 프로그램이 같은 일을 반복해서 수행한다면 메모리 소비가 상대적으로 안정적 일 것으로 기대해야합니다.메모리가 가비지 컬렉터에 의해 다시 할당되고 수집됨에 따라 시간이 지남에 따라 위아래로 올라갈 것이지만 이것은 꽤 안정적인 대역폭 내에 있어야합니다.

메모리 누수가 없다고 확신하는 경우, 아마도 잘못된 방식으로 문제를 해결할 것입니다. 예를 들어, 파일을 처리하는 순진한 구현은 파일을 메모리로 읽어 들여 처리 한 다음 다시 저장합니다 ... 그러나 파일이 1GB이면 파일 로딩 된 데이터를 저장하기 위해 1GB의 메모리를 사용합니다. 대용량 데이터를 처리 할 수 ​​있어야하는 경우 한 번에 처리하지 말고 청크로 작업하십시오. 파일 데이터의 일부를 버퍼로 읽어 들여 처리하고, 처리 된 데이터를 제거하고 다음 덩어리를 읽습니다. 이렇게하면 응용 프로그램이 모든 크기의 파일을 처리 할 수 ​​있습니다. 그것은 단지 예일 뿐이지 만, 이런 종류의 것들은 메모리 문제에 전형적입니다. 누출이 있거나 접근 방식이 잘못되었습니다. 거대하고 많은 양의 데이터로 작동하는 프로그램 만 메모리 제한에 도달해야합니다. 대부분의 프로그램은 그렇게하지 않습니다. 그들은 메모리 누수가 있거나 문제를 해결하기 위해 잘못된 방법을 사용하고 있습니다.