Java性能调优:利用JMC分析性能 Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻。 好的分析工具能起到事半功倍的效果,利用分析利器JMC、JFR,可以实现性能问题的准确定位。 Java线上进程很多面临大堆内存,无法dump堆内存快照,如何解决这样的问题,就可以通过JMC结合JFR连接到线上进程做一段时间采集,分析java进程性能问题 ---- 本文主要阐述如何利用JMC分析系统性能 JMC:Java Mission Control JFR:Java Flight Recorder JMC:Java Mission Control JMC打开性能日志后,主要包括7部分性能报告,分别是一般信息 jvm进程信息 图片 查看当前执行的 JFR 任务 图片 新建一个采集 5min的 JFR任务(采集固定时长JFR任务) 图片 查看采集任务状态 # 生成jfr收集文件后可导入JMC进行可视化问题定位
熟悉 JDB 还是有价值的,很多情况下需要我们在命令行下完成简单的 debug 问题定位。 早些时候 JVM 曾经因为开放这样的 debug 端口,遇到远程扫描,虚拟机发生崩溃,参见 bug 链接。 VisualVM 和 JConsole VisualVM 这个工具来自 Netbeans 的项目,JVM 的运行情况一目了然。 JProfiler 和 Optimizeit JProfiler 和 Optimizeit 一样,都是综合性的性能剖析工具,甚至可以分析不同方法的 CPU 时间占用,帮助找出 CPU 热点。 总的来说,通常监控型的工具功能最强大,但是对系统资源要求也很高,对于生产环境上特有的问题,还是多考虑使用一些快照工具,内存和 CPU 占用小,系统中断时间短。
这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题。 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息。 比如,在我的机器上运行 ls 命令,可以看到 JDK 8 提供了非常多的工具或程序: 图片 接下来,我会与你介绍些常用的监控工具。 因此,当我们怀疑 JVM 的配置很不正常的时候,要第一时间使用工具来确认参数。 Java 8、Linux/Unix 平台 jstat 工具的完整介绍,你可以查看这里。jstat 定时输出的特性,可以方便我们持续观察程序的各项指标。 我们明明配置线程栈最大 256KB 啊,为什么会出现 4GB 这么夸张的数字呢,到底哪里出了问题呢?
类加载在底层要加锁的原因也不难理解 ,如上图,如果三个线程并发加载类C,如果没有锁,最后可能会把类的元数据信息,在perm区(JDK8以前的版本,JDK8后取消了Perm区)中存多份,很容易造成内存泄露 technotes/guides/lang/cl-mt.html https://www.cnblogs.com/cz123/p/6918708.html https://www.jianshu.com/p/8e8a5a773648 解决方法: 既然多线程并发加载可能出问题,那么就放在单线程里加载,可参考下面的示例,假设有2个类:Parent及Child package com.cnblogs.yjmyzz.test; public 大多数情况下,java并不推荐重载该方法,因为jvm的GC已经把垃圾回收做得很好了。 三、堆外内存不释放 先回顾下堆外内存的分布,对于DirectByteBuffer之类的对象,JVM堆上只存放了其"引用",如下图,引用指向的实际内存块在JVM堆外(即:实际分配的堆外内存不受GC管控)
Eden取呈现折线状: Eden区空间为27328KB 未设置-XX:SurvivorRadio参数,默认为8:1,所以新生代空间为27328KB*125% = 34160K ? 显示虚拟机进程和进程的配置,环境信息 监视应用程序的CPU,GC,堆,方法区和线程信息 dump以及分析heapdump文件 方法级的程序运行性能分析 离线程序快照:收集程序的运行时配置,线程dump,
最近碰到一个Oracle DG备库延迟的问题,经过排查,定位是磁盘性能问题,用的是普通磁盘,而不是SSD,且性能较差,存在读写等待。 关于定位磁盘的性能问题,可以有很多第三方或者原生工具的支持,Linux自带的iostat就是其中之一。 iostat指令是Linux/Unix系统上的一个性能分析工具,可以用来监控系统的I/O性能,包括了CPU利用率、磁盘读写速度、网络吞吐量等。 iostat可以实时输出系统的I/O性能信息,也可以按照一定的时间间隔输出统计信息。 iostat带上各种参数,即可以进行磁盘的性能验证,例如, iostat -xdm 1 iostat的常用选项如下, -c:显示CPU利用率相关的信息; -d:显示磁盘I/O相关的信息; -n:显示网络
定位性能问题,尤其是cpu使用率过高时,经常需要查找cpu消耗较高的线程,然后查看其堆栈,从而进入代码定位问题。 该场景下, jstack+top是一种非常经典的方式。
从上图可以发现,“3 problems detected”,即识别出 3 个内存问题。 3. 在线 GC 可视化视图解读 1)JVM memory size(JVM 内存大小) ? 3)Interactive Graphs(GC 前后堆区大小变化视图) 为了更好的了解 GC 垃圾回收对应的区域,可以参考这篇文章【从 Java 代码如何运行聊到 JVM 和对象的创建-分配-定位-布局 无内存泄漏 8)Safe Point Duration(安全点期间) ? 日志没有记录。 小结 通过三步法定位线上环境 JVM 问题,如频繁 Full GC 、内存泄漏或发生 OOM 现象,即将 GC 日志、Dump 文件及 APM 监控系统结合在一起观察分析,寻找出问题产生的根本原因,然后才能对症下药 ,真正解决系统存在的问题或是隐患,使系统性能更稳健,响应更快,从而使用户体验更佳。
你可能一开始会比较畏惧使用复杂的工具去排查问题,又或者是打开了工具感觉无从下手,但是随着实践越来越多,对 Java 程序和各种框架的运作越来越熟悉,你会发现使用这些工具越来越顺手。 这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题。 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息。 比如,在我的机器上运行 ls 命令,可以看到 JDK 8 提供了非常多的工具或程序: 接下来,我会与你介绍些常用的监控工具。 Java 8、Linux/Unix 平台 jstat 工具的完整介绍,你可以查看这里。jstat 定时输出的特性,可以方便我们持续观察程序的各项指标。 我们明明配置线程栈最大 256KB 啊,为什么会出现 4GB 这么夸张的数字呢,到底哪里出了问题呢?
DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-<em>8</em>'> <meta name='viewport' content='width 有兴趣的朋友可以用某些网站查看一些performance,看看自己的掌握程度,有<em>问题</em>欢迎讨论。 DOMContentLoad的时候会触发之前绑定的事件,而且没有在主线程中显示 总结 本文简单的说了两个点,一是network的timing栏,二是performance panel,只要掌握了这两个功能的使用方法,就可以快速<em>定位</em>网站<em>性能</em><em>问题</em> 两个点:一个头信息压缩,二是解决了队头阻塞<em>问题</em>,三是增加了服务端push。 ,还是不够完善的,我们需要知道真实的用户环境下是怎么样的,需要RUM(Real User Monitoring: 真实用户数据监测),写个脚本来收集用户的访问情况,并可视化,作为我们的<em>性能</em>指标再好不过了
GC 的参数 JVM在GC的控制参数中,有一个GC前进行校验的参数,在校验过程中当发生地址异常的化会打印出异常的地址,并且让JVM crash,因为这个参数每一次GC都要检查,包括新生代的GC,影响一定的性能 JMV提供的SA工具 JVM提供的HSDB工具是一款非常好的工具,通过工具能查看和分析运行中的JVM的heap对象,当然也可以常看core dump, 但问题是HSDB是有UI界面的,我们在linux系统中通常没有 (在JVM里经常会内部修改一些类的内部结构用于记录状态,但是又不能被Java应用修改) 但是有点不对,刚才不是地址是 0x0000000410bc55c0,怎么现在变成了0x0000000782178ab8 MethodHandler 虽然我们找到了JVM crash问题的根因,但我们还需要继续深入的找到谁才是罪魁祸首,就是JVM为何会调整vmtarget的值 分析谁调用了adjust_vmtarget函数即可 JVM提供了环境参数可以控制是否压缩指针 -XX:+UseCompressedOops 这样一个完成的通过JVM crash 日志和core dump进行JVM的问题定位和分析结束了,希望能对你有所帮助
第二节jvm公开课课, 主要介绍了一个知识点. 那就是线上发生OOM, 如何定位 1. top命令, 线上查看cpu和内存的使用情况 2. jstack 进程号 查看当前进程有哪些线程 初步定为排查线程的健康状况, 如果有很多线程处于等待状态 很重要的一个方面, 加日志. ---- 常见的GC问题 1. java启动时如何设置jvm的日志 java -Xloggc:/root/1.txt 这个命令是把jvm日志打印到/root/1 : 滚动生成日志也存在一定的问题, 有可能你要查看的日志已经被删除了. 看看哪些类实例最多, 这样内存和cpu居高不下. ---- 扩展阅读 整理这个文件的时候, 想起之前同事整理的一篇在spring cloud环境下,如何通过spring boot actuator来定位线上问题
概述 性能优化一向是后端服务优化的重点,但是线上性能故障问题不是经常出现,或者受限于业务产品,根本就没办法出现性能问题,包括笔者自己遇到的性能问题也不多,所以为了提前储备知识,当出现问题的时候不会手忙脚乱 ,我们本篇文章来模拟下常见的几个Java性能故障,来学习怎么去分析和定位。 预备知识 既然是定位问题,肯定是需要借助工具,我们先了解下需要哪些工具可以帮忙定位问题。 这里dump信息直接定位出了问题方法以及代码行,这就定位出了CPU占满的问题。 总结 本文模拟了常见的性能问题场景,分析了如何定位CPU100%、内存泄漏、死锁、线程频繁切换问题。分析问题我们需要做好两件事: 掌握基本的原理 借助好工具。
而对于不同的表结构,采用不同的SQL语句,性能上可能千差万别。本文,就基于MySql数据库,来介绍一下如何定位SQL语句的性能问题。 对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划。 key_length 索引长度char()、varchar()索引长度的计算公式: (Character Set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列长度 + 1(允许 ; name 索引长度为:编码为utf8mb4,列长为128,不允许为NULL,字段类型为varchar(128)。 简化SQL语句的重要方法就是采用临时表暂存中间结果,这样可以避免程序中多次扫描主表,也大大减少了阻塞,提高了并发性能。
对性能测试的工程师来说,top命令式是非常有用的,我在另外一篇文章“老李分享:应用程序性能瓶颈定位方法和原理”,里面提供了一个案例,来帮助我们进行性能定位。 2. 它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。 8.Iostat-输入/输出统计 Iostat是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。 这个工具常常用来追踪存储设备的性能问题,其中存储设备包括设备、本地磁盘,以及诸如使用NFS等的远端磁盘。 它可以危险警告并指出系统/服务器是否有异常,这可以间接帮助你在问题发生之前采取抢救措施。
这里的cpu使用率与linux 命令top-H-p<pid>的线程%CPU类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。 使用参考 当前最忙的前N个线程并打印堆栈: 没有线程ID,包含[Internal]表示为JVM内部线程,参考dashboard命令的介绍。 - thread –all, 显示所有匹配的线程 显示所有匹配线程信息,有时需要获取全部JVM的线程数据进行分析。 为了排查这类问题, arthas提供了thread-b, 一键找出那个罪魁祸首。
这时候,你多么希望能有一个好用的工具来帮你快速定位问题所在!别担心,今天我要介绍的 Netdata 就非常不错。Netdata 是一个实时系统监控工具,可以帮助你在遇到性能问题时迅速找到解决方案。 它不仅可以监控硬件层面的各种指标(如 CPU、内存、磁盘使用率),还可以监控各种应用程序和服务的性能指标。通过简洁直观的可视化界面,你可以一目了然地了解系统的运行状态。 实时性:Netdata 每秒更新一次数据,确保你能够及时发现和解决问题。轻量级:占用资源极少,不会对系统造成额外负担。易用性:安装简单、配置方便,适合所有技术水平的用户。 开箱外警报附带数百个开箱即用的警报,用于检测常见问题和陷阱,揭示容易被忽视的问题。它支持多种通知方法,让您知道何时需要您的关注。 希望这篇文章能帮助你在遇到性能问题时迅速找到解决方案!
Java Flight Recorder(JFR)是 JDK 内置的一个性能分析和事件收集框架。 JVM 刷新间隔(用于检测新 JVM)现在可以通过 Preferences | JDK Mission Control | JVM Browser | Local 进行配置。 默认情况下,JMC 每 5000 毫秒检测一次新 JVM。 JFR 分析器的性能通过减少分配数量得以提升。 现在,该视图基于以 Swing 为基础的解决方案进行了实现,性能有所提升。 JMC 现在允许在 GraalVM 原生镜像上启动飞行记录,这在以前是不可能的。 xml version="1.0" encoding="UTF-8"?
CentOS 7.4 Python版本 :3.6 Django版本: 1.10.5 操作系统用户:oms 数据处理:pandas 前端展示:highcharts 上周我们通过一周的时间讲述了如何监控数据库的性能趋势并找出具体的语句 Oralce性能状态趋势(天) 首先是整体的趋势,以天为单位,这样我们才会对我们维护的数据库了然于心 ? 在这里我们可以看到每天的情况,对于某天的异常我们继续下一步查看更详细的 2.Oracle性能状态趋势(小时) 这里我们观察到每天各个时间段的情况,定位到具体的时间点 ? 定位到时间点后我们可以通过TOP SQL 界面定位到语句 3. 查找各个时间段的TOP 语句和等待事件 也可以查找这个时间段的等待事件 ? ?
性能测试工作实质上是通过程序或者工具模拟大量用户操作来验证系统承载能力,找出潜在的性能问题,分析并解决这些问题;找出系统性能变化趋势,为后续的性能扩展提供参考。 代码问题通常集中在事务、多线程、通信、存储及算法方面。测试人员可以不必去写一段优秀的代码,但要能够定位问题到代码段。架构高性能的系统架构与普通系统架构也不一样。 有些可以通过调整中间件的配置来改善系统性能,比如用户请求过多,可以适当增大线程池;当JVM内存回收,特别是Full GC过于频繁时,我们就要分析到底是哪些程序导致了大量的 Heap(堆)内存申请;当CPU 过于繁忙时,我们会去分析哪个线程占用了大量 CPU资源,通过线程信息定位到程序。 这些都是常见的分析方法,也容易掌握,掌握这些分析方法能够解决 80%以上的性能定位问题。操作系统操作系统统筹管理计算机硬件资源,针对不同业务,不同场景也会有一些可以优化的参数。