2009-07-23 2 views

답변

1

단일 쉬운 대답이 없다, 내가 당신에게 두 가지 예 해주지 :

예 1 - 당신의 프로그램이 나머지 이렇게 이제까지 무엇 메모리를 할당하지 않습니다 다음 시작시 메모리 100M 가치를 할당하고, 그 실행의.

이 경우 공간 낭비를 막기 위해 분명히 100M (흠, 아마도 101이나 다른 것이지만 포인트를 얻음)의 힙 크기를 원하게됩니다.

예제 2 - 프로그램이 초당 10M의 메모리를 할당합니다. 데이터는 1 초 이상 지속되지 않습니다. (예를 들어 많은 임시 데이터를 필요로하는 계산을 수행하고 완료되면 단일 정수를 반환합니다 ...)

정확한 숫자를 아는 것은 아마도 현실적이지는 않지만 실제로는 너무 예리하므로 나와 함께 ... "라이브"데이터가 10M이므로 적어도 10M 힙이 있어야합니다. 그 외에 가비지 컬렉터가 작동하는 방식을 확인해야합니다. 간단히 말해서, GC가 완료되는 데 걸린 시간은 O (라이브 세트)입니다. 즉, "죽은"데이터의 양은 실제로 그 데이터에 들어 가지 않습니다. 일정한 라이브 세트 크기로 GC 시간은 힙 크기에 관계없이 일정합니다. 이로 인해 힙이 커집니다 -> 처리량이 향상됩니다.

(이제 정말 엉망 일까지 당신은 힙의 압축과 같은 물건을 추가하고 이미지가 더 적은 분명해진다 ...)

그것은 문제의 단순화 된 버전의 결론하지만 짧은 대답은 - 그것은 다릅니다.

2

이상적인 임시 비율은 1입니다. 이상적으로 JVM은 필요 이상으로 더 이상 필요하지 않은 메모리를 정확하게 소비합니다.

문제점 (TNilsson이 지적했듯이)은 응용 프로그램의 메모리 요구 사항이 작동하면서 시간이 지남에 따라 변경되므로 상수 수집/압축이 발생하지 않는 충분한 공간이 있어야합니다. 당신이 허용 할 수있는 것보다 더 자주, 당신은 RAM을 더 사지 않아도되는 공간을 거의 소비하지 않기를 원합니다.

+0

heapsize = live set-size 또는 그와 가깝게 설정하면 일정한 가비지 수집 및 압축이 발생합니다. 1을 얻으려고하면 끔찍한 성능이 나옵니다. – Tnilsson

+0

정말 좋은 지적입니다. 나는 그것을 설명하기 위해 편집 할 것이다. –

1

이것은 아마도 새 개체를 할당하는 속도에 따라 달라집니다. 가비지 콜렉션에는 실제 오브젝트에서 많은 작업 추적 참조가 포함됩니다. 나는 500MB의 사용량과 500MB의 사용 가능한 메모리가 충분하지만 많은 양의 배열 할당이 발생하여 JVM이 GC를 수행하는 데 소요되는 시간이 95 %가 소요되는 상황을 다루고 있습니다. 따라서 런타임 메모리 동작을 잊지 마십시오.

일부 할당으로 인해 GC 시간이 1 초가 걸리는 것을 언급하지 않고 "객체 할당"이 Java에서 정말 빠릅니다.

+0

왜 많은 여유 메모리가있을 때 가비지 수집이 수행 되었습니까? – user39732

+0

새로운 쓰레기가 끊임없이 할당되기 때문에 몇 초/몇 분만 지나면 쓰레기가 모두 소모됩니다. 분이라도 괜찮습니다. 몇 초 만에 다 떨어지면 나빠질 수 있습니다. 밀리 세컨드라면 끔찍합니다. –

+0

Heh. 네, 객체 할당이 정말 빠릅니다.객체 할당을위한 공간이 있는지 확인하는 데 시간이 걸릴 수 있습니다. – Tnilsson

관련 문제