揭密Java常用性能调优工具的底层实现原理( 六 )

SA的操作,最主要是通过系统调用ptrace实现 。ptrace会使内核暂停目标进程并将控制权交给跟踪进程,使跟踪进程得以察看目标进程的内存 。这是一个很危险的操作,会造成机密数据泄漏,所以ptrace-scope为了防止用户访问当前正在运行的进程的内存和状态,默认情况下不允许再访问了,我们可以使用sudo赋于权限来解决这个问题 。
常用工具:
(1)JDK自带的 jmap、jstack、jinfo、HSDB等工具
(2)vjmap是分代版的jmap(新生代,存活区,老生代),是排查内存缓慢泄露,老生代增长过快原因的利器,也是利用了SA的原理,
https://github.com/vipshop/vjtools/tree/master/vjmap
注意,当SA 开始分析时,整个目标JVM是停顿下来不工作的,让SA可以从容读取进程内存中的数据,直到断开后才会恢复 。所以在生产环境上使用有SA技术的工具时,必须先摘除流量 。
9、Crash文件造成严重错误的原因有多种可能性 。Java虚拟机自身的Bug是原因之一,但是这种可能不是很大 。在绝大多数情况下,
是由于系统的库文件、API或第三方的库文件造成的;系统资源的短缺也有可能造成这种严重的错误 。
当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致 JVM crash 的重要信息,我们可以通过分析该文件定位到导致 JVM Crash 的原因,从而修复保证系统稳定 。
默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM 参数指定生成路径:
java -XX:ErrorFile=/var/log/hs_err_pid<pid>.log这个文件主要包含如下内容:

  • 日志头文件
  • 导致 crash 的线程信息
  • 所有线程信息
  • 安全点和锁信息
  • 堆信息
  • 本地代码缓存
  • 编译事件
  • gc 相关记录
  • jvm 内存映射
  • jvm 启动参数
  • 服务器信息
内容还是相对来说比较全的,但是显示过于专业,一般虚拟机开发人员可能参考的比较多一些 。
 
作者:鸠摩
出处:【全网首发】揭密Java常用性能调优工具的底层实现原理 | HeapDump性能社区




推荐阅读