java core

java core,第1张

java core是什么,让我们一起了解一下:

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 平台上正常运行。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11350399.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存