Day04_JVM实战

news2024/11/13 9:02:00

文章目录

  • 一、gc日志和dump快照
    • GC日志是什么,要怎么看?
    • dump快照是什么?要怎么看?
  • 二、gc日志和dump快照实战
    • java.lang.OutOfMemoryError:Java heap space
      • 1、gc.log怎么看
      • 2、heapdump.hprof怎么看?
        • ①jvisualvm查看
        • ②使用MAT查看
    • java.lang.OutOfMemoryError:Metaspace
      • 1、实时分析—jstat
      • 2、实时分析—jvisualvm
      • 3、离线分析—gc.log
      • 4、离线分析—dump快照
    • java.lang.OutOfMemoryError:GC overhead limit
    • java.lang. stackoverflowError
  • 三、java命令行工具
      • jps
      • jstat
        • jstat -gc 10376 1000 10
        • jstat -gcutil 6384 1000 30
        • -t参数分析垃圾回收的时间占比
        • jstat还可以用来判断是否出现内存泄漏。
      • jinfo
        • jinfo -flags xxx
      • jmap
        • jmap -dump 导出堆内存日志
        • jmap -heap xxx 显示堆内存信息
        • jmap histo xxx 显示
      • jhat
      • jstack
        • jstack pid 线程诊断
      • jcmd
  • 四、面试必问(异常类)
      • 内存泄露和内存溢出的关系?
      • 内存泄露的几种情况
      • JVMOOM问题如何排查和解决?
      • java.lang.OutOfMemoryError: Java heap space堆内存溢出问题如何排查和解决?
      • 如果JVM出现频繁FullGC该如何解决
      • 我实际遇到的内存泄露:
      • 线上OOM、CPU预警、内存预警问题排查的步骤?(宏观谈)
      • OOM、CPU预警、内存预警之类的问题具体排查步骤:
          • 第一步:查看硬件的资源
          • 第二步、使用实时分析工具
          • 第三步,离线分析
      • 线上的 API 接口响应比较慢,该如何快速排查和定位问题?
      • 线程诊断_CPU占用过高
      • 线程诊断_迟迟得不到结果
      • MySQL 数据库cpu 飙升的话,要怎么处理呢?
      • 数据库出现死锁如何排查?
  • 五、面试必学(调优类)
      • GC 调优
      • 如何进行GC调优?
          • 1. 新生代调优
          • 2. 幸存区调优
          • 3. 老年代调优
      • GC调优的案例
  • 六、JVM性能优化案例
      • 案例1:调整堆大小提高服务的吞吐量
      • 案例2:如何调整堆内存?/ 生产环境该给服务器分配多少内存?
      • 案例3:调整垃圾回收器,提高服务吞吐量
      • 案例4:服务器升级后为什么卡顿十分严重?

一、gc日志和dump快照

当服务发生堆内存溢出时,你可以从系统里面拿到两类日志:一个是gc日志,另一个是dump快照
gc日志可以直接看(不推荐),但是直接看晦涩难懂,建议用GCEasy去分析
dump快照是二进制文件,你想直接看也看不懂,所以你需要借助JvisualVm、MAT、Jprofile等专业工具分析
上面都是离线分析。

我们可以用JvisualVm、MAT、Jprofile连上我们的idea进行实时监控堆内存然后实时分析,但是这个在生产环境中不适用;
生产环境发生堆内存溢出时我们拿到gc日志和dump快照然后进行离线分析;
也就是说,对于dump快照和gc日志而言,我们生产环境主打的就是离线分析。

jinfo、jstat、jmap这些命令行工具有啥用?我们能用JvisualVm、MAT、Jprofile去图像分析,那为啥要学这些命令行?
JvisualVm、MAT、Jprofile是分析dump快照的,但是我如果想知道①生产环境堆内存大小是多少?②生产环境老年代使用了多少了?是否快发生堆内存溢出了?③生产环境出现死锁了④生产环境cpu过高 等等问题,你是只能用命令行去解决的

GC日志是什么,要怎么看?

添加如下的启动参数-XX:+PrintGCDetails -XX:+PrintGCDataStamps -XLoggc:./logs/gc.log

-XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配的情况
-XX:+PrintGCDataStamps GC发生时输出时间戳
-XLoggc:./logs/gc.log 把GC日志写入到一个文件里面去

这里是引用

上面的gc.log可以到GcEasy官网去分析

Minor GC日志该怎么看?(了解)
以下内容来自别的视频

这里是引用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Full GC日志该怎么看?(了解)
以下内容来自别的视频

Full GC由于包括了新生代、老年代、元空间等,所以它的日志很长

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

dump快照是什么?要怎么看?

dump快照是二进制文件,你想直接看也看不懂,所以你需要借助JvisualVm、MAT、Jprofile等专业工具分析

Jconsole
略,这个工具不如JvisualVm、MAT、Jprofile

JvisualVM

JvisualVM怎么分析我们后面慢慢讲,我们先说一下它怎么安装插件

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MAT
MAT可以分析heap dump文件。在进行内存分析时,只要获得了反映当前设备内存映像的hprof文件,通过MAT打开就可以直观地看到当前的内存信息。

面试问答:MAT里面能看到哪些内存信息?

  • 所有的对象信息,包括对象实例、成员变量、存储于栈中的基本类型值和存储于堆中的其他对象的
    引用值。
  • 所有的类信息,包括classloader、类名称、父类、静态变量等.
  • GCRoot到所有的这些对象的引用路径
  • 线程信息,包括线程的调用栈及此线程的线程局部变量(TLS)

Jprofile
Jprofile是收费的,所以Jprofile更强大,它支持实时分析正在运行的程序,也支持离线对dump文件的分析

这个工具就先不介绍了,老师课程里面都是实时分析,但是我们真实生产环境要的是离线分析,而且JvisualVm、MAT使用的更多一些

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其它工具

还有JMC、Flame Graphs 、Tprofiler 、 Btrace 、YouKit、JProbe、Spring Insight等工具

二、gc日志和dump快照实战

对于gc日志和dump快照怎么看,我们必须依赖案例来去了解JvisualVm、MAT、GCEasy这些工具的使用,离开案例都是耍流氓。

java.lang.OutOfMemoryError:Java heap space

jvm参数配置:

-Xms50M -Xmx50M -XX:MetaspaceSize=64M
-XX:+PrintGCDetails -XX:+PrintGCDataStamps -XLoggc:./logs/gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=heap/heapdump.hprof


-Xms50M -Xmx50M 这两个参数保证你的堆内存足够小能够发生堆内存溢出
-XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配的情况
-XX:+PrintGCDataStamps GC发生时输出时间戳
-XLoggc:./logs/gc.log 把GC日志写入到一个文件里面去,方便后面分析
-XX:+HeapDumpOnOutOfMemoryError 保证当服务器出现堆内存溢出时能够把当前的堆使用情况记录下来(这个很关键,你要是没有这个参数就不会记录当时的堆内存情况。这就好比是一个人被杀了,临死之前拍了一段录像一样。)
-XX:HeapDumpPath=heap/heapdump.hprof 保证当服务器出现堆内存溢出时能够把当前的堆使用情况记录到heap目录下的heapdump.hprof 文件中(这就好比是一个人被杀了,临死之前拍了一段录像,然后把录像放到某个柜子里)

这里是引用
在这里插入图片描述

经过上面堆内存参数的配置,发生堆内存溢出后你本地会有两个文件gc.log和heapdump.hprof
gc.log记录了gc情况,可以到GcEasy官网去分析
heapdump.hprof记录了堆内存情况,借助jvisualvm工具或MAT工具分析

1、gc.log怎么看

gc.log怎么看?

在这里插入图片描述
在这里插入图片描述

GcEasy

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面为其它视频讲解的内容

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其它GC日志分析的工具
GCViewer

这里是引用
在这里插入图片描述

还有GChisto

2、heapdump.hprof怎么看?

①jvisualvm查看

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


备注:下面的截图来自另一个视频这里是引用> 在这里插入图片描述

②使用MAT查看

MAT是Eclipse自带的工具,可以单独安装,而且MAT是专门做堆内存分析的,功能比JvisualVM更强大

说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


备注:下面的图来自其它视频
在这里插入图片描述

这里是引用

Histogram直方图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内存泄露情景之一:有些对象生命周期本身没有必要那么长,但是由于外面有对象引用它了,导致它迟迟不能回收
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

thread overview
thread overview可以查看系统中的所有的Java线程,也可以查看到线程里面局部变量的信息
线程对应一个独立的栈,栈里面保存着栈帧(局部变量)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

支配数

这里是引用
在这里插入图片描述

概览

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

OQL语句

在这里插入图片描述
在这里插入图片描述

java.lang.OutOfMemoryError:Metaspace

这段代码是个死循环,期间它创建了大量代理类导致方法区被撑爆,而你元空间内存设置的过小-XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=60m

这里是引用

1、实时分析—jstat

因为代码是死循环所以一直在运行,上面代码程序运行时,你可以使用jstat分析

在这里插入图片描述

jstat -gc 10376是查看当前进程gc的信息,jstat -gc 10376 1000 10是每1000ms(每1秒)打印一次,一共打印10次

在这里插入图片描述
在这里插入图片描述

可以看到,FullGC非常频繁,而且我们的方法区,占用了58729KB/1024= 57.8M空间,你JVM参数里面方法区设置的是60M,几乎把整个方法区空间占用,所以得出的结论是方法区空间设置过小,或者存在大量由于反射生成的代理类。

2、实时分析—jvisualvm

因为代码是死循环所以一直在运行,上面代码程序运行时,你可以使用jvisualvm分析

在这里插入图片描述

3、离线分析—gc.log

因为你加了-XX:+PrintGCDetails -XX:+PrintGCDataStamps -XLoggc:./logs/gc.log这些jvm参数,所以-XLoggc:./logs/gc.log 把GC日志写入到一个文件里面去,你查看这个文件可以看到频繁发生Full GC

在这里插入图片描述

使用GcEasy查看这个gc.log

在这里插入图片描述

4、离线分析—dump快照

因为你加了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap/heapdumpMeta.hprof这些jvm参数,所以你可以分析生成的dump文件

-XX:+HeapDumpOnOutOfMemoryError 保证当服务器出现堆内存溢出时能够把当前的堆使用情况记录下来(这个很关键,你要是没有这个参数就不会记录当时的堆内存情况。这就好比是一个人被杀了,临死之前拍了一段录像一样。&#x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2146303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动技术开发:登录注册界面

1 实验名称 登录注册界面 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayoutxmlns:android"http://schemas.android.com/apk/…

游戏客服精华回复快捷语大全

以黑神话悟空为代表的国内的游戏行业&#xff0c;最近发展非常迅猛&#xff0c;大量游戏玩家需要足够的游戏客服支持&#xff0c;这里整理了游戏客服精华回复快捷语&#xff0c;涵盖了接待客户&#xff0c;游戏级数&#xff0c;游戏外挂&#xff0c;游戏要求&#xff0c;游戏特…

SAP SPROXY 配置

事务码SPROXY 然后找到目标的地址 然后创建新对象即可

【数据结构】排序算法---计数排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaGo 结语 1. 定义 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。计数排序不是基于比较的排序算法&#xff0c;其核心在于将输入的数据值转化为键存储在额外开辟的数组…

AIGC时代!AI的“iPhone时刻”与投资机遇

AIGC时代&#xff01;AI的“iPhone时刻”与投资机遇 前言AI的“iPhone时刻”与投资机遇 前言 AIGC&#xff0c;也就是人工智能生成内容&#xff0c;它就像是一股汹涌的浪潮&#xff0c;席卷了整个科技世界。它的出现&#xff0c;让我们看到了人工智能的无限潜力&#xff0c;也…

从北大张泽民院士团队的研究成果中寻找医学AI未来的发展方向|个人观点·24-09-19

小罗碎碎念 如果有人问&#xff0c;“从你熟悉的院士中挑选一个&#xff0c;你最先想到的会是谁&#xff1f;“&#xff0c;我会毫不犹豫的回答&#xff1a;张泽民 昨晚一边在操场锻炼&#xff0c;一边在手机里听着一个哈佛的博士直播做报告。听报告的同时&#xff0c;脑子里在…

Android Studio报错: Could not find pub.devrel:easypermissions:0.3.0, 改用linux编译

在Android studio中去编译开源的仓库&#xff0c;大概率就是各种编译不过&#xff0c;一堆错误&#xff0c;一顿改错&#xff0c;基本上会耗费非常多时间&#xff0c;比如&#xff1a; 这个就是改gradle版本&#xff0c;改成7.2 &#xff0c;修改完成之后&#xff0c;还有其他报…

秋招面试注意了!网络安全工程师面试最怕遇到的问题,很多人都经历过!

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

培养关键职业技能,提升个人竞争力

文章目录 一、为什么要培养职业技能&#xff1f;1、提升个人竞争力2、提高工作效率和质量3、适应职业发展变化4、增加收入 二、关键职业技能概述1、专业技术能力2、问题解决能力3、沟通交流能力4、团队合作能力5、领导意识能力6、适应变化能力 三、结语 在当今快速发展的社会中…

react的组件的概念和使用

文章目录 1. **组件的定义****函数组件****类组件** 2. **组件的生命周期**3. **状态管理****类组件中的状态管理****函数组件中的状态管理** 4. **组件之间的通信****通过 Props 传递数据****上下文&#xff08;Context&#xff09;** 5. **组件的样式**6. **处理表单**7. **错…

[SAP ABAP] 修改内表数据

1.利用关键字修改数据 语法格式 MODIFY TABLE <itab> FTOM <wa> [TRANSPORTING f1 f2...].<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 示例1 内表修改前的数据 将上述数据行中的AGE字段值更改为25&#xff0c;SEX字段值更改为女 输出结…

基于windows下docker安装HDDM并运行

安装主要教程 如何安装HDDM(基于windows下 docker 和 linux) | 传鹏的实验室 (chuan-peng-lab.netlify.app) 安装时遇到的问题 1.下载完docker安装包&#xff0c;安装提示不适合本电脑 解决办法&#xff1a; 第一步&#xff1a;开启CPU虚拟化 Windows电脑如何开启CPU虚拟化…

JS全选反选案例

我们在进行网页制作的时候&#xff0c;通常会用到复选框&#xff0c;而复选框外面往往有一个大的勾选框来&#xff0c;控制里面的框是否全部选择&#xff0c;而里面的小复选框同时也是在控制着外面大的选择框&#xff0c;当里面全选的时候&#xff0c;外面的也会勾选上&#xf…

2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模 D题 汽车总装线的配置问题 一&#xff0e;问题背景   某汽车公司生产多种型号的汽车&#xff0c;每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种&#xff0c;配置分为B1、B2、B3、B4、B5和B6六种&#xff0c;动力分为汽油…

自制数据库迁移工具-C版-04-HappySunshineV1.4-(支持Gbase8a、PG)

目录 一、环境信息 二、简述 三、架构图 四、升级点 五、支持功能 六、安装包下载地址 七、配置参数介绍 八、安装步骤 1、配置环境变量 2、生效环境变量 3、检验动态链接是否正常 4、修改配置文件MigrationConfig.txt &#xff08;1&#xff09;Gbase8a -> Gba…

机器学习模型中特征贡献度分析:预测贡献与错误贡献

在机器学习领域&#xff0c;特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系&#xff0c;并引入两个关键概念&#xff1a;预测贡献度和错误贡献度。 核心概念 预测贡献度&#xff1a;衡量特征在…

【w0网页制作】Html+Css网页制作影视主题之庆余年Ⅱ含轮播表单(5页面附源码)

庆余年2HTMLCSS网页开发目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果效果1、轮播效果图Page1、首页Page2、角色介绍Page3、剧情介绍Page4、剧集评价Page5、留言模块 &#x1f40b;三、网页架构与技术3.1 脑海构思3.2 整…

集装箱机房可视化:高效管理与监控

通过图扑可视化平台实时监控集装箱机房的运行状态和环境参数&#xff0c;优化资源配置&#xff0c;提升运维效率&#xff0c;确保数据中心安全可靠运行。

Java面试篇基础部分-Java中5种常用的线程池

Java中定义了一个Executor的接口并且在接口中定义了execute()方法用来执行一个线程任务。然后通过ExecutorService实现了Executor接口用来执行具体的线程操作。 ExecutorService接口实现了多个类用来创建不同的线程池,其中最常见的线程池有如下几种 newCachedThreadPool 可以缓…

工业一体机在汽车零部件工厂ESOP系统中的关键作用

在当今竞争激烈的汽车市场中&#xff0c;汽车零部件工厂的高效生产和严格质量控制至关重要。而工业一体机在汽车零部件工厂的 ESOP&#xff08;电子标准化作业程序&#xff09;系统中发挥着关键作用。 一、汽车零部件工厂面临的挑战 汽车零部件的生产过程复杂且要求严格&#…