`

JVM 看不到某些异常的stacktrace问题

阅读更多

引自:http://blog.csdn.net/alivetime/article/details/6166252# 

 

在java 1.5的release notes里面可以看到这样一句话:

    

[java] view plaincopy
 
  1. The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.  

 

 

     大体的意思就是对于cold build-in exception jvm都会throw 没有stacktrace的exception。从1.5开始提供了一个开关关闭此功能

 

      演示代码如下:

      

[java] view plaincopy
 
  1. /** 
  2.  * haitao-yao@Jan 27, 2011 
  3.  */  
  4. public class TestCompile {  
  5.         private static final int count = 1000000;  
  6.         /** 
  7.          * @param args 
  8.          */  
  9.         public static void main(String[] args)throws Exception {  
  10.                 int index = count;  
  11.                 while(index -- > 0){  
  12.                         try {  
  13.                                 work();  
  14.                         } catch (Exception e) {  
  15.                                 e.printStackTrace();  
  16.                         }  
  17.                 }  
  18.         }  
  19.         private static void work(){  
  20.                         String value = null;  
  21.                         value.length();  
  22.         }  
  23. }  

 

 

编译后使用java -server  -XX:-OmitStackTraceInFastThrow TestCompile 运行,发现一直都是类似 

 

 

[c-sharp] view plaincopy
 
  1. java.lang.NullPointerException  
  2.         at TestCompile.work(TestCompile.java:25)  
  3.         at TestCompile.main(TestCompile.java:17)  

 

 

的stacktrace。

换成java -server -XX:+OmitStackTraceInFastThrow TestCompile 运行一段时间后就会出现

 

[c-sharp] view plaincopy
 
  1. java.lang.NullPointerException  
  2. java.lang.NullPointerException  
  3. java.lang.NullPointerException  
  4. java.lang.NullPointerException  
  5. java.lang.NullPointerException  
  6. java.lang.NullPointerException  
  7. java.lang.NullPointerException  
  8. java.lang.NullPointerException  
  9. java.lang.NullPointerException  

 

 

这样的exception,说明stacktrace 该优化已经起作用。-XX:+OmitStackTraceInFastThrow选项在-server情况下默认开启。

 

        这就不难解释为何经常在系统日志中看到很多行的java.lang.NullPointerException 苦于找不到stacktrace而不知道错误出在何处。 

 

       遇到这种情况,解决的方法也很简单:既然在一段时间后jvm才会进行重新编译优化,那么该错误在刚开始出现的时候还是会有stacktrace的。所以向前搜索日志,或者将程序重启,观察刚重启时候的log便可以找到错误的stacktrace

 

       最后注意的是,上述优化是针对all "cold" built-in exceptions ,不仅仅是NullPointerException

 

 

       好,祝大家玩儿的愉快。

 

Reference: 

   1. java 1.5 release notes: http://java.sun.com/j2se/1.5.0/relnotes.html#hotspot

 

   2. jvm debugging options: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#DebuggingOptions

 

 

分享到:
评论

相关推荐

    JVM堆栈性能分析

    Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某一点状态的 thread-dump 的能力,虽然各个 Java 虚拟机打印的thread dump 略有不同,但是大多都提供了当前活动线程的快 照...

    extended-stacktrace:JVM的增强堆栈跟踪

    用法使用./gradlew克隆并构建存储库,或者使用co.paralleluniverse:extended-stacktrace:0.1.0-SNAPSHOT快照存储库( https://oss.sonatype.org/content/repositories/snapshots )中的Maven工件co.paralleluniverse...

    jvm异常分析文件

    总结起来,JVM异常分析涉及到socket端口占用、内存溢出和系统宕机等问题。理解并解决这些问题需要深入理解Java编程、网络通信和资源管理,以及熟悉JVM的内存模型和调优策略。通过有效的监控、日志分析和异常处理,...

    JVM内存溢出问题解析

    当内存剩余不到 40 %时,JVM 会增大堆到 Xmx 设置的值,当内存剩余超过 70 %时,JVM 会减小堆到 Xms 设置的值。 垃圾回收 GC 的角色是在 JVM 中调用垃圾回收的机制。GC 的触发机会增加 GC 的触发机会。为了避免...

    JVM从入门到入魔.zip

    《JVM从入门到入魔》是一份深度探讨Java虚拟机(JVM)的详细学习资料,涵盖了JVM的基础知识到高级特性的深入解析。这份笔记由咕泡学院的第4期训练营编撰,共计55页,采用图文并茂的方式,便于读者理解和掌握。 在...

    美团JVM问题定位和排错

    3. **问题分解/归类**:将问题按照不同的维度进行拆解,比如是JVM本身的bug、虚拟机问题、Docker容器问题还是容器指标异常等。 4. **追踪和验证**:通过圈定问题范围、分析指标、缩小范围来找到瓶颈,并尝试复现问题...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    4. JAVA并发:Java并发编程涉及到多个线程同时运行以提高程序性能,但同时也需要妥善处理线程间同步和互斥问题。Java提供了多种并发工具和机制,如synchronized关键字、volatile关键字、各种锁机制、以及java.util....

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    狂神说JVM探究.rar

    - JVM如何处理运行时异常,如栈展开(Stack Unwinding)过程。 这些知识点覆盖了JVM的基础到进阶内容,适合初学者和有一定经验的开发者深入理解Java运行机制。通过学习这份资料,读者可以系统地掌握JVM的工作原理...

    jvm视频及笔记

    10. **异常处理**:JVM如何处理运行时异常,以及栈展开的过程。 11. **线程并发**:JVM如何支持多线程,包括线程同步机制如synchronized、Lock等,以及线程池的使用和优化。 通过观看"jvm视频",你可以直观地了解...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程...通过深入研究JVM,开发者可以更好地解决内存溢出、性能瓶颈等问题,实现更高效的Java应用。

    JVM 输出 GC 日志导致 JVM 卡住

    在这个问题中,作者升级了 Java 17,并将 JVM 日志统一采集到同一个 AWS 的 EFS 服务中。同时,作者还配置了 JVM 日志,包括 GC 日志、JIT 编译日志和 Safepoint 日志。然而,在这样做之后,作者的应用出现了奇怪的...

    JVM Diagnostics Guide 1.4.2

    8. **JVM异常诊断**:介绍如何处理和排查JVM抛出的异常,如OutOfMemoryError、StackOverflowError等,以及如何通过JVM错误日志进行分析。 9. **监控与诊断工具**:详述JVM内置的诊断工具,如JMX(Java Management ...

    JVM入门到JVM 调优实战

    总结来说,从JVM入门到实战调优,涉及了Java程序从编译到执行的全过程,包括Class文件格式、类加载、内存模型、运行时数据区、垃圾收集策略以及调优实践等多个层面。深入理解和掌握这些知识,不仅有助于提升Java程序...

    jvm 详细介绍,了解jvm各个组成部分和功能

    ### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心...理解 JVM 的内部工作原理有助于开发者更好地编写高质量的 Java 应用程序,并有效解决运行时遇到的问题。

    解决jvmjava.net.BindException: Address already in use: JVM_Bind异常

    即使在任务管理器中看不到相关进程,JVM可能仍处于挂起状态。 3. **操作系统限制**:在某些操作系统中,如Windows,可能会有端口重用的延迟,即使原始进程已经结束,端口也可能在一段时间内不可用。 ### 解决方案 ...

    Tomcat JVM的参数调优

    此外,提到内存溢出的问题,当应用程序需要的内存超过堆的最大值时,会导致JVM抛出内存溢出异常,使服务崩溃。通常建议将最大内存设置为物理内存的80%,以确保有足够的空间给其他系统进程。 垃圾回收的效率和频率与...

    jvm-mon基于控制台的JVM监视

    通常,`jvm-mon`通过指定目标JVM的PID来附加到进程,从而进行实时监控。 ### 结合其他性能分析工具 虽然`jvm-mon`提供了基本的JVM监控功能,但更复杂的性能问题可能需要结合其他专业工具,如JProfiler、VisualVM、...

    JVM图解-JVM指令-JVM原型图.rar

    以上只是JVM众多知识中的一部分,实际上,JVM涉及的领域还包括内存模型、线程管理、异常处理、类加载策略等。理解JVM的工作原理对于编写高效、稳定的Java程序至关重要。通过研究这个压缩包中的资源,你可以更深入地...

    《JVM从入门到入魔》笔记.pdf

    详细描述JVM【50Page】 1:JVM内存模型:类加载机制【转载、验证、准备、解析、初始化】+类装载器【装载器分类、加载原则】+运行时数据区【方法区、堆、虚拟机栈、本地方法栈、程序计数器】。 2:垃圾回收:垃圾确定...

Global site tag (gtag.js) - Google Analytics