如何在Java中使用详细选项


当运行一个Java程序时,详细选项可以用来告诉JVM要查看哪种信息。JVM支持三个现成的详细选项。顾名思义,verbose用于显示JVM完成的工作。这些参数提供的信息主要用于调试目的。因为它用于调试,所以它的用途是在开发中。人们永远不必在生产环境中使用冗长的参数。JVM支持的三个详细选项是:

-verbose:class
-verbose:gc
-verbose:jni

-verbose:class用于显示关于由JVM加载的类的信息。这在使用类加载器动态加载类或分析特定场景中所有类的加载情况时非常有用。一个非常简单的程序,它什么也不做,却加载了如此多的类,如下所示:
package com.example;

public class Test {

public static void main(String args[]) {

}
}



输出:
[Opened C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
..............................................................................
..............................................................................
..............................................................................
[Loaded java.lang.Void from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded java.lang.Shutdown from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]

我只显示了从Eclipse控制台选择的输出。默认情况下,java.lang、java.io和java.util包中的类被加载到内存中。
如前所述,当检查所有的类都加载了什么时,人们会使用verbose:class选项,这通常是在Java中使用类加载器时的一个要求。

-verbose:gc用于检查垃圾收集事件信息。当用作运行Java程序的命令行参数时,垃圾收集的详细信息会打印在控制台上。以下程序演示了用法:

package com.example;

public class Test {

public static void main(String args[]) throws InterruptedException {
Test t1 = new Test();
t1=null;
System.gc();
}
}

输出:
[GC 318K->304K(61056K), 0.0081277 secs]
[Full GC 304K->225K(61056K), 0.0054004 secs]

-verbose:jni用于在应用程序中注册本机方法时打印它们。这些方法包括JDK以及自定义的本地方法。请注意,jni代表Java本机接口。演示该选项用法的源代码和输出如下所示:
package com.example;

public class Test {

public static void main(String args[]) throws InterruptedException {
}
}

输出:
[Dynamic-linking native method java.lang.Object.registerNatives ... JNI]
[Registering JNI native method java.lang.Object.hashCode]
[Registering JNI native method java.lang.Object.wait]
[Registering JNI native method java.lang.Object.notify]
[Registering JNI native method java.lang.Object.notifyAll]
[Registering JNI native method java.lang.Object.clone]
[Dynamic-linking native method java.lang.System.registerNatives ... JNI]
...............................................................
...............................................................
...............................................................
[Registering JNI native method sun.misc.Perf.highResCounter]
[Registering JNI native method sun.misc.Perf.highResFrequency]
[Dynamic-linking native method java.lang.ClassLoader.defineClass1 ... JNI]
[Dynamic-linking native method java.lang.Runtime.gc ... JNI]
[Dynamic-linking native method java.lang.ref.Finalizer.invokeFinalizeMethod ... JNI]