HotSpot VM的设计者们认为为它的使用者和开发者提供充分的信息来诊断和修复VM的致命错误是重要的。一个常见大的VM致命错误是OutOfMemoryError。另一个在Solaris和Linux平台常见的致命错误是分段错误。也就是Windows上所说的访问冲突错误。当这些致命的错误发生时,理解根本原因然后去修复它就是非常重要的。有时根本问题的解决会引起Java应用的改变,有时根本错误就在HotSpot VM里。当HotSpot遇到一个致命错误时,它生成一个HotSpot错误日志文件,这个文件被命名为hs_err_pid<pid>.log,这里的<pid>被HotSpot出错时的进程id替换。hs_err_pid<pid>.log文件被创建在HotSpot VM被启动的目录。由于这个特性最初在HotSpot VM1.4.2版本开始被介绍,许多增强的信息被创建来诊断致命错误造成的根本原因。这些增强的信息包括:
- 一个内存map被包含进了hs_err_pid<pid>.log这个错误日志文件从而更容易的看到当VM出错时内存是如何泄露的
- 提供了--XX:ErrorFile命令行选项,能够设置hs_err_pid<pid>.log错误日志文件的路径。
- OutOfMemoryError也可以引起hs_err_pid<pid>.log文件的生成。
另一个比较流行来诊断VM致命错误根本原因的方式是使用HotSpot VM命令行选项 --XX:OnError=cmd1 args...;com2...这个命令行选项执行--OnError给定的命令列表无论HotSpot在什么时候崩溃。这个特性常用于调用一个调试器比如Linux/Solaris dbx或者是Windows Winddbg来立即检查崩溃。对于那些已发布的不支持-XX:OnError的版本,另一个HotSpot VM,命令行选项-XX:+ShowMessageBoxOnError可以被使用。这个选项在VM退出前通过弹出一个对话框提示HotSpot VM出现了一个致命错误来终止VM。这提供了一个时机来将HotSpot VM优先于退出依附于一个调试器。
当HotSpot VM遇到一个致命错误,内部会用一个叫做VMError的类来记录和生成hs_err_pid<pid>.log文件。当一个可识别的信号或者异常被检测到时,VMError类就被特定的指令调用。
提示:HotSpot VM使用信号来进行内部交流。当一个信号没被接收HotSpot VM的致命错误处理程序将被调用。这中没有被接收的情况可能来自于应用JNI code的错误,操作系统本地库,jre本地库或者HotSpot VM本身。
当关键的锁比如内存分配锁被持有时,HotSpot VM的致命错误处理程序必须小心的来写以避免自身成为引起错误的原因,比如StackOverflow或者致命错误。
由于OutOfMemoryError很可能遇到,尤其是在一些大规模的应用上,为用户提供有用的诊断信息从而使问题很快被确定就变得很重要。很常见的一种做法是简单的开大Java heap的大小。当OutOfMemoryError发生时,错误信息指示了哪种类型的内存是有问题的。例如:有可能是Java堆空间或者是永久代空间被指定的太小了。从java6开始,HotSpot VM产生的错误信息中包含了栈路径。当OutOfMemoryError第一次被抛出的时候,-XX:OutOfMemoryError=<cmd>选项的使用可以是命令被执行。值得一提的一个附加的有用特性是可以存储关于OutOfMemoryError的堆信息。通过指定-XX:+HeapDumpOnOutOfMemeoryError这个HotSpot VM命令行选项可以使这个特性生效。还有另外一个命令行选项-XX:HeapDumpPath=<pathname>允许用户定义堆信息将被存储在哪里的路径。
尽管应用程序的编写意图在避免线程死锁,但是开发者有时会犯错然后就导致死锁。当死锁发生了,在WIndows上按Ctrl+Break可以强制一个Java层级的线程栈打印标准的输出。在Solaris和Linux上,发送一个SIGQUIT信号给Java进程id完成同样的操作。分析一个线程轨迹可以分析死锁的源头。从Java6开始,绑定的JConsole工具增加了依附于Java进程来分析死锁的根本原因的功能。大多数情况下,死锁是由于错误的获取锁的顺序引起的。
相关推荐
主要整理内容为:分析了垃圾收集的算法和JDK1.7中提供的7款垃圾收集器的特点以及运作原理。以及内存分配策略
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。在Windows 7系统中,Java虚拟机允许开发者和用户在不考虑底层硬件平台的情况下执行Java应用程序。"java win-7 虚拟机"指的是专门为...
Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...
java-jvm虚拟机原理.ppt java-jvm虚拟机原理.ppt
性能调优专题_-Java虚拟机性能调优与底层原理分析
2. **性能限制**:相较于直接运行在苹果硬件上的MAC-OS,虚拟机中的MAC-OS可能会遇到性能瓶颈,尤其是在处理图形密集型任务时表现不佳。 3. **稳定性考量**:由于虚拟机环境的复杂性,长时间运行或者进行高负载任务...
### VMware虚拟机系列全套教程-VMware虚拟机搭建教程 #### VMware虚拟机基本知识 - **定义**: VMware虚拟机是一种软件工具,它可以在一台物理计算机上创建并运行多个独立的操作系统实例,即所谓的“虚拟机”(VM)...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。微软版本的Java虚拟机是专为Windows操作系统设计的,使得在Windows系统上可以执行编译后的Java字节码(.class文件)。这个压缩包...
BT5 汉化版下载地址+教程 ---虚拟机
win10中的Hyper-V虚拟机,已经不带vmguest.iso这个文件了,要自己加载进来,就可以正常为虚拟系统安装驱动
这个压缩包“计算机软件-编程源码-Java 虚拟机规范.zip”很可能包含的是关于Java虚拟机的工作原理、设计规范以及可能的一些实现细节。在深入探讨这些知识点之前,我们先来了解一下Java虚拟机的基础概念。 Java...
这是一个VMware Tools的源代码包,在Linux虚拟机中安装这个工具后,可以提供一系列增强功能,如图形加速、磁盘性能优化、网络性能提升以及我们关注的文件共享功能。通常,VMware Tools会自动安装,如果没有,可以...
Java虚拟机规范中文版 详细介绍java虚拟机的运行原理等
SCALA程序设计-JAVA虚拟机多核编程实战
Java虚拟机(JVM)是Java程序的核心组成部分,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的内存模型、各区域的作用以及对象创建过程。 **1. JVM内存模型** JVM内存模型主要分为以下几个...
深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序...Java 虚拟机也提供了自动内存管理、垃圾收集、多线程支持等功能,提高了 Java 程序的可靠性和性能。
这个最新的“Windows10和2016启用Hyper-V虚拟机集成服务安装ISO文件”是为确保在Hyper-V环境中运行的Windows 10和Windows Server 2016虚拟机能够充分利用硬件资源并实现最佳性能而设计的。 集成服务是Hyper-V虚拟机...