Lambda函数JVM加载类查询及-verbose:class输出异常咨询
嘿,这个问题我刚好踩过坑!原因其实是Java 9及以后版本重构了JVM日志系统,-verbose:class的输出格式彻底变了,不再使用旧版里的Loaded关键词,所以你用grep Loaded自然抓不到内容。
具体原因
在Java 8及更早版本中,-verbose:class的输出是这样的:
Loaded java.text.Format from /path/to/jar
但从Java 9引入模块化系统(Jigsaw)开始,JVM把-verbose系列参数(class/gc/jni)映射到了新的统一日志标签体系上。-verbose:class对应的是class,load日志标签,输出格式变成了你看到的:
[0.179s][info][class,load] java.text.Format source: jrt:/java.base
这种格式里根本没有“Loaded”这个字符串,所以你的grep命令匹配不到。你的Java版本是11.0.2,正好属于Java 9之后的版本,所以会遇到这个问题。
解决办法
给你两个实用的方案:
方案1:适配新格式过滤
直接过滤日志标签class,load就行,命令改成:java -cp my.jar -verbose:class Handler | grep "class,load"这样就能精准抓到所有类加载的日志行。
方案2:强制回到旧版输出格式
Java 9+提供了专门的参数可以切换回旧版的Loaded格式输出,用-Xlog参数替代-verbose:class:java -cp my.jar -Xlog:class+load=info:stdout:format=verbose Handler | grep Loaded这个命令会让输出变回类似旧版的
Loaded java.text.Format from jrt:/java.base,这样你原来的grep逻辑就能正常工作了。
内容的提问来源于stack exchange,提问作者CC.

