我是一名c ++程序员,我对Java知之甚少.我知道java程序员不必像C++一样直接使用内存.我也知道C++应用程序中的大多数崩溃都是由于内存损坏造成的.
因为与内存相关的问题,用Java编写的应用程序是否会崩溃?
谢谢
我们最近一直在将许多应用程序从RedHat linux JDK1.6.0_03下运行到Solaris 10u8 JDK1.6.0_16(更高规格的机器),我们注意到了一个相当紧迫的问题:在某些负载下我们的JVM获得他们自己变成了"死亡螺旋"并最终失去了记忆.注意事项:
SIGSEGV错误而崩溃最重要的一点是:行为表现在那些突然获得大量数据的应用程序中(通常通过TCP).好像VM决定继续添加更多数据(可能会将其推进到TG),而不是在"新闻空间"上运行GC,直到它意识到它必须执行完整的GC,然后尽管VM中的所有内容都是垃圾,它以某种方式决定不收集它!
这听起来很疯狂,但我只是看不出它是什么.你怎么能解释一个应用程序哪一分钟落在最大堆1Gb和下一个工作正常(当应用程序完全相同的事情时永远不会大约256M )
所以我的问题是:
我们的JVM在生产过程中不时会出现分段故障,感觉就像是某种竞争条件.
设置重现: - Linux上的JRE jre1.6.0_24 Ubuntu 9.10和Debian 4.x 64位多核AMD - Apache tomcat 6.0.24 ... 6.0.32
用fastdebug重新编译java会重现问题(这个gcc -g1).但是,它不会产生比我们在这里有更多有用的信息.
使用debug重新编译java不会重现问题(这是gcc -g加上可能的一些-DSOMETHING代码调试标志).
任何帮助试图解决这个问题的人都会非常感激.
使用Oracle的1.6.0_24 jdk生成的核心文件.gdb出现了:
Program terminated with signal 11, Segmentation fault.
#0 0x00002aaab7b10666 in NET_Read () from
/usr/local/jdk1.6.0_24/jre/lib/amd64/libnet.so
Run Code Online (Sandbox Code Playgroud)
好的,所以我的装配真的很生锈.记住这一点:
(gdb) info frame
Stack level 0, frame at 0x4b3e0040:
rip = 0x2aaab7b10666 in NET_Read; saved rip 0x2aaab7b0d53b
called by frame at 0x4b3f0090
Arglist at 0x4b3dffc8, args:
Locals at 0x4b3dffc8, Previous frame's sp is 0x4b3e0040
Saved registers:
rbx at 0x4b3e0008, rbp at 0x4b3e0010, r12 …Run Code Online (Sandbox Code Playgroud) 我已经看到了这个问题以及关于如何调试本机Java崩溃的这篇文章.这篇文章是关于Windows的.在Linux上有哪些等效的调试帮助?
注意:我所拥有的只是该字段中用户的崩溃日志.我无法访问发生崩溃的机器.
更新:我很确定崩溃是由于我们拥有的JNI代码.我从来没有打算暗示JVM本身是错误的.
每个请求,这里是崩溃转储(或者它适合30K stackoverflow限制):
# # An unexpected error has been detected by Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x06300e76, pid=9983, tid=4106996592 # # Java VM: Java HotSpot(TM) Client VM (1.6.0_03-b05 mixed mode, sharing) # Problematic frame: # V [libjvm.so+0x300e76] # # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp # --------------- T H R E A D --------------- Current thread (0x0922e000): VMThread [id=9985] siginfo:si_signo=11, si_errno=0, si_code=1, …
问题描述
经过一段时间运行我的Java服务器应用程序后,我在Solaris上遇到了Oracle Java虚拟机的奇怪行为.通常,当jvm hs_err_pid.log文件发生崩溃时(位置由-XX:ErrorFilejvm参数确定,如下所述:如何禁止创建hs_err_pid文件?
但在我的情况下,文件没有创建,唯一剩下的是core核心转储文件.
使用pstack和pflags标准的Solaris工具,我能够从core文件中收集有关崩溃的更多信息(包含在下面).
试过的解决方案
试图找到hs_err_pid.log整个文件系统中的所有文件,但找不到任何文件(甚至在应用程序工作目录之外).即:
find / -name "hs_err_pid*"
我试图找到与jvm相关的jvm错误,但我找不到类似于这种情况的有趣内容.
hs_err_pid.log文件丢失了,当然OS平台也不同了.core文件中提取了堆转储jmap并使用Eclipse MAT进行了分析.我发现了一个泄漏(添加到HashMap的元素,在核心转储1,4 M元素时永远不会被清除).然而,这并不能解释为什么hs_err_pid.log没有生成文件,也没有jvm崩溃.LinkedList):
java -Xmx1444m Test结果java.lang.OutOfMemoryError: Java heap space,java -Xmx2048m Test结果java.lang.OutOfMemoryError: Java heap space,java -Xmx3600m Test 核心转储的结果.这个问题
有没有人遇到类似jvm的问题,如何在这种情况下继续查找实际发生的事情(即在什么情况下核心从jvm转储而没有hs_err_pid.log创建文件)?
解决这个问题的任何提示或指针都会非常有用.
提取的标志 …