
plaintext
Copy code
java -XX:ErrorFile=/tmp/java_error%!p(MISSING).log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:+CrashOnOutOfMemoryError -XX:OnOutOfMemoryError="gcore %!p(MISSING)kill -9 %!p(MISSING)" YourJavaProgram
其中,-XX:ErrorFile用于指定JVM错误日志的保存路径,-XX:+HeapDumpOnOutOfMemoryError用于在发生内存溢出时生成堆转储文件,-XX:HeapDumpPath用于指定堆转储文件的保存路径,-XX:+CrashOnOutOfMemoryError用于在发生内存溢出时直接崩溃,-XX:OnOutOfMemoryError用于在发生内存溢出时执行指定的命令。在这个例子中,我们使用gcore命令生成core文件,并将进程杀掉。
在生成了core文件之后,你可以使用gdb来分析core文件。首先,你需要使用以下命令启动gdb:
plaintext
Copy code
gdb YourJavaProgram core
其中,YourJavaProgram是你的Java程序的可执行文件名,core是你生成的core文件名。启动gdb后,你可以使用gdb命令来分析core文件,例如,可以使用bt命令来查看堆栈信息,使用info命令来查看线程信息等等。
需要注意的是,在使用gdb分析core文件时,你需要了解Java程序的内部实现,例如,你需要知道Java线程是如何映射到 *** 作系统线程的,以及Java对象是如何映射到内存中的。否则,你可能无法正确地分析core文件,或者分析结果可能不准确。
在 UNIX/Linux 系统中,在编译、链接、运行一个自己编写的源程序时,不产生 core 文件才是正常的。 因为系统产生 core 文件的原因通常是由于数组越界、内存越界、变量未初始化就引用、或者是程序中的指针变量指向了一个非法的 *** 作系统的内存单元,才会产生 core 文件,而且了通常 core 文件所占的空间都是很大的,一般都是好几兆字节。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)