BTrace

解决内存泄漏(1)-Apache Kylin InternalThreadLocalMap泄漏问题分析

∥☆過路亽.° 提交于 2020-08-04 19:24:17
开源产品迭代快,但也容易存在隐患。有时会遇到意料之外的问题,需要研究代码解决。内存泄漏是一个很常见的问题,会导致服务不稳定,影响可用性。本文讲述了如何使用MAT和BTrace解决apache kylin内存泄漏问题,重点阐明如何定位问题,分析原因,验证猜想。 希望能抛砖引玉,让大家遇到类似内存泄漏问题时能够有所借鉴。 背景 公司自助报表业务从kylin2.0集群迁移到Kylin3.0集群时,Kylin job角色每隔2,3天所有进程OOM一遍,服务很不稳定,需要尽快解决。 调查思路 构建服务是32GB堆内存的java进程,OOM要么是内存确实不够用,要么是内存泄漏。考虑到报表业务之前使用的kylin2.0也是32GB内存,没遇到类似的OOM,所以首先怀疑内存泄漏,可能是2.0以后的新特性引入了问题。 再考虑到kylin3.0小集群用了很久也没有OOM,怀疑跟业务量和用法有关系。报表业务每天要构建几千次,构建模型各异,容易暴露出问题。一般来说,容器,Netty,ThreadLocal是内存泄漏的重灾区。要调查内存泄漏,可以使用内存分析工具MAT来分析堆内存。找到哪些对象内存用的多,以及对象的引用关系。找到怀疑的对象后,再做进一步的代码分析,用BTrace打印调用日志确定问题的原因,最后解决问题。 定位问题 java启动参数一般都会加-XX:

线上应用调试利器 --Arthas

▼魔方 西西 提交于 2020-07-29 07:41:01
在之前的文章中,我介绍了使用 Btrace 工具进行线上代码的debug ( https://www.cnblogs.com/yougewe/p/10180483.html ),其大致原理就是通过字节码注入的方式进行辅助排查。   可以说,btrace 已经给我们的开发调试一带来了许多的方便,我们在上面做任何想要的调试!但是,明显, btrace 的使用还是有一定成本的,比如:安装应用,写调试脚本...   所以,今天我们再来看一大利器: arthas (阿尔萨斯) arthas 官网地址: https://alibaba.github.io/arthas/   arthas 的文档真的写得非常棒,可以说一看就会。 但是我还是想写一下一些自己的文档,毕竟我们往往只会用到其中皮毛功能而已。翻阅其所有文档也还是有点浪费了! 一、为什么要用 Arthas ?   其实,这个问题在前面已回答,而且,你为什么要用 btrace ? 同理! 具体理由如下: 可以很方便查到一类是从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 怀疑自己的代码未被部署到服务器,可以通过命令快速验证服务器上的代码就是本地的代码; 可以直接通过 arthas 进行线上debug, 查看方法返回值以确认问题所在; 可以很方便嵌入自己的debug代码,快速验证猜想; 操作完成后

阿里内部员工,排查Java问题常用的工具单

青春壹個敷衍的年華 提交于 2020-07-28 01:51:32
这是一篇来源于阿里内部技术论坛的文章,原文在阿里内部获得一致好评。作者已经把这篇文章开放到云栖社区中供外网访问。Hollis对文章内容做了部分删减,主要删减掉了其中只有阿里内部才能使用的工具的介绍,并删减掉部分只有通过阿里内网才能访问到的链接。 前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。 闲话不多说,开搞。 Linux命令类 tail 最常用的tail -f tail -300f shopbase.log #倒数300行并进入实时监听文件写入模式 grep grep forest f.txt #文件查找 grep forest f.txt cpf.txt #多文件查找 grep 'log' /home/admin -r -n #目录下查找所有符合关键字的文件 cat f.txt | grep -i shopbase grep 'shopbase' /home/admin -r -n --include *.{vm,java} #指定文件后缀 grep 'shopbase' /home/admin -r -n --exclude *.{vm,java} #反匹配 seq 10 | grep 5

【JVM】jdk1.8-jetty-swap被占满问题排查

馋奶兔 提交于 2020-04-25 13:33:28
背景 线上服务收到报警,报警内容:虚拟机swap区占用比例超过80%,如图: 本文着重描述排查问题的过程,在这个过程中不断的猜测–>验证–>推翻–>再猜测–>再验证–>再推翻,这个过程更有意思; swap是什么 潜意识中,当进程需要申请内存而机器内存不够时,需要将一部分不常用的进程、数据换出到swap,从而腾出一部分物理内存空间; 看下关于Linux swap space的介绍: Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copied to the preconfigured space on the hard disk, called swap space, to free up that page of memory. The combined sizes of the physical memory and the swap space is the amount of virtual memory available. Swapping is necessary for two important reasons. First,

JVM系列十(虚拟机性能监控神器

两盒软妹~` 提交于 2020-04-12 18:35:28
BTrace 是什么? BTrace 是一个动态安全的 Java 追踪工具,它通过向运行中的 Java 程序植入字节码文件,来对运行中的 Java 程序热更新,方便的获取程序运行时的数据信息,并且,保证自己的消耗特别小,大部分情况下不会影响 Java 程序的性能。 BTrace 能干什么? 相信每一位开发都或多或少的干过这档子事:为了解决线上的一个 bug,不得不在代码中打印下入参、出参数据,然后再重启服务器,观察日志。BTrace 的出现就是为了解决这类事宜,BTrace 的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息,而不需要不断的修改代码,然后重启应用。 以下是 BTrace 的一些典型应用场景: 服务慢,能找出慢在哪一步,哪个函数里么? 谁调用了System.gc(),调用栈如何? 谁构造了一个超大的 ArrayList? 什么样的入参或对象属性,导致抛出了这个异常?或进入了这个处理分支? BTrace 快速开始 下载最新的 BTrace releases 版本: https://github.com/btraceio/btrace/releases 解压文件夹,在 <BTRACE_HOME>/bin 目录下主要有两个命令:一个是 btrace,一个是 btracec。 btrace BTRACE_HOME/bin/btrace PID <trace

JVM系列十(虚拟机性能监控神器

折月煮酒 提交于 2020-04-12 17:49:59
BTrace 是什么? BTrace 是一个动态安全的 Java 追踪工具,它通过向运行中的 Java 程序植入字节码文件,来对运行中的 Java 程序热更新,方便的获取程序运行时的数据信息,并且,保证自己的消耗特别小,大部分情况下不会影响 Java 程序的性能。 BTrace 能干什么? 相信每一位开发都或多或少的干过这档子事:为了解决线上的一个 bug,不得不在代码中打印下入参、出参数据,然后再重启服务器,观察日志。BTrace 的出现就是为了解决这类事宜,BTrace 的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息,而不需要不断的修改代码,然后重启应用。 以下是 BTrace 的一些典型应用场景: 服务慢,能找出慢在哪一步,哪个函数里么? 谁调用了System.gc(),调用栈如何? 谁构造了一个超大的 ArrayList? 什么样的入参或对象属性,导致抛出了这个异常?或进入了这个处理分支? BTrace 快速开始 下载最新的 BTrace releases 版本: https://github.com/btraceio/btrace/releases 解压文件夹,在 <BTRACE_HOME>/bin 目录下主要有两个命令:一个是 btrace,一个是 btracec。 btrace BTRACE_HOME/bin/btrace PID <trace

BTrace简介与使用说明

♀尐吖头ヾ 提交于 2020-03-11 05:59:47
大家在开发过程中总会预告各种个样的BUG,不是什么时候都可以去debug,也不是什么时候都可以去在代码中增加需要的日志,这个时候该如何解决呢?这个时候就是BTrace的大展身手的时候时候了,下面通过对于BTrace的介绍,同时会有一些示例代码希望可以给大家带来一定的了解 简介 Btrace (Byte Trace)是sun推出的一款java 动态、安全追踪工具,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。BTrace应用较为广泛的原因应该是其安全性和无侵入性,其中热交互技术,使得我们无需启动Agent的情况下动态跟踪分析,其安全性不会导致对目标Java进程的任何破坏性影响,使得BTrace成为我们线上产品问题定位的利器。无侵入性无需我们对原有代码做任何修改,降低上线风险和测试成本,并且无需重启启动目标Java进程进行Agent加载即可动态分析和跟踪目标程序,可以说BTrace可以满足大部分的应用场景。 安装   下载BTrace BTrace已经迁移到GitHub, 最新到版本是 v1.3.11 下载 https://github.com/btraceio/btrace/releases/download/v1.3.11/btrace-bin-1.3.11.zip 后解压到指定目录 配置BTRACE_HOME vi .bash_profile JAVA

BTrace追踪Hadoop部署

半世苍凉 提交于 2020-03-11 03:42:50
Hadoop集成BTrace 1.BTrace 1.1BTrace部署 1.下载BTrace工具包,官网地址: https://kenai.com/projects/btrace/downloads/directory/releases 2.解压btrace-bin.tar.gz,命令如下: tar -zxvf btrace-bin.tar.gz 3.配置环境变量 BTRACE_HOME=/usr/btrace-bin PATH=$PATH:$BTRACE_HOME/bin 4.执行btrace( 注意: $BTRACE_HOME/bin 下 btrace 、 btracec 、 btracer 文件权限 )命令如下,表示部署成功: 1.2BTrace脚本 BTrace测试脚本代码: 1 importcom.sun.btrace.annotations.*; 2 3 import static com.sun.btrace.BTraceUtils.*; 4 5 @BTrace 6 public class TraceMR 7 { 8 @TLS privatestaticlongmapperSetupStartTime = 0l; 9 10 @OnMethod(clazz="org.apache.hadoop.mapreduce.Mapper", 11 method="run",

生产环境中系统调试--BTrace

 ̄綄美尐妖づ 提交于 2020-03-10 23:27:46
BTrace是sun公司推出的一款Java 动态、安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。 由于Btrace会把脚本逻辑直接侵入到运行的代码中,所以在使用上做很多 限制 : 1、不能创建对象 2、不能使用数组 3、不能抛出或捕获异常 4、不能使用循环 5、不能使用synchronized关键字 6、属性和方法必须使用static修饰 根据官方声明,不恰当的使用BTrace可能导致JVM崩溃,如在BTrace脚本使用错误的class文件,所以在上生产环境之前,务必在本地充分的验证脚本的正确性。 Btrace可以做什么? 1、接口性能变慢,分析每个方法的耗时情况; 2、当在Map中插入大量数据,分析其扩容情况; 3、分析哪个方法调用了System.gc(),调用栈如何; 4、执行某个方法抛出异常时,分析运行时参数; 5、.......... BTrace已经迁移到GitHub BTrace最新地址:https://github.com/btraceio/btrace/releases/tag/v1.3.9 相关链接: http://www.importnew.com/23614.html 相关知识: 在线调试工具有哪些: 可视化的工具有

btrace 实践笔记

旧时模样 提交于 2020-03-10 11:54:13
btrace简介: btrace 是一个使用在JAVA平台上面的,安全的,动态跟踪工具。它一般用于动态跟踪正在运行的jAVA程序。 使用说明在 这里 。下载地址在 这里 。 下载的时候注意版本问题,我最初下载的是release-1.2.3的版本,然后服务器上面的JAVA的版本是1.6.0_32。运行的时候报了这个错。 [java] java.lang.UnsupportedClassVersionError[/java] 这是由于编译release-1.2.3的jdk版本比1.6.0_32要高,但是却运行在较低版本的JVM上面,所以会报这个错,然后我下载了release-1.2.2版本没有这个问题。 btrace安装: btrace其实不需要安装,直接解压,然后把bin这个目录加到path里面,并且设置BTRACE_HOME为解压目录,然后就可以执行btrace命令测试了。 btrace实践步骤 首先找到运行中java程序的PID(后面会用到). ? ps -A|grep java 然后 创建脚本:例如TraceObject.java ? import static com.sun.btrace.BTraceUtils.*; import com.sun.btrace.annotations.*; @BTrace public class TraceObject{ @TLS