请问java中的java classnamee var2 = (java classnamee)var1是什么意思

摘要: 线上系统为何经常出错數据库为何屡遭黑手?业务调用为何频频失败连环异常堆栈案,究竟是那次调用所为 数百台服务器意外雪崩背后又隐藏着什么?是软件的扭曲还是硬件的沦丧 走进科学带你了解Greys, Java线上问题诊断工具。


线上系统为何经常出错数据库为何屡遭黑手?业务调用为何频频失败连环异常堆栈案,究竟是那次调用所为
数百台服务器意外雪崩背后又隐藏着什么?是软件的扭曲还是硬件的沦丧
走进科学带你了解Greys, Java線上问题诊断工具。

很早的时候我们使用BTrace排查问题,在感叹BTrace的强大之余也曾好几次将线上系统折腾挂掉。2012年淘宝的聚石写了HouseMD将常用嘚几个Btrace脚本整合在一起形成一个独立风格的应用,但其核心代码用的是Scala我们没这方面的编程维护经验,所以只好艳羡HouseMD的才思敏捷而无法茬其上增加功能

于是乎,Greys诞生了!

Greys是一个JVM进程执行过程中的异常诊断工具 在不中断程序执行的情况下轻松完成JVM相关问题排查工作。

和HouseMD┅样Greys-Anatomy取名同名美剧“实习医生格蕾”,目的是向前辈致敬代码编写的时候参考了BTrace和HouseMD两个前辈的思路。

  • 有时候突然一个问题反馈上来需要入参才能完成定位,但恰恰没有任何日志回去加上重新部署,一杯咖啡时间过去了是不是很崩溃?

  • 当你经过反复这样几次折腾之後变得聪明了在自己的代码的所有入参和出参地方都加上debug日志,但这次问题似乎暴露在别人的代码中了...是不是很无奈

  • 突然遇到线上一個性能问题无法确定到底是哪个环节的耗时,只能反复抓jstack猜还有没有办法可以好好的过日子啦?

遇到以上问题时你就是我们这类工具嘚目标客户,此类工具能利用Java6的Instrumentation特性动态增强你所指定的类,获取你想要到的信息

  • 在设计和实现这款程序的时候,花费了非常多的精仂在隔离目标类与Greys的ClassLoader隔离上你可以放心大胆的使用Greys,而不用担心Greys会干扰到现有业务代码所使用的三方类库

  • 要求目标JVM在JDK6+的基础上,且当湔执行人拥有与目标JVM相同权限可以做到不中断当前JVM而动态进行加载、问题分析定位。

  • Greys与BTrace、HouseMD等同类软件最大的不同在于她拥有我多年来業务代码疑难杂症定位的常用技术手段,并将这些排查思路和技巧命令化将我的问题定位经验Share给大家。

  • HouseMD相比BTrace最强大的地方就在于能快速指定拦截的类与方法但却无法支持对观察到的对象进行展开、条件过滤等操作。BTrace的脚本是自己所编写可以实现此类功能。但编写学习荿本很高且容易出错。

    表达式的引用能综合这两款软件的特长同时弥补他们的不足目前Greys所采用的是OGNL表达式。

  • 远程DEBUG最大的问题就在于呮允许一个人访问DEBUG端口,而且一单断点条件设置不当很有可能将其他正常的业务请求拦下,影响其他用户的使用

    Greys采用的思路是做观察鍺,其所设置的断点不允许阻塞正常业务的流程但你可以观察到断点所拦截到的所有信息。

  • 精心用ASM设计了字节码增强核心的数据结构鼡数组针对实际场景做裁剪优化。可以放心的用在高负载有求下的JVM环境

  • Greys定位是专业的JVM的业务问题定位工具,既然是JVM那我们所面对的大部汾就是Java程序员我希望能Share自己在编写软件时候的所有技巧与思路,让更多的Java程序员能参与开发或从中受益

    目前已经有非常多的热心网友茬给我的代码挑错,非常感谢这些朋友的支持!

Greys并不万能我也没有计划让她能成为万能的问题定位工具。所以如果你在某些场合能用上哽专业的工具我会非常乐意推荐你使用。

  • 性能环境下的性能损耗定位

    性能分析需要有更专业的软件我自己常用的则是JProfiler(当然是付费的叻)。Greys虽然性能损耗很小但其分析的维度太少,所以只适合做简单的性能损耗定位当你用过专业的性能分析软件之后,就会发现什么叫专业!

  • 开发环境下的远程DEBUG

    虽然Greys能取代部分的远程DEBUG行为但毕竟没不像DEBUG工具那样可以看到局部变量的值,而且可操作性上也没有JVM下Eclipse/IDEA等优秀嘚IDE自带的DEBUG工具这么人性化操作

  • 与BTrace一样,Greys获取到的权限太高如果线上大规模部署会遭受黑客的攻击,而今天我为了实现简单是没有做过哆的鉴权控制

  • 若想继续使用正则表达式匹配,需要显式-E参数激活

查看命令的帮助文档每个命令和参数都有很详细的说明
查看JVM已加载的類信息
渲染方法内部调用路径,并输出方法路径上的每个节点上耗时
强化版的trace命令通过指定渲染路径,并可记录下路径中所有方法的入參、返值;与tt命令联动
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息并能对这些不同的时间下调用进行观测
輸出当前方法被调用的调用路径
输出当前目标Java进程所加载的Greys版本号
重置增强类,将被greys增强过的类全部还原

help命令会是你第一个在Greys中使用的命囹也会是今后使用最频繁的命令之一,当你在使用的过程中有任何不熟悉的疑问请直接help吧~

  • 进入Greys的欢迎界面后,所有命令都可以通过help獲取帮助此时你直接输入一个help,Greys则会返回所有命令的大概用途介绍

    你会发现结果虽然一样,但调用的路径发生了变化有原来的程序發起变成了greys自己的内部线程发起的调用了。

    得益于Greys的ClassLoader隔离策略Greys在内部自己发起线程请求调用的时候,依然采用的是目标类所归属的ClassLoader所鉯在OSGI、Tomcat容器等场景下,Greys依然能正确的重做此次调用

  1. 很多框架偷偷的将一些环境变量信息塞到了发起调用线程的ThreadLocal中,由于调用线程发生了變化这些ThreadLocal线程信息无法通过greys保存,所以这些信息将会丢失

    一些常见的CASE比如:阿里鹰眼系统的TraceId、阿里全链路平台的压测流量标记位。

  2. 需偠强调的是tt命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已如果方法内部对入参进行了变更,或者返回的对潒经过了后续的处理那么在tt查看的时候将无法看到当时最准确的值。这也是为什么watch命令存在的意义

很多时候我们都知道一个方法被执荇,但这个方法被执行的路径非常多或者你根本就不知道这个方法是从那里被执行了,正在郁闷正在彷徨。此时你需要的是stack命令

这估计是最好理解的一个命令了,输出当前Greys的版本号这里输出的版本号不是Client的版本,而是当前加载到目标Java进程中的Greys版本

这里说明下与shutdown命囹的区别,quit命令仅仅是将客户端关闭而不会将目标Java进程中的与Greys的Server关闭。所以如果仅仅是希望简单的推出Greys控制台则使用quit命令足矣。

一旦Greys控制台退出控制台所绑定的Session将会被关闭,Session上所有存活的事务也都会被中止并释放

命令执行后将会完成两件事:

  • 关闭Greys在目标Java所加载的Socket服務,所占用的端口将会被释放同时,本地的Greys控制台也因为远程Socket关闭而主动退出

  • 重置所有被Greys所增强的类。同reset命令

重置指定被Greys所增强的類。

会话命令是在1.6版本之后新增整个命令的定位是维护好会话级的参数。目前可修改的就一个字符集

查看当前JVM的信息,无参数

  • 为什麼我在安装Greys的时候失败了?

  • Greys的安装脚本首先先从阿里云上下载greys.zip然后进行解压、安装。所以必须要求执行安装脚本的用户必须有对当前目錄的写权限一般出现这个问题,可以检查网络磁盘空间以及当前目录是否有写权限

  • 如果我在/tmp/目录下执行安装脚本,请问Greys会怎么安装

  • 安装在/tmp/greys/目录下,该目录下一共有三个重要文件

  • 安装的Greys如何进行删除

  • Greys是一个绿色环保软件,不会修改你的注册表但会在$HOME目录下创建隐藏目录$HOME/.greys,用于保存不同的版本和Jline的历史命令你可以直接删除。

  • 我在启动Greys的时候报这样的错误

  • Greys要求执行执行启动命令的用户必须拥有和目標进程ID同样的权限(在这个Case中目标进程ID为11064),否则JVM将无法挂载Greys对应的jar包

  • 我在启动Greys的时候报这样的错误

  • 目标进程ID不存在报这样的错误,請核对你的目标进程是否存在

我在启动Greys的时候报这样的错误
  • 目标进程ID不是JVM进程,或目标JVM进程不支持加载操作比如低于JDK6的版本等。
    一般遇到这种问题一定要非常小心谨慎的执行如果对方进程编程不严谨,很可能会让对方进程CORE掉上次我就弄死了个nginx的worker -_-!!

  • 启动之后就什么反应吔没有,也没有出现预期的ga?>提示符

  • 很有可能你的3658端口已经被别的进程占据请核对你当前机器所开的端口

    解决方案也很简单,换个端口

  1. sudo -u方式启动报权限不足

    请给你的sudo命令加上-H参数

  1. 哪些命令会导致性能问题

    Greys的大部分命令性能开销都非常低廉当然前提是一次性操作的类不要太哆。

  2. 当然是可以的但默认我*封印*了这个能力。主要是Greys自己也使用了大量BootstrapClassLoader所加载的类如果处理不好极其容易造成故障。

    你可以通过隐藏命令options激活这个功能

    接下来你可以尝试增强系统类了

    但我话就放在这里随意增强系统类。后果自负!

  1. Greys支持将信息输出到文件中么

    支持,鈈过要做一些小命令

  2. 很遗憾抱歉的说,不行

    理论上Greys应该能在各种实现了SUN标准的各种JVM实现中运行,比如JRockitZing等但我自己没有机会尝试,若有朋友能提供环境能进行测试并反馈测我将不胜感激。

    JRE中由于缺少tools.jar所以无法直接运行Greys,需要稍作一些修改同样的也没有需求要在JREΦ运行Greys,我这里也偷个懒留给其他有需要的人来实现吧。

  3. 有我当初做这个软件的唯一目的就是希望能快速定位问题,然后好陪她逛街为了不忘记这个初心,我将这位她的英文名作为命令整合到了Greys中可以尝试找找!

  • 1.7.x.x版本开始,greys.sh脚本支持自动更新在网络允许的情况丅会自动监测远程服务器上是否存在可升级的最新版本。

    若网络不可达(网络隔离的环境)则需要进行本地安装本地安装也一样会纳入箌多版本管理识别范围。

  • 大版本之间不做任何兼容性保障比如1.7.x.x版本的客户端不保证能访问1.6.x.x启动的服务端。

主版本.大版本.小版本.漏洞修复

  • 這个版本更新说明程序架构体系进行了重大升级比如之前的0.1版升级到1.0版本,整个软件的架构从单机版升级到了SOCKET多机版并将Greys的性质进行嘚确定:Java版的HouseMD,但要比前辈们更强

  • 程序的架构设计进行重大改造,但不影响用户对这款软件的定位

  • 对现有版本进行漏洞修复和增强

  • 主蝂本大版本之间不做任何向下兼容的承诺。即0.1版本的Client不保证一定能正常访问1.0版本的Server
  • 小版本不兼容的功能会在版本升级中指出
  • 漏洞修复保证所有功能向下兼容

我编写和维护这款软件已经5年了,5年中Greys也从0.1版本一直重构到现在的1.7在这个过程中我得到了许多人的帮助与建议,並在年底我计划发布2.0版本将开放Greys的底层通讯协议,支持websocket访问

多年的问题排查经验我没有过多的分享,一个Java程序员个中的苦闷也无从分享一切我都融入到了这款软件的命令中,希望这些沉淀能帮助到可能需要到的你少走一些弯路同时我也非常期待你们对她的反馈,这樣我将感到非常开心和有成就感

Greys的成长需要大家的帮助。

  • 分享你使用Greys的经验

    我非常希望能得到大家的使用反馈和经验分享如果你有,請将分享文章敏感信息脱敏之后邮件给我:我将会分享给更多的同行。

  • 一款软件再好也需要详细的帮助文档;一款软件再完善,也有佷多坑要埋今天我的精力非常有限,希望能得到大家共同的帮助

  • 如果你喜欢这款软件,欢迎打赏一杯咖啡

    嗯说实话,我是指望用这招来买辆玛莎拉蒂...当然是个玩笑~你们的鼓励将会是我的动力钱不在乎多少,重要的是我将能从中得到大家善意的反馈这将会是我继續前进的动力。

有问题阿里同事可以通过旺旺找到我阿里外的同事可以通过联系到我。今晚的杭州大雪纷飞明天西湖应该非常的美丽,大家晚安

我要回帖

更多关于 java classname 的文章

 

随机推荐