如何获取特定Java程序行的堆栈跟踪

问题描述 投票:0回答:2

我们如何在Java中获得成功执行的行的堆栈跟踪?需要调试问题。

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

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的stacktrace - 如下所示,以了解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)
java spring performance jvm stack-trace
2个回答
2
投票

最后,你要求某种仪器。换句话说:您想告诉jvm跟踪调用堆栈,更重要的是,以编程方式为您提供这些信息。

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

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

  • 做一个线程转储并分析它
  • 在代码运行时进行大量的日志记录/跟踪,以便分析以防万一或挂起

只是要明确:你要求的是,在事实无法实现之后获得已执行代码的堆栈跟踪!


1
投票

请看下面的答案。

Get current stack trace in Java

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

© www.soinside.com 2019 - 2024. All rights reserved.