我已经(目前最新的)jdk 1.6.0.18崩溃,当运行Web应用程序(目前最新的)tomcat 6.0.24意外地在4到24小时后4小时到8天的压力测试(30个线程打到应用程序6百万次浏览量/天).这是在RHEL 5.2(Tikanga)上.

崩溃报告在http://pastebin.com/f639a6cf1,崩溃的一致部分是:

> SIGSEGV被抛出
>在libjvm.so上
> eden空间总是满(100%)

JVM运行以下选项:

CATALINA_OPTS="-server -xms512m -Xmx1024m -Djava.awt.headless=true"

我还测试了使用http://memtest.org/ 48小时(整个内存的14遍)的硬件问题的内存,没有任何错误.

我启用了-verbose:gc -XX:PrintGCDetails -XX:PrintGCTimeStamps来检查任何GC趋势或空间耗尽,但没有任何可疑的. GC和全GC以可预见的间隔发生,几乎总是释放相同的内存容量.

我的应用程序不直接使用任何本地代码.

任何关于我应该在下面看的想法

编辑 – 更多信息:

1)JDK中没有客户端vm:

[foo@localhost ~]$java -version -server
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13,mixed mode)

[foo@localhost ~]$java -version -client
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13,mixed mode)

2)不能更改O / S.

3)我不想改变JMeter压力测试变量,因为这可能会隐藏问题.因为我有一个用例(目前的压力测试场景)崩溃了我想修复崩溃的JVM,而不改变测试.

4)我在应用程序上做了static analysis,但没有什么严重的.

5)内存不会随着时间的推移而增长.内存使用情况在非常稳定的趋势(启动后)平稳很快,似乎并不可疑.

6)/ var / log / messages在崩溃之前或过程中不包含任何有用的信息

更多信息:忘记说,有一个apache(2.2.14)前面tomcat使用mod_jk 1.2.28.现在我运行测试没有apache,以防万一JVM崩溃与连接到JVM(tomcat连接器)的mod_jk本机代码.

之后(如果JVM再次崩溃),我将尝试从我的应用程序(缓存,lucene,石英)中删除一些组件,稍后将尝试使用jetty.由于事故现在发生在4小时至8天之间的任何时间,因此可能需要很多时间来了解发生了什么.

解决方法

你有编译输出吗?即PrintCompilation(如果你感觉特别勇敢,LogCompilation).

我已经通过观察编译器在做什么来调试一个这样的情况,最终(这花了很长时间,直到灯泡的时刻),意识到我的崩溃是由oracle jdbc驱动程序中的一个特定方法的编译引起的.

基本上我会做的是

>打开PrintCompilation
>因为没有给出时间戳,写一个脚本来监视该日志文件(比如每秒睡一次打印新行),并在编译方法时报告(或不)
>重复测试
检查编译器输出,看看崩溃是否与某些方法的编译相对应
再重复几次,看看是否有图案

如果有一个可辨别的模式,则使用.hotspot_compiler(或.hotspotrc)使其停止编译违规方法,重复测试,看看它是否不会爆炸.显然,在你的情况下,这个过程理论上可能需要几个月的时间我害怕.

一些参考

>用于处理logcompilation输出 – > http://wikis.sun.com/display/HotSpotInternals/LogCompilation+tool
>关于.hotspot_compiler的信息 – > http://futuretask.blogspot.com/2005/01/java-tip-7-use-hotspotcompiler-file-to.html或http://blogs.oracle.com/javawithjiva/entry/hotspotrc_and_hotspot_compiler
>一个非常简单,快速&用于观察编译器输出的脏脚本 – > http://pastebin.com/Haqjdue9
>请注意,这是为solaris编写的,与gnu等价物相比,它总是具有奇怪的选项,而无需在其他平台上使用不同的语言更容易的方法

我会做的另一件事是系统地更改您使用的gc算法,并检查与gc活动的崩溃时间(例如,它是否与年轻或旧的gc相关,TLAB呢?).您的转储表明您正在使用并行扫描,所以尝试

>系列(年轻)收藏家(IIRC,可以并行老化)
> ParNew CMS
> G1

如果它不再与不同的GC algos重现,那么你知道它是这样的(你没有修复,但是要更改GC算法和/或回溯到较旧的JVM,直到找到一个不会吹动的算法的版本).

java – JVM在RHEL 5.2的压力下崩溃的更多相关文章

  1. android – 基于JVM的语言,没有语言运行时

    ProGuard可以删除特定程序中未使用的部分运行时.如果速度和时间非常关键,另一种方法是使用NDK.

  2. android – 如何在gradle中调整dex内存的jvm args?

    我有一个Android项目,它在dex步骤中当前没有堆空间:我想在gradle中提高jvmmin/max设置,就像我们以前使用Maven插件一样:但是在gradle中的android插件的文档中我只看到这些选项:有办法吗?

  3. android – Timer()作为守护进程与非守护进程

    什么时候应该在Android应用程序中作为守护进程启动计时器?

  4. JVM的常用命令汇总

    监测java应用,最方便的就是直接使用jdk提供的现成工具,在jdk的安装的bin目录下,已经提供了多种命令行监测工具。本文为大家总结了几个JVM的常用命令,需要的可以参考一下

  5. Java JVM虚拟机调优详解

    JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,本文主要介绍了jvm调优,感兴趣的小伙伴们可以参考一下<BR>

  6. Java JVM中线程状态详解

    这篇文章主要介绍了Java JVM中线程状态详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下

  7. JVM jstack实战之死锁问题详解

    如果在生产环境发生了死锁,我们将看到的是部署的程序没有任何反应了,这个时候我们可以借助 jstack进行分析,下面我们实战操作查找死锁的原因

  8. java自旋锁和JVM对锁的优化详解

    这篇文章主要为大家介绍了java自旋锁和JVM对锁的优化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. Java 对象在 JVM 中的内存布局超详细解说

    这篇文章主要介绍了Java 对象在 JVM 中的内存布局超详细解说,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  10. JVM常见垃圾收集器学习指南

    这篇文章主要为大家介绍了JVM常见垃圾收集器学习指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 使用序列化将对象传递给另一个JVM – 相同的Java版本和jar(都运行我们的应用程序)

    但是想使用纯序列化到bytearray然后进行编码,将它从jvm1中的servlet1发送到jvm2中的servlet2局域网,在两个J2EE应用程序中设置相同的Java版本和jar)基本步骤是:–>将任何Serializable对象序列化为字节数组并生成字符串.确切的代码见下文>Base64输出1.是否需要基于64或可以跳过第2步?

  2. 所有JVM /系统中的Java,Object.hashCode()结果常量?

    Object.hashCode()的输出是否必须在同一个对象的所有JVM实现上相同?例如,如果“test”.hashCode()在1.4上返回1,它是否可能在1.6上返回2.或者如果操作系统不同,或者实例之间存在不同的处理器架构,该怎么办?

  3. Clojure的STM模型可以在多个JVM上运行吗?

    我知道Clojure在多核计算机上运行良好,但我想知道它是否适用于在多台计算机上分布的JVM集群?

  4. java – 加载时出现Eclipse jvm.dll错误

    解决方法按照评论中的要求.您的eclipse版本正在搜索jdk的x86版本.您应该检查您的eclipse是否是64位版本,如果没有,切换到64位jvm.

  5. java – 什么JVM优化导致这些性能结果?

    执行JavaREST服务性能测试我看到一个意外的模式:在每次调用中创建并返回相同值对象的方法比仅返回存储在类或对象字段中的值对象的另一个版本运行得更快.码:字节代码:>内联(更快):getstatic,invokestatic,invokevirtual,areturn>静态归档(较慢):getstatic,areturn>对象字段(较慢):aload,getfield,areturn性能(使用A

  6. java – JVM是否有计划在运行时支持泛型?

    你知道,就像CLR一样.有人甚至承认缺乏运行时通用信息是一个问题,并努力解决它?解决方法Java的设计者选择此解决方案来保持向后兼容性.从那时起,存在更多的Java代码,因此破坏向后兼容性会产生更糟糕的后果.所以我怀疑他们会改变他们的想法.

  7. 如何为多个jvm支持创建单例java类?

    任何想法,如何实现?

  8. java – 强制jvm返回本机内存

    参见英文答案>JVMsendingbackmemorytoOS3个我不时在需要大量内存的eclipse任务中运行.所以jvm在任务运行时吞下大约2-3GB的RAM,没关系.但是一旦jvm占用了那个内存它就不会释放它而且我有一种情况,当堆中使用的内存大约是200mb,总堆大小约为3gb时,这真的是不需要的,因为其他程序正在挨饿.我尝试了Max/MinHeapFreeRatio参数来强制jvm减少未使

  9. java – 获取给定JVM实例中所有当前加载的类的列表

    知道给定JVM实例当前加载哪些类是很方便的.例如,有没有办法让他们通过JVisualVM?

  10. java – JVM Spec,JVM Implementation,JVM Runtime之间的区别

    我读了以下几个字,但我想知道它们之间的差异……JVM规范,JVM实现,JVM运行时解决方法JVMSpec:描述JVM应如何表现的文档.JVM实现:基于JVMSpec的JVM实现.JVM运行时:JVM实现的一个实例.

返回
顶部