用来做网站的背景图,今天的新闻有哪些,什么是网页界面设计,中国国际贸易单一窗口网站工具既述
使用命令行工具或组合能帮您获取目标Java应用性能相关的基础信息#xff0c;但它们存在下列局限#xff1a;
无法获取方法级别的分析数据#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等#xff08;这对定位应用性能瓶颈至关重要#xff09;。要…工具既述
使用命令行工具或组合能帮您获取目标Java应用性能相关的基础信息但它们存在下列局限
无法获取方法级别的分析数据如方法间的调用关系、各方法的调用次数和调用时间等这对定位应用性能瓶颈至关重要。要求用户登录到目标 Java 应用所在的宿主机上使用起来不是很方便。分析数据通过终端输出结果展示不够直观。
为此JDK提供了一些内存泄漏的分析工具如jconsolejvisualvm等用于辅助开发人员定位问题但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。
图形化综合诊断工具
JDK自带的工具 jconsoleJDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区或元空间使用情况、类加载情况等 位置jdk\bin\jconsole.exeVisual VMVisual VM是一个工具它提供了一个可视界面用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。 位置jdk\bin\jvisualvm.exeJMCJava Mission Control内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。第三方工具 MATMAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具是一个快速、功能丰富的Java heap分析工具它可以帮助我们查找内存泄漏和减少内存消耗 Eclipse的插件形式JProfiler商业软件需要付费。功能强大。 与 VisualVM类似ArthasAlibaba开源的Java诊断工具。深受开发者喜爱。BtraceJava运行时追踪工具。可以在不停机的情况下跟踪指定的方法调用、构造函数调用和系统内存等信息。 jConsole
从Java5开始在JDK中自带的java监控和管理控制台。
用于对JVM中内存、线程和类等的监控是一个基于JMX(java management extensions)的GUI性能监控工具。
官方教程https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html
启动jdk/bin目录下启动jconsole.exe命令即可不需要使用jps命令来查间
三种连接方式 Local使用JConsole连接一个正在本地系统运行的JVM并且执行程序的和运行JConsole的需要是同一个用户。JConsole使用文件系统的授权通过RMI连接器连接到平台的MBean服务器上。这种从本地连接的监控能力只有Sun的JDK具有。 Remote使用下面的URL通过RM连接器连接到一个MX代理service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi。JConsole为建立连接需要在环境变量中设置mx.remote.credentials:来指定用户名和密码从而进行授权。 Advanced使用一个特殊的URL连接JMX代理。一股情况使用自己定制的连接器而不是RMI提供的连接器来连接JMX代理或者是一个使用JDK1.4的实现了JMX和JMX Rmote的应用。
主要作用监控内存、监控线程、监控死锁、类加载与虚拟机信息 Visual VM
描述
Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JDK命令行工具使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo)监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等甚至代替JConsole。在JDK 6 Update 7以后Visual VM便作为JDK的一部分发布VisualVM 在JDK/bin目录下即它完全免费。此外Visual VM也可以作为独立的软件安装
首页VisualVM: Home 安装 Visual VM的一大特点是支持插件扩展并且插件安装非常方便。我们既可以通过离线下载插件文件*.nbm然后在Plugin对话框的已下载页面下添加已下载的插件。也可以在可用插件页面下在线安装插件。这里建议安装上VisualGC 插件地址VisualVM: Plugins Centers IDEA安装VisualVM Launcher插件Preferences -- Plugins -- 搜索VisualVM Launcher安装重启即可。 ① 在IDEA中安装插件 ② 配置Idea VisualVM Launcher插件 连接方式 本地连接监控本地ava进程的CPU、类、线程等 远程连接 1-确定远程服务器的ip地址 2-添加JMX通过JMX技术具体监控远端服务器哪个Java进程 3-修改bin/catalina.sh文件连接远程的tomcat 4-在.../conf中添加jmxremote.access和jmxremote.password文件 5-将服务器地址改为公网ip地址 6-设置阿里云安全策路和防火墙策路 7-启动tomcat查看tomcat启动日志和端口监听 8-JMX中输入端口号、用户名、密码登录
主要功能 1-生成/读取堆内存快照 2-查看JVM参数和系统属性 3-查看运行中的虚拟机进程 4-生成/读取线程快照 5-程序资源的实时监控 6-其他功能JMX代理连接、远程环境监控、CPU分析和内存分析 eclipse MAT
概述 MAT(Memory Analyzer Tool)工具是一款功能强大的Java堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。 MAT是基于Eclipse开发的不仅可以单独使用还可以作为插件的形式嵌入在Eclipse中使用。是一款免费的性能分析工具使用起来非常方便。大家可以在https://www.eclipse.org/mat/downloads.php下载并使用MAT。 只要确保机器上装有JDK并配置好相关的环境变量MAT可正常启动。 还可以在Eclipse中以插件的方式安装 获取堆dump文件 dump文件内容MAT可以分析heap dump文件。在进行内存分析时只要获得了反映当前设备内存映像的hprof文件通过MAT打开就可以直观地看到当前的内存信息。 一般说来这些内存信息包含
所有的对象信息包括对象实例、成员变量、存储于栈中的基本类型值和存储于堆中的其他对象的引用值。所有的类信息包括classloader、类名称、父类、静态变量等GCRoot到所有的这些对象的引用路径线程信息包括线程的调用栈及此线程的线程局部变量TLS 两点说明 说明1缺点MAT 不是一个万能工具它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件以及 IBM 的 PHD 堆存储文件等都能被很好的解析。 说明2最吸引人的还是能够快速为开发人员生成内存泄漏报表方便定位问题和分析问题。虽然MAT有如此强大的功能但是内存分析也没有简单到一键完成的程度很多内存问题还是需要我们从MAT展现给我们的信息当中通过经验和直觉来判断才能发现。 获取dump文件 方法一通过 jmap工具生成可以生成任意一个java进程的dump文件 方法二通过配置JVM参数生成。
选项-XX:HeapDumpOnOutOfMemoryError 或 -XX:HeapDumpBeforeFullGC 选项-XX:HeapDumpPath所代表的含义就是当程序出现OutofMemory时将会在相应的目录下生成一份dump文件。如果不指定选项“-XX:HeapDumpPath”则在当前目录下生成dump文件。 对比考虑到生产环境中几乎不可能在线对其进行分析大都是采用离线分析因此使用jmapMAT工具是最常见的组合。 方法三使用VisualVM可以导出堆dump文件 方法四使用MAT既可以打开一个已有的堆快照也可以通过MAT直接从活动Java程序中导出堆快照。该功能将借助jps列出当前正在运行的 Java 进程以供选择并获取快照。 分析堆dump文件 histogram展示了各个类的实例数目以及这些实例的Shallow heap或Retainedheap的总和。MAT 的直方图和jmap的-histo子命令一样都能够展示各个类的实例数目以及这些实例的 Shallow heap 总和。但是MAT 的直方图还能够计算 Retained heap并支持基于实例数目或 Retained heap 的排序方式默认为 Shallow heap。此外MAT 还可以将直方图中的类按照超类、类加载器或者包名分组。当选中某个类时MAT 界面左上角的 Inspector 窗口将展示该类的 Class 实例的相关信息如类加载器等。 thread overview查看系统中的Java线程、查看局部变量的信息 获得对象相互引用的关系with outgoing references、with incoming references 浅堆与深堆 shallow heap浅堆(Shallow Heap)是指一个对象所消耗的内存。在32位系统中一个对象引用会占据 4个字节一个int类型会占据4个字节long型变量会占据8个字节每个对象头需要占用8 个字节。根据堆快照格式不同对象的大小可能会向8字节进行对齐。以String为例2个int值共占8字节对象引用占用4字节对象头8字节合计20字节向8字节对 齐故占24字节。jdk7中 这24字节为String对象的浅堆大小。它与String的value实际取值无关无论字符串长度如何浅堆大小始终是24字节。 retained heap 保留集(Retained Set)对象A的保留集指当对象A被垃圾回收后可以被释放的所有的对象集合(包括对象A本身) 即对象A的保留集可以被认为是只能通过对象A被直接或间接访问到的所有对象的集合。通俗地说就是指仅被对象A所持有的对象的集合。 深堆(Retained Heap)深堆是指对象的保留集中所有的对象的浅堆大小之和。 注意浅堆指对象本身占用的内存不包括其内部引用对象的大小。一个对象的深堆指只能通过该对象访问到的(直接或间接)所有对象的浅堆之和即对象被回收后可以释放的真实空间。 补充对象实际大小另外一个常用的概念是对象的实际大小。这里对象的实际大小定义为一个对象所能触及的所有对象的浅堆大小之和也就是通常意义上我们说的对象大小。与深堆相比似乎这个在日常开发中更为直观和被人接受但实际上这个概念和垃圾回收无关。下图显示了一个简单的对象引用关系图对象A引用了C和D对象B引用了C和E。那么对象A的浅堆大小只是A本身不含C和D而A的实际大小为A、C、D三者之和。而A的深堆大小为A与D之和由于对象C还可以通过对象B访问到因此不在对象A的深堆范围内。 练习看图理解Retained Size 上图中GC Roots直接引用了A和B两个对象。A对象的Retained SizeA对象的Shallow Size。B对象的Retained SizeB对象的Shallow Size C对象的Shallow Size。这里不包括D对象因为D对象被GC Roots直接引用。如果GC Roots不引用D对象呢 此时,B对象的Retained SizeB对象的Shallow Size C对象的Shallow Size D对象Shallow Size。 案例分析StudentTrace 考虑Lily同学15 个 webpage每个对应152个字节 15 * 152 2280字节 --即为elementData的实际大小。关心的是elementData的深堆1288是如何计算出来的能被7整除且能被3整除以及能被7整除且能被5整除的数值有021,42,63,84,35,70 共7个数。7 * 152 1064字节2280 - 1064 72 1288字节这72个字节是什么15个elementData的元素 * 4字节 60字节60 8个对象头的字节数 4字节 72字节。 支配树支配树的概念源自图论。MAT提供了一个称为支配树Dominator Tree的对象图。支配树体现了对象实例间的支配关系。在对象引用图中所有指向对象B的路径都经过对象A则认为对象A支配对象B。如果对象A是离对象B最近的一个支配对象则认为对象A为对象B的直接支配者。支配树是基于对象间的引用图所建立的它有以下基本性质
对象A的子树所有被对象A支配的对象集合表示对象A的保留集retained set即深堆。如果对象A支配对象B那么对象A的直接支配者也支配对象B。支配树的边与对象引用图的边不直接对应。 如下图所示左图表示对象引用图右图表示左图所对应的支配树。对象A和B由根对象直接支配由于在到对象C的路径中可以经过A也可以经过B因此对象C的直接支配者也是根对象。对象F与对象D相互引用因为到对象F的所有路径必然经过对象D因此对象D是对象F的直接支配者。而到对象D的所有路径中必然经过对象C即使是从对象F到对象D的引用从根节点出发也是经过对象C的所以对象D的直接支配者为对象C。 同理对象E支配对象G。到达对象H的可以通过对象D也可以通过对象E因此对象D和E都不能支配对象H而经过对象C既可以到达D也可以到达E因此对象C为对象H的直接支配者。 在MAT中单击工具栏上的对象支配树按钮可以打开对象支配树视图。 下图显示了对象支配树视图的一部分。该截图显示部分Lily学生的history队列的直接支配对象。即当Lily对象被回收也会一并回收的所有对象。显然能被3或者5整除的网页不会出现在该列表中因为它们同时被另外两名学生对象引用。 案例Tomcat堆溢出分析 说明Tomcat是最常用的Java Servlet容器之一同时也可以当做单独的Web服务器使用。Tomcat本身使用Java实现并运行于Java虚拟机之上。在大规模请求时Tomcat有可能会因为无法承受压力而发生内存溢出错误。这里根据一个被压垮的Tomcat的堆快照文件来分析Tomcat在崩溃时的内部情况。 分析过程 图1 图2 图3sessions对象它占用了约17MB空间 图4可以看到sessions对象为ConcurrentHashMap其内部分为16个Segment。从深堆大小看每个Segment都比较平均大约为1MB合计17MB。 图5 图6当前堆中含有9941个session并且每一个session的深堆为1592字节合计约15MB达到当前堆大小的50%。 图7 图8 根据当前的session总数可以计算每秒的平均压力为9941/(1403324677648-1403324645728)*1000311次/秒。由此推断在发生Tomcat堆溢出时Tomcat在连续30秒的时间内平均每秒接收了约311次不同客户端的请求创建了合计9941个session。 JProfiler
基本概述
介绍 在运行Java的时候有时候想测试运行时占用内存情况这时候就需要使用测试工具查看了。在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试而在IDEA中也有这么一个插件就是JProfiler。 JProfiler 是由 ej-technologies 公司开发的一款 Java 应用性能诊断工具。功能强大但是收费。 官网下载地址https://www.ej-technologies.com/products/jprofiler/overview.html
特点
使用方便、界面操作友好 简单且强大对被分析的应用影响小 提供模板CPU,Thread,Memory分析功能尤其强大支持对jdbc,noSql, jsp, servlet, socket等进行分析支持多种模式(离线在线)的分析支持监控本地、远程的JVM跨平台,拥有多种操作系统的安装版本 主要功能 1-方法调用对方法调用的分析可以帮助您了解应用程序正在做什么并找到提高其性能的方法 2-内存分配通过分析堆上对象、引用链和垃圾收集能帮您修复内存泄漏问题优化内存使用 3-线程和锁JProfiler提供多种针对线程和锁的分析视图助您发现多线程问题 4-高级子系统许多性能问题都发生在更高的语义级别上。例如对于心BC调用您可能希望找出执行最慢的SQL语句。JProfiler支持对这些子系统进行集成分析
安装与配置
下载ej-technologies - Java APM, Java Profiler, Java Installer Builder 安装后直接启动bin目录下jprofiler.exe命令即可 JProfiler中配置IDEA 选择IDEA 2019 IDEA集成JProfiler
一、安装分为在线安装和离线安装两种方式 方式一直接在IDEA上下载File–Settings–plugins–Browse repositories 找到jprofiler然后点击安装。 看到如下图片则说明安装完成 方式二从官网下载插件 官方下载地址https://plugins.jetbrains.com/plugin/253-jprofiler 找到对应的版本下载就行。然后把从下载的压缩包解压出来的JProfiler文件夹copy到IDEA自定义插件目录默认路径C:\Users\Administrator.IntelliJIdea2017.2\config\plugins
二、安装完之后还不能使用如果不配置OK的话会一直报错的。 然后启动的时候就可以使用这个 jprofiler 的插件启动监测了。 启动项目的时候他会自动调用你安装的客户端。 具体使用
数据采集方式 JProfier数据采集方式分为两种Sampling(样本采集)和Instrumentation重构模式
Instrumentation: 这是JProfiler全功能模式。在class加载之前JProfier把相关功能代码写入到需要分析的class的bytecode中对正在运行的jvm有一定影响。 优点: 功能强大。在此设置中,调用堆栈信息是准确的。缺点若要分析的class较多,则对应用的性能影响较大,CPU开销可能很高(取决于Filter的控制)。因此使用此模式一般配合Filter使用,只对特定的类或包进行分析。Sampling: 类似于样本统计, 每隔一定时间(5ms)将每个线程栈中方法栈中的信息统计出来。 优点对CPU的开销非常低对应用影响小(即使你不配置任何Filter)缺点一些数据/特性不能提供(例如:方法的调用次数、执行时间) 注: JProfiler本身没有指出数据的采集类型这里的采集类型是针对方法调用的采集类型。因为JProfiler的绝大多数核心功能都依赖方法调用采集的数据, 所以可以直接认为是JProfiler的数据采集类型。
遥感监测Telemetries 遥感监测 Telemetries 查看JVM的运行信息
整体视图 Overview显示堆内存、cpu、线程以及GC等活动视图内存 Memory显示一张关于内存变化的活动时间表。记录的对象 Recorded objects显示一张关于活动对象与数组的图表的活动时间表。记录吞吐量 Record Throughput显示一段时间累计的JVM生产和释放的活动时间表。垃圾回收活动 GC Activity显示一张关于垃圾回收活动的活动时间表。类 Classes显示一个与已装载类的图表的活动时间表。线程 Threads显示一个与动态线程图表的活动时间表CPU负载 CPU Load显示一段时间中CPU的负载图表。
内存视图Live Memory Live memory 内存剖析class/class instance的相关信息。 例如对象的个数大小对象创建的方法执行栈对象创建的热点。
所有对象 All Objects 显示所有加载的类的列表和在堆上分配的实例数。只有Java 1.5 (JVMTI)才会显示此视图。 记录对象 Record Objects 查看特定时间段对象的分配并记录分配的调用堆栈。
分配访问树 Allocation Call Tree 显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
分配热点 Allocation Hot Spots 显示一个列表包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
类追踪器 Class Tracker 类跟踪视图可以包含任意数量的图表显示选定的类和包的实例与时间。
分析内存中的对象的情况 频繁创建的Java对象死循环、循环次数过多 存在大的对象读取文件时byte[]应该边读边写。--如果长时间不写出的话导致byte[]过大 存在内存泄漏
堆遍历heap walker Heap walker 堆遍历 对一定时间内收集的内存对像信息进行静态分析功能强大且使用。包含对象的outgoing reference, incoming reference, biggest object等。
类 Classes 显示所有类和它们的实例可以右击具体的类Used Selected Instance实现进一步跟踪。
分配 Allocations 为所有记录对象显示分配树和分配热点。
索引 References 为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
时间 Time 显示一个对已记录对象的解决时间的柱状图。
检查 Inspections
显示了一个数量的操作将分析当前对象集在某种条件下的子集实质是一个筛选的过程。
图表 Graph 你需要在references视图和biggest视图手动添加对象到图表它可以显示对象的传入和传出引用能方便的找到垃圾收集器根源。
Ps在工具栏点击Go To Start可以使堆内存重新计数也就是回到初始状态。
cpu视图cpu views JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。
访问树 Call Tree 显示一个积累的自顶向下的树树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。
热点 Hot Spots 显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求JDBCJMS和JNDI服务请求以及按照URL请求来进行计算。
访问图 Call Graph 显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
方法统计 Method Statistis 显示一段时间内记录的方法的调用时间细节。
线程视图threads JProfiler通过对线程历史的监控判断其运行状态并监控是否有线程阻塞产生还能将一个线程所管理的方法以树状形式呈现。对线程剖析。
线程历史 Thread History 显示一个与线程活动和线程状态在一起的活动时间表。
线程监控 Thread Monitor 显示一个列表包括所有的活动线程以及它们目前的活动状况。
线程转储 Thread Dumps 显示所有线程的堆栈跟踪。
线程分析主要关心三个方面 1. web容器的线程最大数。比如Tomcat的线程容量应该略大于最大并发数。 2. 线程阻塞 3. 线程死锁
监视器锁 Monitorslocks 监控和锁 Monitors Locks 所有线程持有锁的情况以及锁的信息。 观察JVM的内部线程并查看状态
死锁探测图表 Current Locking Graph :显示JVM中的当前死锁图表。目前使用的监测器 Current Monitors :显示目前使用的监测器并且包括它们的关联线程。锁定历史图表 Locking History Graph :显示记录在JVM中的锁定历史。历史检测记录 Monitor History :显示重大的等待事件和阻塞事件的历史记录。监控器使用统计 Monitor Usage Statistics :显示分组监测线程和监测类的统计监测数据。
案例分析
案例1
/*** 功能演示测试*/
public class JProfilerTest {static HashMapInteger,Object map new HashMap();static int init 1;public static void main(String[] args) {while (true){ArrayList list new ArrayList();for (int i 0; i 500; i) {Data data new Data();list.add(data);}try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}
}
class Data{private int size 10;private byte[] buffer new byte[1024 * 1024];//10kbprivate String info hello,atguigu;
}
案例2
package com.atguigu.jprofiler;import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;public class MemoryLeak {public static void main(String[] args) {while (true) {ArrayList beanList new ArrayList();for (int i 0; i 500; i) {Bean data new Bean();data.list.add(new byte[1024 * 10]);beanList.add(data);}try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}class Bean {int size 10;String info hello,atguigu;static ArrayList list new ArrayList();
} Arthas
基本概述
背暴 前面我们介绍了jdk自带的jvisualvm等免费工具以及商业化工具Jprofiler。 jvisualvm界面 Jprofiler 这两款工具在业界知名度也比较高他们的优点是可以图形界面上看到各维度的性能数据使用者根据这些数据进行综合分析然后判断哪里出现了性能问题。 但是这两款工具也有个缺点都必须在服务端项目进程中配置相关的监控参数。然后工具通过远程连接到项目进程获取相关的数据。这样就会带来一些不便比如线上环境的网络是隔离的本地的监控工具根本连不上线上环境。并且类似于Jprofiler这样的商业工具是需要付费的。 那么有没有一款工具不需要远程连接也不需要配置监控参数同时也提供了丰富的性能监控数据呢 今天跟大家介绍一款阿里巴巴开源的性能分析神器Arthas阿尔萨斯
概述 Arthas阿尔萨斯 是Alibaba开源的Java诊断工具深受开发者喜爱。在线排查问题无需重启动态跟踪Java代码实时监控JVM状态。
Arthas 支持JDK 6支持Linux/Mac/Windows采用命令行交互模式同时提供丰富的 Tab 自动补全功能进一步方便进行问题的定位和诊断。
当你遇到以下类似问题而束手无策时Arthas可以帮助你解决
这个类从哪个 jar 包加载的为什么会报各种类相关的 Exception我改的代码为什么没有执行到难道是我没 commit分支搞错了遇到问题无法在线上 debug难道只能通过加日志再重新发布吗线上遇到某个用户的数据处理有问题但线上同样无法 debug线下无法重现是否有一个全局视角来查看系统的运行状况有什么办法可以监控到JVM的实时运行状态怎么快速定位应用的热点生成火焰图
基于哪些工具开发而来
greys-anatomy: Arthas代码基于Greys二次开发而来非常感谢Greys之前所有的工作以及Greys原作者对Arthas提出的意见和建议termd: Arthas的命令行实现基于termd开发是一款优秀的命令行程序开发框架感谢termd提供了优秀的框架。crash: Arthas的文本渲染功能基于crash中的文本渲染功能开发可以从这里看到源码感谢crash在这方面所做的优秀工作。cli: Arthas的命令行界面基于vert.x提供的cli库进行开发感谢vert.x在这方面做的优秀工作。compiler Arthas里的内存编绎器代码来源Apache Commons Net Arthas里的Telnet Client代码来源JavaAgent运行在 main方法之前的拦截器它内定的方法名叫 premain 也就是说先执行 premain 方法然后再执行 main 方法ASM一个通用的Java字节码操作和分析框架。它可以用于修改现有的类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法可以从它们构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能但是主要关注性能。因为它被设计和实现得尽可能小和快所以非常适合在动态系统中使用(当然也可以以静态方式使用例如在编译器中)
官方使用文档
官网Redirecting...
安装与使用
安装 安装方式一可以直接在Linux上通过命令下载 可以在官方 Github 上进行下载如果速度较慢可以尝试国内的码云 Gitee 下载。
github下载 wget https://alibaba.github.io/arthas/arthas-boot.jar
Gitee 下载 wget https://arthas.gitee.io/arthas-boot.jar 安装方式二也可以在浏览器直接访问https://alibaba.github.io/arthas/arthas-boot.jar等待下载成功后上传到Linux服务器上。 卸载 在 Linux/Unix/Mac 平台删除下面文件 rm -rf ~/.arthas/ rm -rf ~/logs/arthas Windows平台直接删除user home下面的.arthas和logs/arthas目录
工程目录 arthas-agent基于JavaAgent技术的代理 bin一些启动脚本 arthas-bootJava版本的一键安装启动脚本 arthas-clienttelnet client代码 arthas-common一些共用的工具类和枚举类 arthas-core核心库各种arthas命令的交互和实现 arthas-demo示例代码 arthas-memorycompiler内存编绎器代码Fork from https://github.com/skalogs/SkaETL/tree/master/compiler arthas-packagingmaven打包相关的 arthas-sitearthas站点 arthas-spy编织到目标类中的各个切面 static静态资源 arthas-testcase测试
启动 Arthas 只是一个 java 程序所以可以直接用 java -jar 运行。执行成功后arthas提供了一种命令行方式的交互方式arthas会检测当前服务器上的Java进程并将进程列表展示出来用户输入对应的编号1、2、3、4…进行选择然后回车。 方式1java -jar arthas-boot.jar # 选择进程(输入[]内编号(不是PID)回车) [INFO] arthas-boot version: 3.1.4 [INFO] Found existing java process, please choose one and hit RETURN. * [1]: 11616 com.Arthas [2]: 8676 [3]: 16200 org.jetbrains.jps.cmdline.Launcher [4]: 21032 org.jetbrains.idea.maven.server.RemoteMavenServer 方式2运行时选择 Java 进程 PID java -jar arthas-boot.jar [PID]
查看进程 查看 PID 的方式可以通过 ps 命令也可以通过 JDK 提供的 jps命令。 查看运行的 java 进程信息 jps -mlvV ps -ef| grep java 筛选 java 进程信息 jps -mlvV | grep [xxx]
查看日志 cat ~/logs/arthas/arthas.log
参看帮助 java -jar arthas-boot.jar -h
web console 除了在命令行查看外Arthas 目前还支持 Web Console。在成功启动连接进程之后就已经自动启动可以直接访问 http://127.0.0.1:8563/ 访问页面上的操作模式和控制台完全一样。 退出 最后一行 [arthas7457]$说明打开进入了监控客户端在这里就可以执行相关命令进行查看了。 使用quit\exit退出当前客户端 使用stop\shutdown关闭arthas服务端,并退出所有客户端。
相关诊断指令
基础指令 jvm相关 dashboard可以查看当前系统的实时数据面板。
https://arthas.aliyun.com/doc/dashboard展示当前tomcat的多线程状态、JVM各区域、GC情况等信息输入 Q 或者 CtrlC 可以退出dashboard命令 常用参数 -i1000每次执行间隔时间这是单位是毫秒 -n4执行多少次dashboard不指定的话会一直刷新 可以看到这里会显示出线程(按照cpu占用百分比倒排)、内存(堆空间实时情况)、GC情况等数据。 thread查看当前 JVM 的线程堆栈信息
https://arthas.aliyun.com/doc/thread常用参数 无 显示所有线程的状态信息 -b 显示当前处于BLOCKED状态的线程可以排查线程锁的问题 -i 5000 查看在接下来的多长时间内统计cpu利用率单位毫秒 -n 5 查看cpu占用率前5的线程的堆栈信息 thread_id 直接跟着线程id可以看到指定thread的堆栈信息Arthas支持管道可以用 thread 1 | grep main( 查找到main class。 [arthas49290]$ thread 1 | grep main( at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:55) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81) [arthas49290]$ jvm查看jvm详细的性能数据 地址jvm | arthas 其它
sysprop
查看和修改JVM的系统属性https://arthas.aliyun.com/doc/sysprop
sysenv
查看JVM的环境变量https://arthas.aliyun.com/doc/sysenv
getstatic
查看类的静态属性https://arthas.aliyun.com/doc/getstatic
heapdump
类似 jmap 命令的 heap dump 功能https://arthas.aliyun.com/doc/heapdumpdump到指定的文件 [arthas58205]$ heapdump /tmp/dump.hprof
只dump live对象 [arthas58205]$ heapdump --live /tmp/dump.hprof
class/classloader相关 sc查看 JVM 已加载的类信息
https://arthas.aliyun.com/doc/sc常用参数 class-pattern 类名表达式匹配 -d 输出当前类的详细信息包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载则会出现多次 -E 开启正则表达式匹配默认为通配符匹配 -f 输出当前类的成员变量信息需要配合参数-d一起使用 -x 指定输出静态变量时属性的遍历深度默认为 0即直接使用 toString 输出
补充: class-pattern支持全限定名如com.test.AAA也支持com/test/AAA这样的格式这样我们从异常堆栈里面把类名拷贝过来的时候不需要在手动把/替换为.了。 sc 默认开启了子类匹配功能也就是说所有当前类的子类也会被搜索出来想要精确的匹配请打开options disable-sub-class true开关 示例sc -d com.atguigu.arthas.OOMTest sm查看已加载类的方法信息
https://arthas.aliyun.com/doc/smsm 命令只能看到由当前类所声明 (declaring) 的方法父类则无法看到。常用参数 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 -d 展示每个方法的详细信息 -E 开启正则表达式匹配默认为通配符匹配 示例sm -d com.atguigu.arthas.OOMTest main jad 反编译指定已加载类的源码
https://arthas.aliyun.com/doc/jad在 Arthas Console 上反编译出来的源码是带语法高亮的阅读更方便当然反编译出来的 java 代码可能会存在语法错误但不影响你进行阅读理解编译java.lang.String mc、redefine mc命令Memory Compiler/内存编译器编译.java文件生成.class 网站mc | arthas 示例mc /tep/Test.java redefine命令加载外部的.class文件redefine jvm已加载的类。 网站redefine | arthas 推荐使用 retransform 命令 classloader查看 classloader 的继承树urls类加载信息
https://arthas.aliyun.com/doc/classloader了解当前系统中有多少类加载器以及每个加载器加载的类数量帮助您判断是否有类加载器泄漏。常用参数 -t : 查看ClassLoader的继承树 -l : 按类加载实例查看统计信息 -c : 用classloader对应的hashcode 来查看对应的jar urls monitor/watch/trace相关 monitor方法执行监控
对匹配 class-patternmethod-pattern的类、方法的调用进行监控。涉及方法的调用次数、执行时间、失败率等https://arthas.aliyun.com/doc/monitormonitor 命令是一个非实时返回命令常用参数 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 -c 统计周期默认值为120秒 watch方法执行数据观测
https://arthas.aliyun.com/doc/watch让你能方便的观察到指定方法的调用情况。能观察到的范围为返回值、抛出异常、入参通过编写 groovy 表达式进行对应变量的查看。常用参数 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 express 观察表达式 condition-express 条件表达式 -b 在方法调用之前观察(默认关闭) -e 在方法异常之后观察(默认关闭) -s 在方法返回之后观察(默认关闭) -f 在方法结束之后(正常返回和异常返回)观察 (默认开启) -x 指定输出结果的属性遍历深度默认为0 #cost 方法执行耗时
说明这里重点要说明的是观察表达式观察表达式的构成主要由 ognl 表达式组成所以你可以这样写{params,returnObj}只要是一个合法的 ognl 表达式都能被正常支持。举例watch 全限定类名 方法名 returnObj trace方法内部调用路径并输出方法路径上的每个节点上耗时 网站trace | arthas 补充说明
trace 命令能主动搜索 class-patternmethod-pattern 对应的方法调用路径渲染和统计整个调用链路上的所有性能开销和追踪调用链路。trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷但其每次只能跟踪一级方法的调用链路trace 在执行的过程中本身是会有一定的性能开销在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销。所以这统计出来有些许的不准渲染路径上调用的类、方法越多性能偏差越大。但还是能让你看清一些事情的。 参数说明 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 condition-express 条件表达式 -n 命令执行次数 #cost 方法执行耗时 --skipJDKMethod false 设置trace是否包含jdk里的函数调用。默认为false stack输出当前方法被调用的调用路径
https://arthas.aliyun.com/doc/stack常用参数 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 condition-express 条件表达式 -n 执行次数限制 #cost 方法执行耗时 举例 tt 方法执行数据的时空隧道记录下指定方法每次调用的入参和返回信息并能对这些不同的时间下调用进行观测。
https://arthas.aliyun.com/doc/ttTimeTunnel的缩写常用参数 -t 表明希望记录下类 *Test 的 print 方法的每次执行情况。 -n 3 指定你需要记录的次数当达到记录次数时 Arthas 会主动中断tt命令的记录过程避免人工操作无法停止的情况。 -s 筛选指定方法的调用信息 -i 参数后边跟着对应的 INDEX 编号查看到它的详细信息 -p 重做一次调用 通过 --replay-times 指定 调用次数通过 --replay-interval 指定多次调用间隔(单位ms, 默认1000ms) 举例 表格中的字段说明 其它 使用将结果重写到日志文件使用指令命令是后台运行session断开不影响任务执行生命周期默认为1天 jobs:列出所有job kill:强制终止任务 fg:将暂停的任务拉到前台执行 bg:将暂停的任务放到后台执行 grep:搜索满足条件的结果 plaintext:将命令的结果去除ANSI颜色 wc:按行统计输出结果 options:查看或设置Arthas全局开关 profiler:使用async-profiler对应用采样生成火焰图 解释 1、profiler/火焰图支持生成应用热点的火焰图。
https://arthas.aliyun.com/doc/profiler本质上是通过不断的采样然后把收集到的采样结果生成火焰图。参数说明 action 要执行的操作 actionArg 属性名模式 [i:] 采样间隔单位ns默认值10000000即10 ms [f:] 将输出转储到指定路径 [d:] 运行评测指定秒 [e:] 要跟踪哪个事件cpu, alloc, lock, cache-misses等默认是cpu
启动profiler profiler start
获取已采集的sample的数量 profiler getSamples
查看profiler状态 profiler status
停止profiler生成svg格式结果 profiler stop 默认情况下生成的结果保存到应用的工作目录下的arthas-output目录。可以通过 --file参数来指定输出结果路径。比如profiler stop --file /tmp/output.svg
生成html格式结果 profiler stop --format html
通过浏览器查看arthas-output下面的profiler结果 默认情况下arthas使用3658端口则可以打开 http://localhost:3658/arthas-output/ 查看到arthas-output目录下面的profiler结果 点击可以查看具体的结果 2、options全局开关。可以获取或设置 网站options | arthas Java Mission Control
历史 在 Oracle 收购 Sun 之前Oracle 的 JRockit 虚拟机提供了一款叫做 JRockit Mission Control 的虚拟机诊断工具。在Oracle收购Sun之后Oracle公司同时拥有了Sun Hotspot和JRockit两款虚拟机。根据Oracle对于Java的战略在今后的发展中会将JRockit的优秀特性移植到Hotspot上。其中一个重要的改进就是在Sun的JDK中加入了JRockit的支持。 在Oracle JDK 7u40之后Mission Control这款工具已经绑定在Oracle JDK中发布。自 Java 11 开始本节介绍的 JFR 已经开源。但在之前的 Java 版本JFR 属于 Commercial Feature需要通过 Java 虚拟机参数-XX:UnlockCommercialFeatures开启。 如果你有兴趣请可以查看OpenJDK的Mission Control项目。 官网GitHub - JDKMissionControl/jmc: This mirror is deprecated - please start using https://github.com/openjdk/jmc
启动 Mission Control 位于JAVA_HOME%/ bin/jmc.exe,打开这款软件。 概述 Java Mission Control简称 JMC,Java官方提供的性能强劲的工具。是一个用于对 Java 应用程序进行管理、监视、概要分析和故障排除的工具套件。它包含一个 GUI 客户端以及众多用来收集 Java 虚拟机性能数据的插件如 JMX Console能够访问用来存放虚拟机各个子系统运行数据的MXBeans以及虚拟机内置的高效 profiling 工具 Java Flight RecorderJFR。 JMC 的另一个优点就是采用取样而不是传统的代码植入技术对应用性能的影响非常非常小完全可以开着 JMC 来做压测唯一影响可能是 full gc 多了。
功能实时监控VM运行时的状态 如果是远程服务器使用前要开 JMX。 -Dcom.sun.management.jmxremote.port${YOUR PORT} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse -Djava.rmi.server.hostname${YOUR HOST/IP} 方式文件 - 连接 - 创建新连接 填入上面 JMX 参数的 host 和 port Mission Control的界面非常有特色在默认的界面中以飞机仪表的视图显示了Java堆使用率、CPU使用率和Live SetFragmentation。 Mission Control的一大特点是可以自由设置图标内容。比如如果希望在飞机仪表面板再增加一个监控项可以单击右侧的添加按钮“”按需添加各种统计图表。
“触发器” tab 可以根据 CPU、线程等信息设定一定的阈值来触发报警。“内存” tab 提供 heap 和 GC 的信息。可以关注 GC次数、时间以及随着 GC 发生 heap 的内存变化情况以此来调整 jvm 参数。“线程” tab 可以关注每条线程所占的CPU、死锁情况以及线程堆栈信息。
Java Flight Recorder Java Flight Recorder 是 JMC 的其中一个组件。Java Flight Recorder能够以极低的性能开销收集 Java 虚拟机的性能数据。JFR 的性能开销很小在默认配置下平均低于 1%。与其他工具相比JFR 能够直接访问虚拟机内的数据并且不会影响虚拟机的优化。因此它非常适用于生产环境下满负荷运行的 Java 程序。 Java Flight Recorder和JDK Mission Control共同创建了一个完整的工具链。JDK Mission Control可对Java Flight Recorder连续收集低水平和详细的运行时信息进行高效详细的分析。 事件类型当启用时JFR 将记录运行过程中发生的一系列事件。其中包括 Java 层面的事件如线程事件、锁事件以及 Java 虚拟机内部的事件如新建对象、垃圾回收和即时编译事件。 按照发生时机以及持续时间来划分JFR 的事件共有四种类型它们分别为以下四种。
瞬时事件Instant Event用户关心的是它们发生与否例如异常、线程启动事件。持续事件Duration Event用户关心的是它们的持续时间例如垃圾回收事件。计时事件Timed Event是时长超出指定阈值的持续事件。取样事件Sample Event是周期性取样的事件。 取样事件的其中一个常见例子便是方法抽样Method Sampling即每隔一段时间统计各个线程的栈轨迹。如果在这些抽样取得的栈轨迹中存在一个反复出现的方法那么我们可以推测该方法是热点方法。 启动方式 方式1使用-XX:StartFlightRecording参数 第一种是在运行目标 Java 程序时添加-XX:StartFlightRecording参数。比如下面命令中JFR 将会在 Java 虚拟机启动 5s 后对应delay5s收集数据持续 20s对应duration20s。当收集完毕后JFR 会将收集得到的数据保存至指定的文件中对应filenamemyrecording.jfr 示例java -XX:StartFlightRecordingdelay5s,duration20s,filenamemyrecording.jfr,settingsprofile MyApp 由于 JFR 将持续收集数据如果不加以限制那么 JFR 可能会填满硬盘的所有空间。因此我们有必要对这种模式下所收集的数据进行限制。 比如java -XX:StartFlightRecordingmaxage10m,maxsize100m,nameSomeLabel MyApp 方式2使用jcmd的JFR.*子命令 通过jcmd来让 JFR 开始收集数据、停止收集数据或者保存所收集的数据对应的子命令分别为JFR.startJFR.stop以及JFR.dump。 命令jcmd PID JFR.start settingsprofile maxage10m maxsize150m nameSomeLabel 上述命令运行过后目标进程中的 JFR 已经开始收集数据。此时我们可以通过下述命令来导出已经收集到的数据 命令jcmd PID JFR.dump nameSomeLabel filenamemyrecording.jfr 最后我们可以通过下述命令关闭目标进程中的 JFR 命令jcmd PID JFR.stop nameSomeLabel 方式3JMC的JFR插件 Java Flight Recorder取样分析 要采用取样必须先添加参数
-XX:UnlockCommercialFeatures -XX:FlightRecorder 否则报错 取样时间默认 1 分钟可自行按需调整事件设置选为 profiling然后可以设置取样 profile 哪些信息比如
加上对象数量的统计Java Virtual Machine - GC - Detailed - Object Count/Object Count after GC方法调用采样的间隔从 10ms 改为 1ms(但不能低于 1ms否则会影响性能了): Java Virtual Machine - Profiling - Method Profiling Sample/Method Sampling InformationSocket 与 File 采样, 10ms 太久但即使改为 1ms 也未必能抓住什么可以干脆取消掉: Java Application-File Read/FileWrite/Socket Read/Socket Write 然后就开始 Profile到时间后 Profile 结束会自动把记录下载回来在 JMC 中展示。 从展示信息中我们大致可以读到内存和CPU信息、代码、线程和IO等比较重要的信息展示。 代码定位它可以显示系统中的热点方法和占用的时间下图显示了占用CPU时间最多的方法调用树信息。 IO详情在IO页面还可以看到磁盘文件的读写情况以及网络Socket的访问情况。下图显示了在记录时间段内程序通过Socket访问的远程主机以及数据读取次数和数据读取数量。 其它工具
Flame Graphs火焰图 在追求极致性能的场景下了解你的程序运行过程中cpu在干什么很重要火焰图就是一种非常直观的展示cpu在程序整个生命周期过程中时间分配的工具。 火焰图对于现代的程序员不应该陌生这个工具可以非常直观的显示出调用栈中的CPU消耗瓶颈。 网上的关于java火焰图的讲解大部分来自于Brendan Gregg的博客http://www.brendangregg.com/flamegraphs.html 火焰图 简单通过x轴横条宽度来度量时间指标y轴代表线程栈的层次。
Tprofiler 案例使用 JDK 自身提供的工具进行 JVM 调优可以将 TPS 由 2.5 提升到 20 (提升了 7 倍)并准确定位系统瓶颈。系统瓶颈有应用里静态对象不是太多、有大量的业务线程在频繁创建一些生命周期很长的临时对象代码里有问题。那么如何在海量业务代码里边准确定位这些性能代码这里使用阿里开源工具 TProfiler 来定位这些性能代码成功解决掉了 GC 过于频繁的性能瓶颈并最终在上次优化的基础上将 TPS 再提升了4 倍即提升到 100。 TProfiler 配置部署、远程操作、日志阅读都不太复杂操作还是很简单的。但是其却是能够起到一针见血、立竿见影的效果帮我们解决了 GC 过于频繁的性能瓶颈。 TProfiler 最重要的特性就是能够统计出你指定时间段内 JVM 的 top method这些 top method 极有可能就是造成你 JVM 性能瓶颈的元凶。这是其他大多数 JVM 调优工具所不具备的包括 JRockit Mission Control。JRokit 首席开发者 Marcus Hirt 在其私人博客《Low Overhead Method Profiling with Java Mission Control》下的评论中曾明确指出 JRMC 并不支持 TOP 方法的统计。 TProfiler的下载https://github.com/alibaba/TProfiler
BtraceJava运行时追踪工具 常见的动态追踪工具有BTrace、HouseMD该项目已经停止开发、Greys-Anatomy国人开发个人开发者、BytemanJBoss出品注意Java运行时追踪工具并不限于这几种但是这几个是相对比较常用的。 BTrace是SUN Kenai云计算开发平台下的一个开源项目旨在为java提供安全可靠的动态跟踪分析工具。先看一下BTrace的官方定义 BTrace is a safe, dynamic tracing tool for the Java platform. BTrace can be used to dynamically trace a running Java program (similar to DTrace for OpenSolaris applications and OS). BTrace dynamically instruments the classes of the target application to inject tracing code (“bytecode tracing”)。 简洁明了大意是一个Java平台的安全的动态追踪工具。可以用来动态地追踪一个运行的Java程序。BTrace动态调整目标应用程序的类以注入跟踪代码“字节码跟踪”。
YourKit
JProbe
Spring Insight 补充1再谈内存泄漏
案例1
public class Stack {private Object[] elements;private int size 0;private static final int DEFAULT_INITIAL_CAPACITY 16;public Stack() {elements new Object[DEFAULT_INITIAL_CAPACITY];}public void push(Object e) {ensureCapacity();elements[size] e;}public Object pop() {if (size 0)throw new EmptyStackException();return elements[--size];}private void ensureCapacity() {if (elements.length size)elements Arrays.copyOf(elements, 2 * size 1);}
}
分析 上述程序并没有明显的错误但是这段程序有一个内存泄漏随着GC活动的增加或者内存占用的不断增加程序性能的降低就会表现出来严重时可导致内存泄漏但是这种失败情况相对较少。代码的主要问题在pop函数下面通过这张图示展现假设这个栈一直增长增长后如下图所示 当进行大量的pop操作时由于引用未进行置空gc是不会释放的如下图所示 从上图中看以看出如果栈先增长在收缩那么从栈中弹出的对象将不会被当作垃圾回收即使程序不再使用栈中的这些队象他们也不会回收因为栈中仍然保存这对象的引用俗称过期引用这个内存泄露很隐蔽。
解决办法
public Object pop() {if (size 0)throw new EmptyStackException();Object result elements[--size];elements[size] null;return result;
} 一旦引用过期清空这些引用将引用置空。 案例2
public class TestActivity extends Activity {private static final Object key new Object();Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(){//匿名线程public void run() {synchronized (key) {try {key.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}
}
分析 解决办法 1. 使用线程时一定要确保线程在周期性对象如Activity销毁时能正常结束如能正常结束但是Activity销毁后还需执行一段时间也可能造成泄露此时可采用WeakReference方法来解决另外在使用Handler的时候如存在Delay操作也可以采用WeakReference 2. 使用Handler HandlerThread时记住在周期性对象销毁时调用looper.quit()方法 补充2支持使用OQL语言查询对象信息
MAT支持一种类似于SQL的查询语言OQLObject Query Language。OQL使用类SQL语法可以在堆中进行对象的查找和筛选。
SELECT子句 Select子句在MAT中Select子句的格式与SQL基本一致用于指定要显示的列。Select子句中可以使用“*”查看结果对象的引用实例相当于outgoing references。 SELECT * FROM java.util.Vector v 使用“OBJECTS”关键字可以将返回结果集中的项以对象的形式显示。 SELECT objects v.elementData FROM java.util.Vector v SELECT OBJECTS s.value FROM java.lang.String s 在Select子句中使用“AS RETAINED SET”关键字可以得到所得对象的保留集。 SELECT AS RETAINED SET * FROM com.atguigu.mat.Student “DISTINCT”关键字用于在结果集中去除重复对象。 SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s
FROM子句 From子句用于指定查询范围它可以指定类名、正则表达式或者对象地址。 SELECT * FROM java.lang.String s 下例使用正则表达式限定搜索范围输出所有com.atguigu包下所有类的实例 SELECT * FROM com\.atguigu\..* 也可以直接使用类的地址进行搜索。使用类的地址的好处是可以区分被不同ClassLoader加载的同一种类型。 select * from 0x37a0b4d
WHERE子句 Where子句用于指定OQL的查询条件。OQL查询将只返回满足Where子句指定条件的对象。Where子句的格式与传统SQL极为相似。 下例返回长度大于10的char数组。 SELECT * FROM char[] s WHERE s.length10 下例返回包含“java”子字符串的所有字符串使用“LIKE”操作符“LIKE”操作符的操作参数为正则表达式。 SELECT * FROM java.lang.String s WHERE toString(s) LIKE .*java.* 下例返回所有value域不为null的字符串使用“”操作符。 SELECT * FROM java.lang.String s where s.value!null Where子句支持多个条件的AND、OR运算。下例返回数组长度大于15并且深堆大于1000字节的所有Vector对象。 SELECT * FROM java.util.Vector v WHERE v.elementData.length15 AN D v.retainedHeapSize1000
内置对象与方法 OQL中可以访问堆内对象的属性也可以访问堆内代理对象的属性。访问堆内对象的属性时格式如下 [ alias. ] field . field. field 其中alias为对象名称。 访问java.io.File对象的path属性并进一步访问path的value属性 SELECT toString(f.path.value) FROM java.io.File f 下例显示了String对象的内容、objectid和objectAddress。 SELECT s.toString(), s.objectId, s.objectAddress FROM java.lang.String s 下例显示java.util.Vector内部数组的长度。 SELECT v.elementData.length FROM java.util.Vector v 下例显示了所有的java.util.Vector对象及其子类型 select * from INSTANCEOF java.util.Vector