JVM - 在 Spring 应用程序运行时查看 class 字段
JVM - peek at class field during Spring application runtime
最近我需要查看一些 class 字段值。
class 看起来有点像这样:
public class Foo(){
@Autowired
protected MessageResolver resolver;
protected static final String INJECTED_TEXT_PROPERTY_CODE = "code";
protected String injectedText;
@PostConstruct
public void initialize() {
injectedText = resolver.resolveMessage(INJECTED_TEXT_PROPERTY_CODE);
}
}
然后我有一些像这样的 属性 来源:
code=injectedCode
现在任务的难点在于它不会在我的机器上,而是在客户端机器上。因此,理想情况下,我需要一些简单的命令来执行,而不会干扰工作系统。
编辑:我想要达到峰值的字段是 injectedText。
EDIT2:@apangin 介绍了最有趣的解决方案(离线 jmap 和转储分析)。谢谢!
启动应用程序时,您需要加载客户端计算机的 属性。看这个http://www.baeldung.com/properties-with-spring
此外,您可以使用来自 spring 的 @Value 注释来注入 属性 值
import org.springframework.beans.factory.annotation.Value;
class MyClass {
@Value("${value.from.property}")
private String valueFromProperty;
}
正如@apangin 所建议的那样,我使用 jmap 实用程序创建了我的应用程序的堆转储。
首先我必须弄清楚我的应用程序 PID 是什么。我用命令做到了:
jps
然后我创建了我的应用程序的堆转储(我的 PID 是 303):
jmap -dump:live,file=C:\dump.bin 303
最后我用 jhat 工具分析了堆转储:
jhat C:\dump.bin
最近我需要查看一些 class 字段值。 class 看起来有点像这样:
public class Foo(){
@Autowired
protected MessageResolver resolver;
protected static final String INJECTED_TEXT_PROPERTY_CODE = "code";
protected String injectedText;
@PostConstruct
public void initialize() {
injectedText = resolver.resolveMessage(INJECTED_TEXT_PROPERTY_CODE);
}
}
然后我有一些像这样的 属性 来源:
code=injectedCode
现在任务的难点在于它不会在我的机器上,而是在客户端机器上。因此,理想情况下,我需要一些简单的命令来执行,而不会干扰工作系统。
编辑:我想要达到峰值的字段是 injectedText。
EDIT2:@apangin 介绍了最有趣的解决方案(离线 jmap 和转储分析)。谢谢!
启动应用程序时,您需要加载客户端计算机的 属性。看这个http://www.baeldung.com/properties-with-spring
此外,您可以使用来自 spring 的 @Value 注释来注入 属性 值
import org.springframework.beans.factory.annotation.Value;
class MyClass {
@Value("${value.from.property}")
private String valueFromProperty;
}
正如@apangin 所建议的那样,我使用 jmap 实用程序创建了我的应用程序的堆转储。
首先我必须弄清楚我的应用程序 PID 是什么。我用命令做到了:
jps
然后我创建了我的应用程序的堆转储(我的 PID 是 303):
jmap -dump:live,file=C:\dump.bin 303
最后我用 jhat 工具分析了堆转储:
jhat C:\dump.bin