2016-09-14 2 views
4

나는 기사를 사용했다. http://www.devinline.com/2016/05/java-instrumentation-fundamental-part-1.html?m=1개체의 크기에 대한 계측의 사용

나는 쿼리 결과의 크기를 알아야한다.

그러나 호출

long sizeOfObject = InstrumentationAgent.findSizeOfObject(myvar); 

의는

에이전트가 initted하지 않는 오류를 반환합니다. Exception 당신이 옳은 구문에 대한 추천을 줄 수 발생과

나는 클래스의 주요 방법이 있습니까?

계 : 에이전트 코드 :

package org.h2.command; 
import java.lang.instrument.Instrumentation; 
import java.lang.instrument.UnmodifiableClassException; 

public class InstrumentationAgent { 
    /* 
    * System classloader after loading the Agent Class, invokes the premain 
    * (premain is roughly equal to main method for normal Java classes) 
    */ 
    private static volatile Instrumentation instrumentation; 

    public static void premain(String agentArgs, Instrumentation instObj) { 
     // instObj is handle passed by JVM 
     instrumentation = instObj; 
    } 

    public static void agentmain(String agentArgs, Instrumentation instObj) 
     throws ClassNotFoundException, UnmodifiableClassException { 
    } 

    public static long findSizeOfObject(Object obj) { 
     // use instrumentation to find size of object obj 
     if (instrumentation == null) { 
      throw new IllegalStateException("Agent not initted"); 
     } else { 
      return instrumentation.getObjectSize(obj); 
     } 
    } 
} 

내 호출은 :

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.lang.instrument.Instrumentation; 
import org.h2.command.InstrumentationAgent; 
import static java.lang.System.out; 

public class CacheOptimize { 
    public long Size; 

    public static void main(String[] args) throws Exception { 
     Class.forName("org.h2.Driver"); 
     Connection conn = DriverManager.getConnection("jdbc:h2:file:D:/server/h2/exp1.h2.db", "sa", "sa"); 
     Statement stat = conn.createStatement(); 

     ResultSet rs; 
     rs = stat.executeQuery("select * from TAbles"); 
     Size = InstrumentationAgent.findSizeOfObject(rs); 
    } 
    stat.close(); 
    conn.close(); 
} 
+0

'MANIFEST.MF'및 에이전트 코드 표시 – vsminkov

+0

nessasary 코드 추가 –

+0

아무도 도와 줄 수 있습니까? –

답변

1

은 당신이 중 하나 -javaagent:path/to/agent.jar없이 항목

Premain-Class: org.h2.command.InstrumentationAgent 

또는 응용 프로그램을 실행하는 META-INF/MANIFEST.MF를 추가하는 것을 잊었다.

Here 당신은 어떻게 에이전트를 사용하여 응용 프로그램을 시작할 수 있는지 완전한 작동 예제를 찾을 수 있습니다.

매니페스트 입력 및 실행중인 에이전트에 대한 자세한 내용은 official javadoc에서 확인할 수 있습니다. 당신이 ResultSet에 의해 반환하지만 메모리하지 양이 ResultSet 객체 자체에 의해 소비 될 데이터의 크기를 얻기 위해 노력하고있다처럼

참고

보인다. 문제는

size = InstrumentationAgent.findSizeOfObject(rs); 

는 데이터베이스 행에 커서를 유지하고 모든 결과를 저장하지 않습니다 ResultSet 이후 가장 좋은 방법 아니 될 것입니다. 그러나 이것을 사용하여 모든 데이터를 가져올 수 있으며 findSizeOfObject을 사용하여 크기를 요약 할 수 있습니다. 하지만 마지막으로 알아야 할 점은 Instrumentation#getObjectSize이 부정확 한 결과를 반환 할 수 있다는 것입니다.

지정된 개체에서 사용하는 저장소의 양에 대한 구현 별 근사값을 반환합니다. 결과에는 객체의 오버 헤드의 일부 또는 전부가 포함될 수 있으므로 구현 내에서의 비교에는 유용하지만 구현 간의 비교에는 유용하지 않습니다. JVM을 한 번 호출하는 동안 예상치가 변경 될 수 있습니다.

관련 문제