2010-06-01 2 views
2

내 응용 프로그램은 많은 양의 객체 (초당 1ml 이상을 할당하고 있으며, 대부분의 객체는 크기가 80-100 바이트이고 같은 크기의 문자열입니다.)과 성능 저하의 원인이 될 수 있습니다.할당 속도는 사용되는 가비지 수집기에 따라 다릅니 까?

응용 프로그램의 작업 집합은 수십 메가 바이트입니다. 앱을 프로파일 링하면 GC 시간이 무시할 정도로 작아집니다. 등

그러나, 나는 아마도 할당 방법이 사용되는 GC에 따라 의심, 일부 설정은 캐시 히트 율에 긍정적 인 영향을 미치는 아마도 빠른 할당을 만들거나 할 수

는 그래서? 또는 가비지 콜렉션 자체가 거의 시간이 걸리지 않는다는 가정하에 GC 설정에서 할당 성능이 독립적입니까?

+0

"mln"이란 무엇입니까? –

+0

1 mln = 1 million – jkff

+0

은 오래 거주하는 개체입니까, 아니면 생성되는 즉시 범위를 벗어납니다? – Justin

답변

2

물론 성능은 사용 된 할당 자에 따라 다릅니다. 그러나 당신은 GC를 프로파일 링하고 그다지 문제가되지 않는다는 것을 알았습니다. 또한 GC의 장점 중 하나는 수집 속도가 느린 대신 빠른 할당입니다.

나는 캐시를 너무 자주 무효화해야 할 수도 있기 때문에 CPU에 문제가되는 메모리 액세스 패턴을 만드는 결과적인 조각화에 문제가 있다고 생각합니다. 대부분의 GC 알고리즘은 최적의 방식으로 공간을 회수하지 않습니다.

작업 세트가 제한적이고 예측 가능하기 때문에 미리 할당 된 객체 풀을 사용할 수 있습니다. 참조 계산을 사용하여 많은 수작업 메모리 관리를 피할 수도 있습니다. 기술적으로는 여전히 GC이지만 GC의 일반적인 의미는 아닙니다.

그래도 나는 성능이 메모리를 관리하는 방법에 크게 영향을받지는 않지만 실제로 어떻게 사용하고, 액세스하는지 생각합니다. 가장 가능성있는 프로파일 작성자는 확실한 답을 가지고 있습니다.

+1

++ "풀"개념. 반면에, 참조 카운팅? 참조 카운팅에서 버그가 발견되면 찾기가 매우 어렵습니다. –

+0

마이크 :이 경우 참조 횟수를 구현하는 것이 어렵지 않습니다. 풀 객체는 참조 자체를 포함하지 않습니다. 그리고 자바 태그를 보지 못했습니다. – artificialidiot

+0

불행히도 내 프로파일 작성자는 대답으로 저에게 허튼 소리를 내고 있습니다. 그리고 저는 이미 그것에 관한 질문을했습니다. 프로파일 링에 대해 한두 가지를 알고 있지만이 경우 실패했습니다. VTune과 같은 무거운 포를 시도 할 것입니다 ... – jkff

1

개체 할당에는 두 가지 측면이 있습니다. 첫 번째는 적절한 메모리 영역을 찾는 것입니다. 오늘날의 세대용 수집기로는 대개 매우 빠릅니다 (기계 사이클의 10 분의 1 정도).

두 번째는 할당 한 개체의 초기화입니다. Java에서 할당 한 모든 것이 초기화되기 때문에 초기화 비용이 가장 간단하고 작은 객체를 제외하고는 할당 비용보다 쉽게 ​​초과 할 수 있습니다. 더 있습니다. 초기화에는 새로운 객체가 차지하는 전체 메모리 영역을 쓰는 것이 필요하기 때문에 (예를 들어, "new byte [1 < < 20]"을 할당하면 전체 메가 바이트를 0으로 설정해야합니다.), 보통이 메모리를 CPU로 가져옵니다. 캐시, 다른 오래된 캐시 라인 (현재 "핫"작업 세트에 속하거나 아닐 수도 있음)을 제거합니다.

각 배열에 비교적 적은 처리량을 적용하면 해당 효과가 코드 성능에 심각한 영향을 미칠 수 있습니다. 이것은 동일한 배열을 반복해서 반복 사용함으로써 부분적으로 회피 될 수 있지만 일반적으로 프로그램 논리를 더 복잡하게 만듭니다. 캐시 쓰레기가 실제로 범인인지 판단하는 것도 쉽지 않습니다. 귀하의 질문에 어떤 작은 정보가 주어 졌는지 말할 수 없습니다.

0

문자열을 풀링하려고합니까? 한 번 들었습니다. IBM의 VM은 string internation과 같은 기능을했지만 동적으로 (사실인지는 알 수 없습니다.) VM이 String 내부 구조의 내부 데이터 구조를 구축하기 위해 추가 작업을 수행하려고합니다.

언제든지 byte b[] = new byte[100]; String s = new String(b);과 같은 것을하고 있습니까? String 객체를 할당하지 않고 대신 바이트 [] (비교)를 참조하는 무작위 객체를 할당 할 수 있습니다.

+0

예, 당신이 보여준 코드와 같은 것을하고 있습니다. 하지만 나는 여러 가지 이유로 문자열을 필요로합니다. – jkff

관련 문제