JVM的垃圾回收(GC)机制让我们从频繁操作内存的危险工作中解脱出来。但我们知道一切存在都有其两面性,一方面因为我们不再过多关注内存的分配和管理,把这些工作都交给了JVM,这也确实给我们带来诸多便利;另一方面JVM的垃圾回收机制并非都是最优的,比如一些资源无法在其最合适的时间被释放,导致开发的应用性能不佳。这个两面性的存在督促着我们时刻去监控开发的应用,甚至回过头来去认识JVM到底是如何进行垃圾回收的。JVM的垃圾回收算法相对比较复杂,在详细讲解之前我们先共同了解下常用的一些java应用的性能监控、分析工具。
命令行工具:
一、命令行工具jps(JVM process Status Tools)
jps是JDK1.5提供的一个命令行工具,存放在jdk的bin目录中,它可以列出正在运行的虚拟机进程,并显示出虚拟机中正在执行的进程及其PID,语法为:jps [option] [hostid]。其中hostid默认是本机,option则主要包括-q、-m、-l、-v等几个选项,具体功能如下表所示:
Option |
Function |
-q |
忽略类名、Jar包名以及传递给main方法的参数,仅输出VMID,本机则是指PID。 |
-l |
输出应用程序主类全名或应用程序JAR文件的完整路径。 |
-m |
输出传递给main方法的参数,内嵌的JVM输出结果为null。 |
-v |
输出JVM的启动参数。 |
我们对上面表格中的命令选项一一进行测试,测试前提是已安装JDK并设置了环境变量。测试结果如下图所示:
二、命令行工具jstat(JVM Statistics Monitoring Tools)
jstat主要用于监控JVM的运行状态,比如类的装载、垃圾回收、JIT编译器等。其语法为:jstat [option vmid [interval [s|ms] [vount] ] ],其中参数interval和count分别表示查询的间隔和查询次数。比如我们每秒查询一下进程1776的垃圾回收情况10次可以用如下命令:
jstat –gc 1776 1000 10
输出结果如下:
该工具功能选项比较多,大家可以参考下表和语法规定进行查看,我们这里不再一一测试。
Option |
Function |
-class |
监视类的装载、卸载数量以及类的装载总空间和耗时。 |
-gc |
监视Java堆容量、已用空间、GC时间合计等信息。 |
-gcutil |
监视内容与-gc相同,但输出主要关注已使用空间占总空间的比例。 |
-gccause |
与-gcutil输出信息相同,额外输出导致上次GC产生的原因。 |
-gcnew |
监控新生代的GC情况。 |
-gcold |
监控老生代的GC情况。 |
-compiler |
输出JIT编译器编译过的方法、耗时信息。 |
-printcompilation |
输出已经被JIT编译过的方法。 |
三、命令行工具jstack(JVM Stack Trace for java)
jstack用于获取JVM当前时刻的快照,它是JVM当前每一条线程正在执行的堆栈信息的集合,目的是为了定位线程停顿的原因,以确定具体是线程死锁还是死循环,抑或是其它原因。语法:Jstack [option] vmid/pid,常用选项如下表所示:
Option |
Function |
-l |
堆栈信息及关于锁的附加信息。 |
-m |
显示native方法的堆栈信息。 |
-F |
正常输出的请求不响应时强制输出线程堆栈。 |
四、命令行工具jhat(JVM Heap Analysis Tool)
jhat用来分析dump文件,即将dump文件生成为浏览器能打开查看的html文件。语法为:Jhat {dump_file}。
五、命令行工具jinfo(JVM configuration Info for Java)
用来查看JVM的各项参数信息,尤其是一些默认参数。语法:Jinfo [option] pid。
六、jmap(JVM Memory Map for Java)
jmap用来生成堆快照,另外还可以查询finalize执行队列、Java堆和永久带的详细信息,如内存使用率、垃圾回收器等。语法:Jmap [option] vmip,常用选项如下表所示。
Option |
Function |
-dump |
生成dump信息,用法为-dump:[live,]format=b,file={fileName}。 |
-finalizerinfo |
显示在F-Queue中等待的Finalizer方法的对象(linux下有效)。 |
-heap |
显示堆的详细信息、垃圾回收器信息、参数配置、分代详情等。 |
-histo |
显示堆栈中的对象的统计信息,包含类、实例数量和合计容量。 |
-clstats |
显示类装载器状态。 |
-F |
JVM对-dump命令无响应时可使用该选项强制生成dump快照。 |
可视化工具:
命令行工具不直观,另外还需要记一些格式及参数,于是从JDK1.5开始,JDK加入了可视化监控工具Jconsole;从JDK1.6u7以后则加入了集多种功能于一身的可视化监控工具jvisualvm。
一、JConsole(JVM Monitoring and management console)
JConsole比较简单,此处不做详细介绍仅给出一个主界面,读者可自行实验。
二、VisualVM(Java Virutal Machine, JVM)
VisualVM 提供在上运行的 Java 应用程序的详细信息。在 VisualVM 的图形用户界面中可以方便、快捷地查看多个 Java 应用程序的相关信息。VisualVM已经集成前面介绍的集中命令行工具的功能,且相比Jconsol来说拥有更丰富的图形界面。因为JDK自带该工具,且属于免费软件,我们对java应用程序进行简单的监控分析时直接用该工具,当然如果有更复杂、更专业的监控分析需求,则最好选择商用软件。
如果读者安装的JDK并未携带该工具,读者可从https://visualvm.java.net/下载,JDK1.6u7以后版本已携带该工具,直接cmd中输入jvisualvm.exe回车或进入jdk的bin目录双击该应用程序均可打开,打开界面如下所示:
在“应用程序”窗口中,可以快速查看本地和远程 JVM 上运行的 Java 应用程序。接下来我们比照命令行工具简单操作一下。
一、可查看JVM进程及进程配置、环境等相关信息,功能类jps、jinfo命令行。
这里我们打开一个典型java应用eclipse, 则在应用程序-本地栏下出现一个eclipse的节点,我们双击这个节点,进入以下界面:
从该界面概述选项卡里我们可以查看进程vmid、JVM参数等信息。
二、可查看应用程序内存、CPU、堆、方法区、线程等信息,功能类jstat、jstack。
我们点击“监视”、“线程”选项卡可直观地查看CPU、内存、类、线程、垃圾回收情况等信息。如下图所示:
三、生成Dump、分析Dump、生成快照等,功能类jmap、jhat。
右键单击应用程序节点将打开弹出式菜单,从该弹出式菜单中可以生成线程 dump 或堆 dump。生成dump将扩展到应用程序节点下,如下两张图所示:
四、其它功能及功能扩展。
我们可以在应用程序的Profiler选项卡下对cup和内存的性能进行分析。
VisualVM还可以很方便地扩展功能,大家可以点击工具菜单,进入插件界面,点击可用插件,然后就可以对其功能进行扩展了,如下图所示:
这里我们下载安装Visual GC。下载安装成功后重新打开应用程序节点eclipse,我们可以看到界面中多了一个Visual GC的选项卡,打开后入下图所示:
本文简单介绍了常用的命令行和可视化java应用程序监控分析工具,接下来一篇文章我们将借助VisualVM及Visual GC插件来介绍JVM垃圾回收机制的基本原理,敬请关注。
作者:忆辛,写于羊城,于2015年02月28日 11点40分发表在ITeye网站,任何单位和个人未经作者书面许可,禁止转载、复制本文全文或文章的任何部分。
相关推荐
大多数对象在Eden区被创建,经过第一次垃圾回收后,仍然存活的对象会被移动到Survivor区之一。 2. 老年代:经历过多次垃圾回收仍存活的对象会晋升到老年代。这个区域的内存回收相对复杂,因为对象生命周期较长,且...
- 垃圾回收(GC)监控:理解不同GC策略(如CMS、G1、ZGC)的工作原理,通过监控GC日志分析GC行为。 - 内存泄漏检测:通过监控内存使用情况,查找可能导致内存泄漏的对象和代码。 3. **性能指标** - CPU使用率:过...
文档还提到了Java代码的性能监控与问题定位方法,包括内存泄漏检测、JVM内存泄漏分析、JVM启动参数介绍、认识JVM和JVM性能瓶颈。通过实例分析了JVM内存泄漏的几种情况,并展示了如何使用JProfile等工具来跟踪内存...
7. **性能优化**:由于可能涉及大量数据处理,工具可能采用并发编程技术(如线程池)来提高处理速度,同时利用Java内存管理和垃圾回收机制,确保程序的稳定性和高效运行。 8. **版本控制与持续集成**:在开发过程中...
书中可能会讨论垃圾回收机制、类加载器、JVM调优参数(如-Xms, -Xmx, -XX:MaxPermSize等)以及如何通过JVisualVM等工具进行性能监控。 2. **代码优化**:优化代码结构和算法可以显著提高程序效率。可能包括减少冗余...
1. **JVM内存模型**:理解Java虚拟机(JVM)的内存结构是优化的第一步,包括堆内存(新生代、老年代)、元空间、方法区、栈空间以及本地方法栈。了解各个区域的作用,如何调整大小以及垃圾收集器的工作机制。 2. **...
- **使用SiteScope**:这是一款第三方监控工具,可以监控Oracle数据库的多项性能指标。 - **使用Oracle企业管理器**:这是Oracle提供的图形化管理工具,便于查看和分析数据库性能。 - **使用Spotlight**:一款实时...
第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 [免费观看] 00:20:48分钟 | 第4节jvm初体验-内存溢出问题的分析与...
《Java虚拟机:JVM高级特性与最佳实践(第2版)》这本书深入探讨了Java虚拟机(JVM)的工作机制,旨在帮助开发者们更好地理解Java程序的运行过程,优化性能,并解决潜在的问题。作者周志明是Java领域的资深专家,他...
7. **垃圾回收和内存管理**:Java的自动内存管理,即垃圾回收机制,是其区别于其他语言的一大特点。书中会介绍垃圾回收的工作原理,如何避免内存泄漏,以及如何分析和优化内存使用。 8. **模块化系统**:Java 9引入...
性能调优工具如JVM参数调优、垃圾回收机制、以及运行期剖析接口等,都是为了更好地管理JVM性能而设计的工具和方法。在Java代码运行过程中,内存泄漏是常见的性能瓶颈之一,因此理解和分析内存泄漏的原因和症状是进行...
前言 第1章 性能调优策略概述 ...7.3 垃圾回收机制相关 7.4 实用JVM实验 7.5 本章小结 第8章 其他优化建议 8.1 Java现有机制及未来发展 8.2 系统架构优化建议 8.3 与编程无关 8.4 本章小结
这部分会涵盖类加载机制、垃圾回收、内存模型,以及如何使用JConsole和VisualVM等工具进行性能监控和分析。 9. **模块化系统**:Java 9引入了模块系统,使得大型项目的组织和依赖管理更加有序。书中会介绍如何使用`...
8. **并发性能分析与调试**:讲解如何使用Java性能监控工具(如JConsole、VisualVM等)进行并发程序的性能分析和故障排查,以及如何进行线程 Dump 分析,找出可能导致系统性能下降或不稳定的原因。 9. **JVM与并发*...
书中可能会涉及内存模型、垃圾回收、类加载机制以及如何使用JDK自带的JConsole、VisualVM等工具进行性能监控和调优。 8. **Java EE与Web开发**:虽然标题并未明确提及,但作为进阶篇,可能会介绍Java企业版(Java ...
1. **JVM工具箱**:使用JDK自带的JConsole、VisualVM等工具,或者第三方工具如JProfiler、YourKit等,可以帮助监控和分析JVM行为,找出性能瓶颈。 2. **JVM选项**:调整JVM参数可以显著影响性能,例如`+XX:+...
由于Java应用程序运行在JVM之上,程序创建的任何对象都由JVM的垃圾回收机制负责管理。了解垃圾回收的工作原理和对不同垃圾回收器(如Serial GC、Parallel GC、Concurrent Mark Sweep GC、Garbage-First GC等)的选择...