JDK升级到1.6后,服务器集群经常崩溃,后来把VM的参数调整为如下:
-Xmx2g -Xms2g -Xmn512m -XX:PermSize=196m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
|
指明了最大内存是2G,新生代为512M,年老区196M,内存占用率在达到70%的时候要执行GC,同时要使用CMS方式收集。
在增加内存后还是经常挂掉,又不知道具体由什么原因引起,很苦恼。后来就收集fatal log,经过统计,超过90%都是由于同一个因素引起。
JVM退出时的错误日志hs_err*.log通常是:
# An unexpected error has been detected by Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00002ad49843ae5d, pid=986, tid=1102739776
#
# Java VM: Java HotSpot(TM) 64-Bit Server VM (11.0-b16 mixed mode linux-amd64)
# Problematic frame:
# V [libjvm.so+0x25ee5d]
…
Heap
par new generation total 471872K, used 166068K [0x00002aaaae200000, 0x00002aaace200000, 0x00002aaace200000)
eden space 419456K, 33% used [0x00002aaaae200000, 0x00002aaab6bbd590, 0x00002aaac7ba0000)
from space 52416K, 48% used [0x00002aaac7ba0000, 0x00002aaac9442200, 0x00002aaacaed0000)
to space 52416K, 0% used [0x00002aaacaed0000, 0x00002aaacaed0000, 0x00002aaace200000)
concurrent mark-sweep generation total 1572864K, used 1105061K [0x00002aaace200000, 0x00002aab2e200000, 0x00002aab2e200000)
concurrent-mark-sweep perm gen total 200704K, used 124029K [0x00002aab2e200000, 0x00002aab3a600000, 0x00002aab3a600000)
|
可以看到年老区占用率刚好是1103473/1572864=70%,这个时刻,eden,from和to区都有一个不小的数值,这个说明这个时刻处于GC开始的阶段。后来把libjvm.so反汇编后,得到引起崩溃的执行代码,印证了这个想法。
V [libjvm.so+0x25ee5d]: 41 ff 95 50 02 00 00 callq *0x250(%r13)
V [libjvm.so+0x25ec73]: e9 7b ff ff ff jmpq 25ebf3 <_ZN24Par_MarkFromRootsClosure6do_bitEm+0x23>
V [libjvm.so+0x1cee10]: 49 8b 16 mov (%r14),%rdx
V [libjvm.so+0x256209]: e9 d2 fd ff ff jmpq 255fe0 <_ZN18CMSConcMarkingTask16do_scan_and_markEiP24CompactibleFreeListSpace+0x60>
V [libjvm.so+0x255d19]: 4c 89 ef mov %r13,%rdi
V [libjvm.so+0x611f57]: 80 7d a8 01 cmpb $0x1,-0x58(%rbp)
V [libjvm.so+0x60f5d4]: 48 8b 5d f8 mov -0x8(%rbp),%rbx
V [libjvm.so+0x4e2f6a]: e9 63 ff ff ff jmpq 4e2ed2 <_Z10java_startP6Thread+0xb2>
|
看得出,在GC线程要标志活的根对象的代码时,退出了。但是我们不知道它具体在做什么。
CMS做GC的过程:
1) 挂起JVM,这个过程非常短暂,标志所有的从全局变量,堆栈和寄存器可以访问到的对象,这些对象将作为根对象。
2) 恢复JVM的执行后,进行并行多CPU的标志被根对象间接引用到的对象,这个过程不能保证最后得到的结果是正确的,因为同时还有可能有创建新对象或者更新了Java引用了。这些变化同时也被记录下来了。
3) 如果最终可被标志的对象不超过98%,那么再次挂起JVM做最后一次标志。从根对象开始,根据2)记录的变化再次标志。这样就保证不会有对象漏掉了。
4) 恢复JVM,做扫除,把无法访问到对象占用有内存回收。
还有可能做内存整理,把空的内存统一到一块。
到了这里,应该可以确定十成九是JVM自身的BUG引起的了。除了自己要尝试升级JDK,还有就是向SUN提BUG了。
参考:
http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/felog.html
分享到:
相关推荐
另一个重要的参数是`-XX:OnError`,它允许我们在JVM崩溃时执行自定义的命令,比如`pmap %p`用于显示进程的内存映射,或者`gcore %p; dbx - %p`用于生成核心转储并启动调试器。在Linux中,这些命令会在子进程中执行,...
标题中的“JVM崩溃”指的是Java虚拟机(Java Virtual Machine)在运行过程中遇到了无法处理的错误,导致程序异常终止的现象。这通常是由于内存溢出、类装载错误、线程死锁或其他严重问题引起的。理解JVM崩溃的原因和...
此为修复版本,下载后直接使用即可 版本号:1.6.4,大家去下载jar的时候别搞错了!
该项目是一款基于Java平台的JVM崩溃分析工具源码,包含22个文件,其中19个为Java源文件,1个JAR包文件,1个Markdown文件和1个XML文件。该工具专注于分析JVM崩溃原因并提供常见解决方案。
在"sigar1.6.4,jvm崩溃修复版"中,它特别针对JVM崩溃问题进行了优化和修复,提升了其在Java环境下的稳定性。 在JVM(Java Virtual Machine)中,崩溃可能由于多种原因,如内存溢出、线程死锁、非法指令或系统资源...
在书上看到一个作者提出一个问题“怎样通过编写Java代码让Jvm崩溃”,我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 public class Crash { 4 public static void main...
首先,我们需要了解JVM崩溃的常见原因。这可能包括内存溢出(Out of Memory Error)、线程死锁、非法指令、系统资源耗尽等。错误日志通常会提供以下几个关键部分的信息: 1. **头部信息**:包含崩溃时JVM的版本、...
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
"年轻代GC JVM crash"可能是因为在垃圾回收过程中遇到了严重问题,导致JVM崩溃。这可能是由于以下原因: 1. **内存溢出**:如果年轻代的空间不足以容纳新分配的对象,或者Survivor区无法容纳从Eden区晋升的对象,就...
JVM监视能够帮助开发者识别内存泄漏、CPU过度使用、线程阻塞等问题,这些都可能导致应用性能下降甚至崩溃。通过实时监控,开发者可以快速定位问题,及时优化代码,提高应用的稳定性和效率。 ### jvm-mon的主要功能 ...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
《深入解析JVM崩溃分析与解决方案》 在Java开发领域,JVM(Java Virtual Machine)是执行Java程序的核心。然而,由于各种原因,JVM可能会出现崩溃,这将导致应用程序无法正常运行。"CrashAnalysis-master.zip"是一...
### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...
SAP JVM 8.1 64位是一个专为SAP系统设计的Java虚拟机,它基于Oracle的Java Development Kit (JDK) 进行优化,以满足SAP应用程序的特定需求。SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。...
这个文件对于开发者来说至关重要,因为它记录了JVM崩溃时的详细信息,包括堆栈跟踪、系统属性、线程信息以及可能的故障原因。 标题"JVM Crash,生成hs_err_pid.log文件"指的是Java虚拟机在运行过程中遇到了致命问题...
JVM(Java Virtual Machine,Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境,负责执行指令、管理数据、内存、寄存器等,是实现Java跨平台特性的关键部分。JVM指令手册详细记录了JVM的所有操作...
Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。"jvm视频及笔记"这个资源显然是一份全面学习JVM的材料,结合了视频教程和书面笔记,帮助学习者深入理解JVM的...