如何获得特定Java代码行的堆栈跟踪

时间:2019-03-22 04:18:37

标签: java spring performance jvm stack-trace

如何获取Java中成功执行的行的stacktrace?需要调试问题。

我不需要正常的堆栈跟踪,我想知道特定行在幕后正在做什么。

BeanFactory factory = new XmlBeanFactory(new FileSystemResource("/opt/data/ws_server.xml"));    
serviceHelper = (ServiceHelper)factory.getBean("serviceHelper");
//Assuming no exceptions, print/view stack trace of above line (factory.getBean). 

我想查看 factory.getBean 的堆栈跟踪-如下所示,以了解factory.getBean在做什么。

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:757)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:721)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
- locked <0xffffffff58100608> (a java.util.concurrent.ConcurrentHashMap)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)

2 个答案:

答案 0 :(得分:2)

最后,您需要某种检测。换句话说:您想告诉jvm跟踪调用堆栈,更重要的是,以编程方式使该信息对您可用。

即使您只希望特定方法发生这种情况,jvm仍必须跟踪所有方法调用,因为它不知道最后是否跟踪一种方法。因此,无法在不影响性能的情况下轻松跟踪方法调用。我知道可以将性能影响保持在合理水平的工具(例如XRebel)用于以后的评估,而不是用于程序消耗。

换句话说:挂起情况的唯一解决方案是:

  • 进行线程转储并进行分析
  • 在代码运行时进行大量日志记录/跟踪,以分析情况是否发生或挂起

请明确说明:您要实现的是在不可能实现之后获取已经执行的代码的堆栈跟踪信息!

答案 1 :(得分:1)

请查看以下答案。

Get current stack trace in Java

基本上是Thread.currentThread().getStackTrace()