获取在jvm中为lambda函数加载的所有类的列表



我正试图找到一个方法来查看JVM为lambda函数加载的类的数量。我有一个朋友的示例代码,但它不起作用。我有以下内容:

java -cp my.jar -verbose:class Handler | grep Loaded 

它一定缺少什么,因为我没有"Loaded"类。"加载"是"加载"的替代品吗?

这样做的结果类似于:

[0.179s][info][class,load] java.text.Format source: jrt:/java.base
[0.179s][info][class,load] java.text.MessageFormat source: jrt:/java.base
[0.179s][info][class,load] java.util.Locale$Category source: jrt:/java.base
[0.179s][info][class,load] java.util.Locale$1 source: jrt:/java.base
[0.180s][info][class,load] java.text.FieldPosition source: jrt:/java.base
[0.180s][info][class,load] java.util.Date source: jrt:/java.base

我期待着这样的东西:

[Opened /usr/java/j2sdk1.4.1/jre/lib/rt.jar]
[Opened /usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar]
[Opened /usr/java/j2sdk1.4.1/jre/lib/jsse.jar]
[Opened /usr/java/j2sdk1.4.1/jre/lib/jce.jar]
[Opened /usr/java/j2sdk1.4.1/jre/lib/charsets.jar]
[Loaded java.lang.Object from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]
[Loaded java.io.Serializable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]
[Loaded java.lang.Comparable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]
[Loaded java.lang.String from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]

你知道我缺了什么吗?为什么我看不到"已加载"的类?我有Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS

谢谢。C.C.

我有答案了。预期的结果是在Java 8上。在Java 11中,结果是不一样的,所以我必须针对每个版本调整我的命令。

使用可以在实际程序中获得类计数

Field jvmField = ManagementFactory.getRuntimeMXBean().getClass().getDeclaredField("jvm");
jvmField.setAccessible(true);
VMManagement jvmInstance = (VMManagement) jvmField.get(ManagementFactory.getRuntimeMXBean());
int totalClassCount = jvmInstance.getTotalClassCount();
int loadedClassCount = jvmInstance.getLoadedClassCount();

在java 8 中测试

请尝试下面的类。希望这对你有效

java -cp my.jar -verbose:class Handler | grep 'Load*|Open*'
java -cp my.jar -verbose:class Instrumentation | grep 'Load*|Open*'
java -cp my.jar -verbose:class Serialisation | grep 'Load*|Open*'

最新更新