2012-03-16 3 views
-5

개체 생성이 내 응용 프로그램에서 병목 현상이됩니다.Java에서 개체 작성 성능을 향상시키는 방법은 무엇입니까?

개체 생성을위한 스레드를 추가하는 것은 개체 생성이 CPU 바인딩 작업이기 때문에 더 나빠질 것이라고 생각합니다.

그런 다음 성능을 향상시키는 방법은 무엇입니까?

+5

* 개체 생성 *이 오버 헤드임을 나타냅니다? 이 가정을 뒷받침 할 수있는 성능 분석이 있습니까? 분석이 없다면 * 문제로 보이지 않는 것을 "고치려고"하지 않습니다. * :-) (현대의 JVM/머신은 초당 수억 개의 새로운 객체를 생성 할 수 있습니다.) –

+0

실제로 객체 생성이 문제라면 (나는 이것을 지원하기 위해 어떤 종류의 측정을 사용해야한다는 것에 동의한다), 더 많은 쓰레드를 추가하는 것은 문제를 해결하지 못할 것이다.개체를 적게 만들거나 개체를 단순화하는 방법을 찾아야합니다. – madth3

+4

JVM v1.1을 사용하고 있거나 말 그대로 수천 개의 개체를 두 번째로 만드는 경우가 아니라면 JVM의 가장 최적화 된 기능 중 하나이기 때문에 개체 생성이 병목 현상이라고 의심합니다. 이것이 실제로 문제가되는 경우 개체 풀을 사용하십시오. – Crollster

답변

2

종종 문제는 개체 작성 자체가 아니라 반복 된 개체 만들기 및 가비지 생성입니다. 이로 인해 두 가지 성능 적중률이 발생합니다. 즉, 모든 개체와 여분의 가비지 수집 스톨을 생성합니다.

먼저 프로파일 링 도구를 사용하여 과도한 개체 생성이 성능 문제의 원인인지 확인해야합니다. 이것이 문제라는 것을 확인했다고 가정하면, 시도 할 다양한 것들과 시도 할 전략이 있습니다. 그것은 모두 코드 작성 방법에 따라 다르므로 아무런 권장 사항이 없습니다. 이 Java performance guidelines from IBM 목록은 확실히 신청할 가치가 있습니다. 가장 일반적인 죄악을 피하는 방법을 식별합니다 : 루프 안에 객체를 생성하지 마십시오. 일련의 문자열 연결 표현식 대신 StringBuilder를 사용하십시오. 기본 유형을 사용하고 가능하면 자동 복싱/압축 해제를 피하십시오. 자주 사용되는 객체를 캐시한다. 명시 적 용량을 가진 콜렉션 클래스를 할당하는 대신에, 콜렉션 클래스를 할당한다.

또 다른 멋진 리소스는 Java Performance Tuning 책의 4 장입니다. (온라인으로 here을 읽을 수 있습니다.)

과도한 객체 생성 java을 검색하면 다른 많은 권장 사항을 찾을 수 있습니다.

+0

감사합니다. 나는 더 많은 것을 공부할 필요가있다 :-) –

1

응용 프로그램이 여러 프로세서가있는 컴퓨터에서 실행될 때 CPU 바운드 작업을 멀티 스레딩하면 여전히 상당한 성능 향상을 얻을 수 있습니다.

+0

아, 맞습니다. 나는 그것을 놓쳤다 :-) –

1

@Pst에 따르면 - 병목 현상이 확실한가요? 왜냐하면 요즘은 일반적인 것이 아니기 때문입니다.

그러나 주어진. 시도 할 수있는 한 가지 방법은 인스턴스를 캐싱하고 다시 사용하여 생성을 피하는 것입니다. 그러나 그것은 전적으로 프로그램이하는 것에 달려 있습니다.

+0

객체를 재사용 할 가치가 있는지 없는지를 판단 할 수는 없지만 객체를 풀링하고 재사용하는 것은 좋은 일이다. :-) –

+0

@JohnnyLim 유일한 방법은 애플리케이션을 프로파일하는 것이다. 의심 스럽다면, 나는 당신이 가장 깨끗하고 단순하다고 느끼는 것을 할 것입니다. 이것은 보통 재활용을 의미하지 않습니다. –

1

Java는 중소 크기의 객체에 대해 TLAB (Thread Local Allocation Buffer)를 사용합니다. 이는 각 스레드가 동시에 객체를 할당 할 수 있음을 의미합니다. 즉, 여러 스레드를 사용하는 속도가 느려지지 않습니다.

일반적으로 더 많은 CPU가 CPU 바인딩 문제를 개선합니다. 하나의 CPU가 디스크 액세스와 같이 사용 가능한 모든 대역폭을 사용할 수있는 IO 바인딩 작업은 다중 CPU를 사용할 때 더 빠릅니다.

개체 생성 비용을 줄이는 가장 간단한 방법은 적은 수의 개체를 생성/삭제하는 것입니다. 객체 생성은 피할 수 없다는 공통된 가정이 있지만, 생산 부하에서도 GC를 하루에 한 번 미만으로 사용하는 어플리케이션에서 지난 2.5 년 동안 작업했습니다.

대부분의 응용 프로그램은 필요하지 않기 때문에 이런 식으로 작동하지 않습니다. 그러나 개체 생성을 최소화해야하는 경우가 있습니다.

관련 문제