`
syyixin
  • 浏览: 35905 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java基础之垃圾回收机制(第一篇:性能监控与分析工具介绍)

    博客分类:
  • Java
阅读更多

JVM的垃圾回收(GC)机制让我们从频繁操作内存的危险工作中解脱出来。但我们知道一切存在都有其两面性,一方面因为我们不再过多关注内存的分配和管理,把这些工作都交给了JVM,这也确实给我们带来诸多便利;另一方面JVM的垃圾回收机制并非都是最优的,比如一些资源无法在其最合适的时间被释放,导致开发的应用性能不佳。这个两面性的存在督促着我们时刻去监控开发的应用,甚至回过头来去认识JVM到底是如何进行垃圾回收的。JVM的垃圾回收算法相对比较复杂,在详细讲解之前我们先共同了解下常用的一些java应用的性能监控、分析工具。

 

    命令行工具:

    一、命令行工具jpsJVM process Status Tools

 

jpsJDK1.5提供的一个命令行工具,存放在jdkbin目录中,它可以列出正在运行的虚拟机进程,并显示出虚拟机中正在执行的进程及其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并设置了环境变量。测试结果如下图所示:



    二、命令行工具jstatJVM Statistics Monitoring Tools

 

jstat主要用于监控JVM的运行状态,比如类的装载、垃圾回收、JIT编译器等。其语法为:jstat [option vmid [interval [s|ms] [vount] ] ],其中参数intervalcount分别表示查询的间隔和查询次数。比如我们每秒查询一下进程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编译过的方法。

    三、命令行工具jstackJVM Stack Trace for java

 

jstack用于获取JVM当前时刻的快照,它是JVM当前每一条线程正在执行的堆栈信息的集合,目的是为了定位线程停顿的原因,以确定具体是线程死锁还是死循环,抑或是其它原因。语法:Jstack [option] vmid/pid,常用选项如下表所示:

 

Option

Function

-l

堆栈信息及关于锁的附加信息。

-m

显示native方法的堆栈信息。

-F

正常输出的请求不响应时强制输出线程堆栈。

    四、命令行工具jhatJVM Heap Analysis Tool

 

jhat用来分析dump文件,即将dump文件生成为浏览器能打开查看的html文件。语法为:Jhat {dump_file}

    五、命令行工具jinfoJVM configuration Info for Java

 

用来查看JVM的各项参数信息,尤其是一些默认参数。语法:Jinfo [option] pid

    六、jmapJVM 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

 

一、JConsoleJVM Monitoring and management console

 

JConsole比较简单,此处不做详细介绍仅给出一个主界面,读者可自行实验。



 

    二、VisualVMJava Virutal Machine, JVM

 

VisualVM 提供在上运行的 Java 应用程序的详细信息。在 VisualVM 的图形用户界面中可以方便、快捷地查看多个 Java 应用程序的相关信息。VisualVM已经集成前面介绍的集中命令行工具的功能,且相比Jconsol来说拥有更丰富的图形界面。因为JDK自带该工具,且属于免费软件,我们对java应用程序进行简单的监控分析时直接用该工具,当然如果有更复杂、更专业的监控分析需求,则最好选择商用软件。

 

    如果读者安装的JDK并未携带该工具,读者可从https://visualvm.java.net/下载,JDK1.6u7以后版本已携带该工具,直接cmd中输入jvisualvm.exe回车或进入jdkbin目录双击该应用程序均可打开,打开界面如下所示:



 

应用程序窗口中,可以快速查看本地和远程 JVM 上运行的 Java 应用程序。接下来我们比照命令行工具简单操作一下。

    一、可查看JVM进程及进程配置、环境等相关信息,功能类jpsjinfo命令行。

    这里我们打开一个典型java应用eclipse 则在应用程序-本地栏下出现一个eclipse的节点,我们双击这个节点,进入以下界面:



 

    从该界面概述选项卡里我们可以查看进程vmidJVM参数等信息。

    二、可查看应用程序内存、CPU、堆、方法区、线程等信息,功能类jstatjstack

 

我们点击“监视”、“线程”选项卡可直观地查看CPU、内存、类、线程、垃圾回收情况等信息。如下图所示:



     三、生成Dump、分析Dump、生成快照等,功能类jmapjhat

 

右键单击应用程序节点将打开弹出式菜单,从该弹出式菜单中可以生成线程 dump 或堆 dump。生成dump将扩展到应用程序节点下,如下两张图所示:

 

 

    

 

 

    四、其它功能及功能扩展。

 

    我们可以在应用程序的Profiler选项卡下对cup和内存的性能进行分析。

 



 

VisualVM还可以很方便地扩展功能,大家可以点击工具菜单,进入插件界面,点击可用插件,然后就可以对其功能进行扩展了,如下图所示:

 




 
 

 

    这里我们下载安装Visual GC。下载安装成功后重新打开应用程序节点eclipse,我们可以看到界面中多了一个Visual GC的选项卡,打开后入下图所示:

 

 



 

本文简单介绍了常用的命令行和可视化java应用程序监控分析工具,接下来一篇文章我们将借助VisualVMVisual GC插件来介绍JVM垃圾回收机制的基本原理,敬请关注。

 

 

 

作者:忆辛,写于羊城,于20150228 1140分发表在ITeye网站,任何单位和个人未经作者书面许可,禁止转载、复制本文全文或文章的任何部分。

 

 

 

 

 

  • 大小: 18.3 KB
  • 大小: 36.4 KB
  • 大小: 75 KB
  • 大小: 39.3 KB
  • 大小: 51 KB
  • 大小: 56.3 KB
  • 大小: 47.6 KB
  • 大小: 61.7 KB
  • 大小: 61.7 KB
  • 大小: 70 KB
  • 大小: 48.1 KB
  • 大小: 58.7 KB
0
0
分享到:
评论

相关推荐

    细述 Java垃圾回收机制→Java Garbage Collection Introduction - Android 1

    各种类型的Java垃圾回收器Java垃圾回收的监控和分析本文是这个系列的第一篇文章,这篇文章将会介绍一些基本术语,如:JDK,JVM,JRE,HotSpot V

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 [免费观看] 00:20:48分钟 | 第4节jvm初体验-内存溢出问题的分析与...

    大话Java性能优化

    前言 第1章 性能调优策略概述 ...7.3 垃圾回收机制相关 7.4 实用JVM实验 7.5 本章小结 第8章 其他优化建议 8.1 Java现有机制及未来发展 8.2 系统架构优化建议 8.3 与编程无关 8.4 本章小结

    成为JavaGC专家上(3)—深入浅出Java垃圾回收机制

    在第一篇《》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响?在第二篇《》,我解释了JVM实际上是如何执行垃圾回收的,...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第1讲 说在前面的话 免费 00:05:07  第2讲 整个部分要讲的内容说明 免费 00:06:58  第3讲 环境搭建以及jdk,jre,jvm的关系 免费 00:20:48  第4讲 jvm初体验-内存溢出问题的分析与解决 免费 00:17:59  第5...

    Java虚拟机

    第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    前 言 致 谢 第一部分 走近Java 第1章 走近Java / 2 1.1 概述 / 2 1.2 Java技术体系 / 3 1.3 Java发展史 / 5 1.4 展望Java技术的未来 / 9 1.4.1 模块化 / 9 1.4.2 混合语言 / 9 1.4.3 多核并行 / 11 ...

    成为JavaGC专家(4)

    在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    java8集合源码分析-toBeTopJavaArchitect:Java架构师--成神之路

    第一章 基础篇 集合容器 数据结构 常用算法 JDK演变 I/O机制 网络协议 第二章 进阶篇 类加载 JVM 垃圾回收 线程 线程池 锁 高并发 第三章 中间件篇 缓存 远程调用 消息队列 任务调序 搜索引擎 分布式锁 监控 日志...

    java面试题

    Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    性能测试总结之内存泄露和内存溢出

    刚刚做完了一个项目的性能测试,“有幸”也遇到了内存泄露的案例,所以在此和大家分享一下。主要从以下几部分来说明,关于内存和内存泄露、...  下面就开始本篇的内容:  第一部分概念  众所周知,java中的内存jav

    resin-jvm 调优

    2.几种垃圾回收机制 2.1.标记-清除收集器 这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。 2.2.标记-压缩收集器 ...

    Android典型技术模块开发详解

    第一篇 Android开发初步 第1章 Android初识 1.1 Android简介 1.1.1 认识Android 1.1.2 Android系统框架 1.1.3 应用程序框架 1.2 Eclipse开发环境 1.2.1 安装ADT插件 1.2.2 安装SDK 1.2.3 配置源代码 1.2.4 创建AVD ...

    开涛高可用高并发-亿级流量核心技术

    第1部分概述 1 1 交易型系统设计的一些原则 2 1.1 高并发原则 3 1.1.1 无状态 3 1.1.2 拆分 3 1.1.3 服务化 4 1.1.4 消息队列 4 1.1.5 数据异构 6 1.1.6 缓存银弹 7 1.1.7 并发化 9 1.2 高可用原则 10 1.2.1 降级 10...

Global site tag (gtag.js) - Google Analytics