2013-07-23 2 views
3

다음과 같이 간단한 프로그램을 프로파일 링하여 많은 수의 char [] 인스턴스를 생성 할 수 있습니다. 여기서 char [] 인스턴스는 보통 Strings에 기인한다고 읽었으므로이 프로그램의 경우 이것이 어떤지를 알 수 없습니다. Thread 클래스에 char [] 'name'변수가 있다는 것을 알고 있지만 반드시 10,000 개를 생성해야하므로 35,000 개의 추가 스레드가 어디에서 왔는지 궁금합니다.프로그램을 프로파일 링 할 때 많은 char [] 인스턴스가 발생했습니다.

public class untitled { 
    public static void main(String args[]){ 
     ArrayList<Thread> a = new ArrayList<Thread>(); 
     for(int i = 0; i < 10000; i++){ 
      Thread t1 = new Thread(); 
      a.add(t1); 
      t1.start(); 
     } 
    } 
} 

다음은 프로파일 링 메모리 결과의 스크린 샷입니다. 수많은 String [] 인스턴스가있는 것으로 보입니다.

enter image description here

은 프로파일의 다른 부분을 분리하기 위해이 프로그램을 사용하여. 전체 프로그램에서 char [] 인스턴스는 ~ 335,000까지 증가합니다.

+0

스레드 객체는 상당히 무거 우며'char []'를 포함하여 많은 필드를 포함합니다. 많은 스레드를 생성하고 대신 스레드 풀을 사용해서는 안됩니다. – assylias

+0

실행중인 실제 프로그램은이 많은 스레드를 사용하지 않고 다른 것을 테스트하고이 char [] 문제를 발견했습니다. 내가 사용하고있는 구현은 다음과 같다. http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=chameneosredux&lang=java&lang2=java&data=u32 – smur89

+0

'char []' String 당)하지만 큰 볼륨은 아닙니다. –

답변

0

이 질문에 답하려면 힙 워커를 사용해야합니다. 힙 워커의 클래스보기에서 char[] 클래스를 선택하고 새 오브젝트 세트를 작성하십시오. 그런 다음 참조보기로 이동하여보기 선택기에서 "누적 된 참조"를 선택하십시오.

enter image description here

대답은 숯 [] 개체의 약 삼분 다양한 클래스로 JVM에 할당 2/3 스레드 이름 온되는 문자열에 속해있다.

+0

감사합니다. 나는이 정보를보기 위해 어떻게 더 깊이 훈련 할 수 있는지 몰랐다. 정확히 내가 무엇을 찾고 있었는지. 그러나, 나는 이것에 다른 결과를 얻고있다. – smur89