java.sun.com 上这几天都在宣传大家移植到java 5,我觉得时机也确实成熟了,Tiger 确实带来了许多改进,否则也不至于从1.5毅然改名为5。
今天吸引我注意的是新引进的 java.lang. instrument 库,支持用java语言来测绘虚拟机中运行的程序。看API 不太好懂,只是有个getObjectSize() 的方法可以得到对象在内存中的容量大小。这个调试的时候通常用得上。测试程序如下:
|
public class InstrumentationTest {
private static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
InstrumentationTest.inst = inst;
System.out.println("options= " + options);
// Get all classes currently loaded by VM
Class[] loaded = inst.getAllLoadedClasses();
//And print them!
for (Class clazz : loaded) {
System.out.println(clazz);
}
}
public static long sizeOf(Object o) {
assert inst != null;
return inst.getObjectSize(o);
}
public static void main(String[] args) {
System.out.println("Size of Object: " + sizeOf(new Object()));
System.out.println("Size of direct subclass: " + sizeOf(
new InstrumentationTest()));
System.out.println("Size of Calendar: " + sizeOf(Calendar.getInstance()));
}
}
|
调试的主类需要一个名为 premain 的方法,虚拟机在运行的时候会调用该方法,上例中利用premain 方法来得到一个 Instrumentation 对象。代码参考 blog : http://weblogs.java.net/blog/mister__m/archive/2004/02/playing_with_th_1.html
编译:
| javac -source 1.5 InstrumentationTest.java |
接下来打包为 inst_test.jar。
manifest 文件中记得要设置属性 Premain-Class: InstrumentationTest
然后就可以试试了:
| java -ea -javaagent:inst_test.jar -cp . InstrumentationTest |
结果和我们以前了解的一样,一个单纯的Object对象占用8k内存,而Calendar 的一个实例占用112k,所以《Effective Java》第4条用Calendar的例子告诉我们,不要重复创建对象。