简介

我们在开发java项目的时候,或多或少都会去用到Java的性能管理工具。有时候是为了提升应用程序的性能,有时候是为了查找java应用程序的bug。

性能监控和调试工具在英文中叫做profile tool,提起这种工具大家可能会想到一些非常出名的jprofile等收费工具,其实JDK也自带了一些性能调试工具,比如JMC和Jconsole。

JMC现在已经和JDK的版本独立出来了,详情请参考我之前的文章:JDK 14的新特性:JFR,JMC和JFR事件流,今天我们将会重点讲解Jconsole的使用。

更多内容请访问www.flydean.com

JConsole

JConsole是JDK自带的管理工具,在JAVA_HOME/bin下面,直接命令JConsole即可开启JConsole。

JConsole有两种连接方式,一种是连接本地的进程,一种是连接远程的程序。

本地连接是不需要密码的,直接选择相应的JVM程序即可。本地连接有一个前提,就是JConsole的用户一定要和java程序的用户是相同的,否则无法操作JVM。

远程连接是通过JMX协议进行的,JMX的全称是Java Management Extention,现在大家做web可能对这个协议不太清楚,如果是做客户端程序,接触的应该会多一些。简单点讲,JMX是用来做远程管理的。程序把要管理的Bean暴露出去,然后通过JMX协议连接进行操作。

好了,我们连上一个自己写的程序试一下。

概览

JConsole分为六大部分,概览,内存,线程,类,VM和MBean。

先看一下概览:

概览展示了堆内存使用量,线程,类和CPU占用率这四大内容。

内存

我们这个程序是使用JDK14来启动的,我们看下它的内存情况:

从上图中,我们可以看到使用JConsole可以监控堆内存,非堆内存的一些情况,更进一步,还可以监控内存池中的一些项目的使用情况。

G1垃圾回收器中的Eden,Old和Survivor space大家应该都很熟悉了。

Young Gen被划分为1个Eden Space和2个Suvivor Space。当对象刚刚被创建的时候,是放在Eden space。垃圾回收的时候,会扫描Eden Space和一个Suvivor Space。如果在垃圾回收的时候发现Eden Space中的对象任然有效,则会将其复制到另外一个Suvivor Space。

就这样不断的扫描,最后经过多次扫描发现任然有效的对象会被放入Old Gen表示其生命周期比较长,可以减少垃圾回收时间。

在JDK8之前,类定义、字节码和常量等很少会变更的信息是放在持久代Perm Gen中的。不过在JDK8之后,Perm Gen已经被取消了,现在叫做Metaspace。Metaspace并不在java虚拟机中,它使用的是本地内存。Metaspace可以通过-XX:MaxMetaspaceSize来控制。

Code Cache是JVM用来存储native code的,因为是用Heap的形式来存储的,所以叫Code Heap。Code Heap被分为三个部分,Non-method,Profiled和Non-profiled。

Non-method部分包含的是非方法的code,比如说编译器缓冲区和字节码解释器。这些代码是永久保存在代码缓存区中的。代码堆的大小是固定的。Non-method使用-XX:NonMethodCodeHeapSize来控制。

Profiled部分表示存的是生命周期比较短的稍微优化的profiled methods。Profiled使用–XX:ProfiledCodeHeapSize来控制。

Non-profiled存放的是优化过的,non-profiled方法,并且他们的生命周期会比较长。Non-profiled用-XX:NonProfiledCodeHeapSize来控制。

最后还有一个Compressed Class Space,它是和-XX:+UseCompressedOops,-XX:+UseCompressedClassesPointers有关的。实际上是一个指针的压缩,可以使用32bits来表示之前64bits的指针。

线程

线程列出了程序目前正在运行的线程,如果点击具体的线程信息还可以看到线程中的堆栈跟踪和线程状态统计,非常有用。

类很简单,显示了加载的类的个数。

VM信息

VM信息展示了虚拟机相关的一些参数。

MBean

最后,MBean暴露了JVM中的一些Bean,我们可以查看这些bean的信息或者调用Bean中的方法。

以我们之前讲过的JFR为例,我们可以调用JFR的startRecording,stopRecording等方法。

总结

JConsole是一个比较简单但是也很实用的profile工具,希望大家能够在编写代码之余,多多考虑代码的性能和效率。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jdk14-jvm-jconsole/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

JDK14性能管理工具:Jconsole详解的更多相关文章

  1. Linux命令工具 top详解

    Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...

  2. Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区

    Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区 Lua包管理工具Luarocks详解

  3. [转]网络性能评估工具Iperf详解(可测丢包率)

    原文链接:安全运维之:网络性能评估工具Iperf详解:http://os.51cto.com/art/201410/454889.htm 参考博文:http://linoxide.com/monito ...

  4. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

  5. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  6. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  7. 批量执行工具PSSH详解

    批量执行工具PSSH详解 pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,使用必须在各个服务器上配置好密钥认证访问. 安装pssh包 yum 安 ...

  8. 自动化运维工具——ansile详解

    自动化运维工具——ansible详解(一) 目录 ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ...

  9. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  10. (总结)Linux下的暴力密码在线破解工具Hydra详解

    (总结)Linux下的暴力密码在线破解工具Hydra详解 学习了:https://blog.csdn.net/yafeichang/article/details/53502869

随机推荐

  1. OSG开发笔记(二十九):OSG加载模型文件、加载3DMax三维型文件Demo

    前言   Osg深入之后需要打开模型文件,这些模型文件是已有的模型文件,加载入osg之后可以在常见中展示模型文件,该节点可以操作,多个逼真的模型的节点就实现了基本的场景构建.   Demo      ...

  2. mac更新系统后,提示xcrun的错误问题

    pycharm运行代码终端报错: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), ...

  3. BIGO 的数据管理与应用实践

    本文首发于 Nebula Graph Community 公众号 本文整理自 BIGO 在 nMeetp 上的主题分享,主要介绍 BIGO 过去一年在数据管理建设方面的理解和探索.而 BIGO 数据管 ...

  4. ArrayList学习总结

    1.ArrayList简介[1] ArrayList实现了List接口.ArrayList的方法实现和vector相似,只是线程不安全的. ArrayList的 size.isEmpty.get.se ...

  5. Java 从键盘上输入"year"“month”和“day”,要求通过程序输出 输入的日期为第几年的第几天

    1 /** 2 * 编写程序: 3 * 从键盘上输入"year""month"和"day",要求通过程序输出 4 * 输入的日期为第几年的第 ...

  6. 记Okhttp的拦截器导致app崩溃问题

    原文: 记Okhttp的拦截器导致app崩溃问题 - Stars-One的杂货小窝 app对接的后台接口,传参需要加密,获取数据需要解密,于是使用了拦截器去实现,然后发现以下问题: 即使在发起请求的那 ...

  7. KTL 最新版

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL Core ...

  8. Ubuntu 16.04 LAMP(PHP7.0) 环境搭建并测试

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. Android 开发Day2

    我的是小刺猬版本,算是比较新的版本了,还有火烈鸟和蜻蜓版啥的 新建项目(project)点击加号新建就行了.这时我们会选择一个模板作为开发的辅助起点,看上哪个就选哪个就行了.推荐新手选空项目(Empt ...

  10. C#中的For与Foreach循环:一场性能对话与实战解析

    引言 在C#编程实践中,选择适当的循环结构对程序性能至关重要,尤其是在处理大量数据或追求极致运行效率时.本文将深入探讨C#中的两种主要迭代机制--传统的for循环和基于集合迭代器的foreach循环之 ...