2016-09-14 89 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

要么你忘了与入门

Premain-Class: org.h2.command.InstrumentationAgent 

或运行你的应用程序添加META-INF/MANIFEST.MF没有-javaagent:path/to/agent.jar

Here您可以找到完整的工作示例,说明如何使用代理运行启动应用程序。

您还可以在official javadoc中找到关于清单条目和运行代理的更多信息。

注意

好像你正在试图让将由ResultSet返回而不是内存量ResultSet对象本身消耗数据的大小。问题是,

size = InstrumentationAgent.findSizeOfObject(rs); 

会不会因为ResultSet仅保留光标到数据库行,不存储所有结果的最佳方法。但是,您可以使用它获取所有数据并使用findSizeOfObject汇总尺寸。但最后一件你应该知道的是,Instrumentation#getObjectSize可能会返回不准确的结果

返回指定对象所消耗存储量的特定于实现的近似值。结果可能包含部分或全部对象的开销,因此对于实现中的比较而非实现之间的比较是有用的。估计值可能会在单个JVM调用期间发生变化。

相关问题