引自:http://blog.csdn.net/alivetime/article/details/6166252#
在java 1.5的release notes里面可以看到这样一句话:
- 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开始提供了一个开关关闭此功能
演示代码如下:
- /**
- * haitao-yao@Jan 27, 2011
- */
- public class TestCompile {
- private static final int count = 1000000;
- /**
- * @param args
- */
- public static void main(String[] args)throws Exception {
- int index = count;
- while(index -- > 0){
- try {
- work();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- private static void work(){
- String value = null;
- value.length();
- }
- }
编译后使用java -server -XX:-OmitStackTraceInFastThrow TestCompile 运行,发现一直都是类似
- java.lang.NullPointerException
- at TestCompile.work(TestCompile.java:25)
- at TestCompile.main(TestCompile.java:17)
的stacktrace。
换成java -server -XX:+OmitStackTraceInFastThrow TestCompile 运行一段时间后就会出现
- java.lang.NullPointerException
- java.lang.NullPointerException
- java.lang.NullPointerException
- java.lang.NullPointerException
- java.lang.NullPointerException
- java.lang.NullPointerException
- java.lang.NullPointerException
- java.lang.NullPointerException
- 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
相关推荐
Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某一点状态的 thread-dump 的能力,虽然各个 Java 虚拟机打印的thread dump 略有不同,但是大多都提供了当前活动线程的快 照...
用法使用./gradlew克隆并构建存储库,或者使用co.paralleluniverse:extended-stacktrace:0.1.0-SNAPSHOT快照存储库( https://oss.sonatype.org/content/repositories/snapshots )中的Maven工件co.paralleluniverse...
总结起来,JVM异常分析涉及到socket端口占用、内存溢出和系统宕机等问题。理解并解决这些问题需要深入理解Java编程、网络通信和资源管理,以及熟悉JVM的内存模型和调优策略。通过有效的监控、日志分析和异常处理,...
当内存剩余不到 40 %时,JVM 会增大堆到 Xmx 设置的值,当内存剩余超过 70 %时,JVM 会减小堆到 Xms 设置的值。 垃圾回收 GC 的角色是在 JVM 中调用垃圾回收的机制。GC 的触发机会增加 GC 的触发机会。为了避免...
《JVM从入门到入魔》是一份深度探讨Java虚拟机(JVM)的详细学习资料,涵盖了JVM的基础知识到高级特性的深入解析。这份笔记由咕泡学院的第4期训练营编撰,共计55页,采用图文并茂的方式,便于读者理解和掌握。 在...
3. **问题分解/归类**:将问题按照不同的维度进行拆解,比如是JVM本身的bug、虚拟机问题、Docker容器问题还是容器指标异常等。 4. **追踪和验证**:通过圈定问题范围、分析指标、缩小范围来找到瓶颈,并尝试复现问题...
4. JAVA并发:Java并发编程涉及到多个线程同时运行以提高程序性能,但同时也需要妥善处理线程间同步和互斥问题。Java提供了多种并发工具和机制,如synchronized关键字、volatile关键字、各种锁机制、以及java.util....
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
- JVM如何处理运行时异常,如栈展开(Stack Unwinding)过程。 这些知识点覆盖了JVM的基础到进阶内容,适合初学者和有一定经验的开发者深入理解Java运行机制。通过学习这份资料,读者可以系统地掌握JVM的工作原理...
10. **异常处理**:JVM如何处理运行时异常,以及栈展开的过程。 11. **线程并发**:JVM如何支持多线程,包括线程同步机制如synchronized、Lock等,以及线程池的使用和优化。 通过观看"jvm视频",你可以直观地了解...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程...通过深入研究JVM,开发者可以更好地解决内存溢出、性能瓶颈等问题,实现更高效的Java应用。
在这个问题中,作者升级了 Java 17,并将 JVM 日志统一采集到同一个 AWS 的 EFS 服务中。同时,作者还配置了 JVM 日志,包括 GC 日志、JIT 编译日志和 Safepoint 日志。然而,在这样做之后,作者的应用出现了奇怪的...
8. **JVM异常诊断**:介绍如何处理和排查JVM抛出的异常,如OutOfMemoryError、StackOverflowError等,以及如何通过JVM错误日志进行分析。 9. **监控与诊断工具**:详述JVM内置的诊断工具,如JMX(Java Management ...
总结来说,从JVM入门到实战调优,涉及了Java程序从编译到执行的全过程,包括Class文件格式、类加载、内存模型、运行时数据区、垃圾收集策略以及调优实践等多个层面。深入理解和掌握这些知识,不仅有助于提升Java程序...
### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心...理解 JVM 的内部工作原理有助于开发者更好地编写高质量的 Java 应用程序,并有效解决运行时遇到的问题。
即使在任务管理器中看不到相关进程,JVM可能仍处于挂起状态。 3. **操作系统限制**:在某些操作系统中,如Windows,可能会有端口重用的延迟,即使原始进程已经结束,端口也可能在一段时间内不可用。 ### 解决方案 ...
此外,提到内存溢出的问题,当应用程序需要的内存超过堆的最大值时,会导致JVM抛出内存溢出异常,使服务崩溃。通常建议将最大内存设置为物理内存的80%,以确保有足够的空间给其他系统进程。 垃圾回收的效率和频率与...
通常,`jvm-mon`通过指定目标JVM的PID来附加到进程,从而进行实时监控。 ### 结合其他性能分析工具 虽然`jvm-mon`提供了基本的JVM监控功能,但更复杂的性能问题可能需要结合其他专业工具,如JProfiler、VisualVM、...
以上只是JVM众多知识中的一部分,实际上,JVM涉及的领域还包括内存模型、线程管理、异常处理、类加载策略等。理解JVM的工作原理对于编写高效、稳定的Java程序至关重要。通过研究这个压缩包中的资源,你可以更深入地...
详细描述JVM【50Page】 1:JVM内存模型:类加载机制【转载、验证、准备、解析、初始化】+类装载器【装载器分类、加载原则】+运行时数据区【方法区、堆、虚拟机栈、本地方法栈、程序计数器】。 2:垃圾回收:垃圾确定...