core是unix系统的内核。当你的程序出现内存越界的时候, *** 作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析,Core模块主要包含Spring框架基本的核心工具类。
core在Java程序运行时,有时会产生JavaCore及HeapDump文件,它一般发生于Java程序遇到致命问题的情况下。
有时致命问题发生后,Java应用不会死掉,还能继续运行,但有时致命问题发生,Java进程会死掉。为了能够保留Java应用发生致命错误前的运行状态,JVM在死掉前产生两个文件,分别为JavaCore及HeapDump文件。
这两者有何区别?
JavaCore是关于CPU的,而HeapDump文件是关于内存的。
JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。
HeapDump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况,这种文件需要相应的工具进行分析,如IBM Heap Analyzer这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况。
实战 *** 作:Java Core之字节码与类创建过程代码如下。 package io.renren.modules.manyThread class Son extends Father{ static { System.out.println("Son的静态代码块") } { System.out.println("Son的普通代码块") } public Son(){ System.out.println("Son的构造方法") } } class Father{ static { System.out.println("Father的静态代码块") } { System.out.println("Father的普通代码块") } public Father(){ System.out.println("Father的构造方法") } } public class Demo{ public static void main(String[] args) { Son son = new Son() } }
C程序发布的时候,经常去掉-g编译选项的,那么这就遇到一个问题,当程序运行core dump后,想去调试查看core的具体信息,会发现很多符号都被优化掉了,看到的栈信息要么是问号,要么变量无法打印值; 去掉符号表,却可以让程序体积更小,而且不容易泄漏程序的信息,更安全些。
这就产生了矛盾,我们在运行的时候不需要符号表,调试的时候需要符合表,那我们能否把符号表在发布程序的时候删除,调试的时候加载符号表信息那,这样就满足了需要。
为了直观起见,先写个简单的c代码用于演示,代码如下:
编译下:
gdb调试看看:
可以看到显示没有调试符号表信息,我们重新用-g编译选项试试:
其实也不是完全没有符号,也还是有不少的,只是没有调试信息,可以用命令查看:
两个符号表的大小是有差距的差距6个,这个表示符号表的index的个数。 查下段表更清晰:
编译的时候可以采用-g编译,然后发布的时候去掉符号表,可以使用命令:strip。 如下最简单的处理下:
可以看到strip处理过的testdebug,比不用-g 选项的编译出来的test文件更小,通过nm命令验证下,确实任何符号都被删除了,而不用-g编译的文件还可以看到符号信息的。
默认情况下不会产生core文件,加大core文件尺寸:
重新编译运行:
看下core的信息:
调试下看看:
因为没有符号信息,很可惜看不到具体的符号信息,也不知道在哪里core了。
看重点,加载符号文件,这个是直接加载没有strip前的文件,是包含符号表的。我们清晰的可以看到core的位置是在第8行。
我们通过命令: eu-strip testdebug -f testdebug.sym 提取testdebug中的符号表,保存为文件testdebug.sym。
我们gdb调试的时候导入这个符号试试:
Microsoft Core 运行库是一组由微软开发的共享库,主要用于在现代 Windows 平台上使用和运行32位和64位应用程序。它们包括各种新的应用程序框架,如.NET Framework 和 Visual C++ 运行时组件,以支持新的应用程序功能和特性。Microsoft Core 运行库的主要功能是为应用程序提供一致的体验,并为应用程序开发者提供一致的运行环境。它们还为用户提供一致的安全和兼容性,以便他们能够确保他们的应用程序在新的 Windows 平台上正确运行。Microsoft Core 运行库可以帮助开发人员更轻松地开发出稳定,安全的应用程序,并可以确保他们的应用程序在现代 Windows 平台上正常运行。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)