2014-04-28 3 views
1

JProfiler 7.2.3을 사용하여 응용 프로그램에서 메모리 할당을 프로파일 링합니다. set(int, double)setDouble(int, double)과 같은 메서드가있는 클래스가 있습니다. 두 가지 방법은 완전히 동일하지만 JProfiler는 후자의 방법은 박스형 Double를 생성하지만 이전 방법은 그렇지 않다고 말합니다.JProfiler로 프로파일 링 할 때 메서드 이름이 프리미티브의 자동 상자 추가를 트리거합니다.

다음 코드는 문제를 보여줍니다. JProfiler로 메모리 할당을 기록 할 때 setDouble(int, double)에 대한 호출에서 생성 된 100,000 개의 Double 개체가 있지만 다른 동일한 메서드에서는 개체가 만들어지지 않습니다. 유일한 차이점은 메서드 이름입니다!

JProfiler가 setDouble 메소드의 이름을 바꾸지 않고 Double 객체의 개수를 잘못 계산하는 것을 방지하려면 어떻게해야합니까? JProfiler가 처음에 Double 개체를 잘못 계산하는 이유는 무엇입니까?

public final class Test { 
    public static void main(String[] args) throws java.io.IOException { 
     Test test = new Test(); 

     for (int i = 0; i < 100000; i++) 
      test.set(i, i); 

     for (int i = 0; i < 100000; i++) 
      test.setD(i, i); 

     for (int i = 0; i < 100000; i++) 
      test.setDestination(i, i); 

     // JProfiler says this method creates boxed Double objects 
     for (int i = 0; i < 100000; i++) 
      test.setDouble(i, i); 

     for (int i = 0; i < 100000; i++) 
      test.setDoubleValue(i, i); 

     // Don't terminate VM 
     System.in.read(); 
    } 

    private double[] values = new double[100000]; 

    public final void set(int i, double value) { 
     values[i] = value; 
    } 

    public final void setD(int i, double value) { 
     values[i] = value; 
    } 

    public final void setDestination(int i, double value) { 
     values[i] = value; 
    } 

    public final void setDouble(int i, double value) { 
     values[i] = value; 
    } 

    public final void setDoubleValue(int i, double value) { 
     values[i] = value; 
    } 
} 
+0

JProfiler는'setDouble (int, double)'메서드가 boxed Integer를 생성 할 것이라고 생각합니다. 나는 JProfiler가'setDouble (int, double)'을'setDouble (Integer, Double)'로 자동으로 대체한다고 가정 할 수있다. – harvey

답변

0

이것은 JDBC 프로브의 부작용입니다. JDBC 프로브를 비활성화하면 더 이상 적용되지 않습니다.

JProfiler 8에서는 프로브 시스템이 더 효율적으로 재 작성되었으며 더 이상 적용되지 않습니다.