JVM调优手段

news2024/12/23 16:46:39

JDK提供命令工具

jstat

是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

语法:

jstat -option pid

其中option参数有如下:
-class (类加载器)
-compiler (JIT)
-gc (GC 堆状态)
-gccapacity (各区大小)
-gccause (最近一次 GC 统计和原因)
-gcnew (新区统计)
-gcnewcapacity (新区大小)
-gcold (老区统计)
-gcoldcapacity (老区大小)
-gcpermcapacity (永久区大小)
-gcutil (GC 统计汇总)
-printcompilation (HotSpot 编译统计)

查看GC情况命令:

jstat -gc pid 250 10

最后两个参数代表250毫秒查询一次,一共查询10次。
返回值列含义:
S0C:第一个幸存区(From 区)的大小
S1C:第二个幸存区(To 区)的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:(Eden)区的大小
EU:(Eden)区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

jinfo

查看和修改虚拟机的参数。
查看生产环境程序是否打印GC日志命令如下:

 jinfo -flag PrintGC java进程Id

输出-XX:-PrintGC 是关闭状态,输出-XX:+PrintGC是开启状态。

动态开启GC日志命令:

 jinfo -flag +PrintGC java进程Id

动态关闭GC日志命令:

 jinfo -flag -PrintGC java进程Id

jmap

用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。和 jinfo 命令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了生成 dump 文件的-dump 选项和用于查看每个类的实例、空间占用统计的-histo 选项在所有操作系统都提供之外,其余选项都只能在 Linux/Solaris 下使用。

打印heap概要信息:

jmap –heap <pid>

返回值含义:
Heap Configuration: ##堆配置情况,也就是 JVM 参数配置的结果[平常说的 tomcat 配置 JVM 参数,就是在配置这些]
MinHeapFreeRatio = 40 ##最小堆使用比例
MaxHeapFreeRatio = 70 ##最大堆可用比例
MaxHeapSize = 2147483648 (2048.0MB) ##最大堆空间大小
NewSize = 268435456 (256.0MB) ##新生代分配大小
MaxNewSize = 268435456 (256.0MB) ##最大可新生代分配大小
OldSize = 5439488 (5.1875MB) ##老年代大小
NewRatio = 2 ##新生代比例
SurvivorRatio = 8 ##新生代与 suvivor 的比例
PermSize = 134217728 (128.0MB) ##perm 区 永久代大小
MaxPermSize = 134217728 (128.0MB) ##最大可分配 perm 区 也就是永久代大小
Heap Usage: ##堆使用情况【堆内存实际的使用情况】
New Generation (Eden + 1 Survivor Space): ##新生代(伊甸区 Eden 区 + 幸存区 survior(1+2)空间)
capacity = 241631232 (230.4375MB) ##伊甸区容量
used = 77776272 (74.17323303222656MB) ##已经使用大小
free = 163854960 (156.26426696777344MB) ##剩余容量
32.188004570534986% used ##使用比例
Eden Space: ##伊甸区
capacity = 214827008 (204.875MB) ##伊甸区容量
used = 74442288 (70.99369812011719MB) ##伊甸区使用
free = 140384720 (133.8813018798828MB) ##伊甸区当前剩余容量
34.65220164496263% used ##伊甸区使用情况
From Space: ##survior1 区
capacity = 26804224 (25.5625MB) ##survior1 区容量
used = 3333984 (3.179534912109375MB) ##surviror1 区已使用情况
free = 23470240 (22.382965087890625MB) ##surviror1 区剩余容量
12.43827838477995% used ##survior1 区使用比例
To Space: ##survior2 区
capacity = 26804224 (25.5625MB) ##survior2 区容量
used = 0 (0.0MB) ##survior2 区已使用情况
free = 26804224 (25.5625MB) ##survior2 区剩余容量
0.0% used ## survior2 区使用比例
PS Old Generation: ##老年代使用情况
capacity = 1879048192 (1792.0MB) ##老年代容量
used = 30847928 (29.41887664794922MB) ##老年代已使用容量
free = 1848200264 (1762.5811233520508MB) ##老年代剩余容量
1.6416783843721663% used ##老年代使用比例

打印每个 class 的实例数目,内存占用,类全名信息.命令如下:

jmap –histo <pid>
jmap –histo:live <pid>  #如果 live 子参数加上后,只统计活的对象数量.
jmap –histo pid | head -20  #只显示前20

生成堆的dump文件命令:

jmap -dump:live,format=b,file=heap.bin <pid>

jhat

加载dump文件命令:

jhat dump 文件名

后屏幕显示“Server is ready.”的提示后,用户在浏览器中键入http://localhost:7000/就可以访问详情
在这里插入图片描述
使用 jhat 可以在服务器上生成堆转储文件分析(一般不推荐,毕竟占用服务器的资源,比如一个文件就有 1 个 G 的话就需要大约吃一个 1G 的内存资源)。
dump是内存快照,可以通过dump文件查看.

jstack

一般来说 jstack 主要是用来排查是否有死锁的情况.

JVM调优方案

开启相关参数

-XX:-HeapDumpOnOutOfMemoryError 默认关闭,建议开启,在java.lang.OutOfMemoryError 异常出现时,输出一个 dump 文件,记录当时的堆内存快照。

-XX:HeapDumpPath=./java_pid.hprof 用来设置堆内存快照的存储文件路径,默认是 java 进程启动位置。

Arthas

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断.
这里只简单介绍其有哪些功能,具体使用需在实战中体会。

dashboard命令,面板功能如下:
在这里插入图片描述
thread命令:
这个命令和 jstack 很相似,但是功能更加强大,主要是查看当前 JVM 的线程堆栈信息。同时可以结合使用 thread –b 来进行死锁的排查死锁。

参数解释:
-n 指定最忙的前 n 个线程并打印堆栈
-b 找出阻塞当前线程的线程
-i 指定 cpu 占比统计的采样间隔,单位为毫秒。

jad命令:
反编译指定已加载类的源码,需写明类全路径名,可以反编译出class源码,在生产环境可排查问题。

trace命令:
使用 trace 命令可以跟踪统计方法耗时。

命令汇总:
在这里插入图片描述
在这里插入图片描述

选择合适垃圾回收器

默认垃圾回收器STW时间较长,对于高性能系统,可以使用CMS或G1垃圾回收器,减少STW时间,提高性能。

GC调优策略

  • 降低 Minor GC 频率
    由于新生代空间较小,Eden 区很快被填满,就会导致频繁 Minor GC,因此我们可以通过增大新生代空间来降低 Minor GC 的频率。单次 Minor GC 时间是由两部分组成:T1(扫描新生代)和 T2(复制存活对象)。

在 JVM 中,复制对象的成本要远高于扫描成本。如果在堆内存中存在较多的长期存活的对象,此时增加年轻代空间,反而会增加 Minor GC 的时间。如果堆中的短期对象很多,那么扩容新生代,单次 Minor GC 时间不会显著增加。因此,单次 Minor GC 时间更多取决于 GC 后存活对象的数量,而非 Eden区的大小。

  • 降低 Full GC 的频率
    由于堆内存空间不足或老年代对象太多,会触发 Full GC,频繁的 Full GC 会带来上下文切换,增加系统的性能开销。通过减少创建大对象和增大堆内存空间来减少Full GC频率。

内存溢出与内存泄漏的区别

内存溢出: 单纯就是内存不够用了,通常报错Out of Memory。

内存泄漏: 没有用的对象在内存中无法通过gc清除,一直占用内存空间,称之为内存泄漏。内存泄漏不一定会内存溢出,但是一直泄露,最终一定会内存溢出。

CPU过高问题排查

  1. 使用top命令,查出CPU高的java进程pid。
  2. 使用top -p pid命令,单独查看步骤1找到的进程。
  3. 在步骤2监控界面输入H,获取当前进程下所有线程信息。
    在这里插入图片描述
  4. 找到消耗CPU特别高的线程编号
  5. 执行jstack pid命令,对当前进程做dump,输出所有线程信息。
  6. 将步骤4得到的线程编号转为16进制。
  7. 根据第6步得到的线程编号在第5步线程信息里找对应线程内容
  8. 解读线程信息,定位具体代码位置。
    在这里插入图片描述
    总结:
    如果 CPU 的 100%,要从两个角度出发,一个有可能是业务线程疯狂运行,比如说想很多死循环。还有一种可能性,就是 GC 线程在疯狂的回收,因为 JVM 中垃圾回收器主流也是多线程的,所以很容易导致 CPU 的 100%

Out of Memory问题排查

内存溢出一般都是某个对象过多导致,可使用如下命令查询哪个对象过多:

jmap –histo pid | head -20

然后分析对应类为什么会这么多,为什么不会被回收(可达性分析等),然后进一步分析原因。

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

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

相关文章

博球一看,CSDN与你共观世界杯

2022卡塔尔世界杯不知不觉已接近尾声&#xff0c;不仅让人感叹&#xff0c;乌拉圭&#xff0c;巴西&#xff0c;葡萄牙都已淘汰&#xff0c;四强诞生分别是阿根廷&#xff0c;法国&#xff0c;摩洛哥&#xff0c;克罗地亚&#xff0c;非常期待梅西和魔笛的对决&#xff0c;也希…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共3题&#xff0c;共30分&#xff09; 青少年软件…

【云计算与大数据技术】虚拟化简介及虚拟化的分类讲解(图文解释 超详细)

一、虚拟化简介 1&#xff1a;什么是虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是在真实的、独立的物理硬件基础上运行。这种以优化资源、简化软件的重新配置过程为目的的解决方案就是虚拟化技术 虚拟化架构就是在一个物理硬件机器上同时运行多个不同应用的独立的虚拟系…

r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现|视频

Glmnet是一个通过惩罚最大似然关系拟合广义线性模型的软件包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net&#xff08;弹性网络&#xff09;惩罚值计算的。 最近我们被客户要求撰写关于LASSO的研究报告&#xff0c;包括一些图形和统计输出。该算法非常快&am…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共4题&#xff0c;共50分&#xff09; 青少年软件…

51单片机——LED 点阵点亮一个点,小白详解

LED点阵介绍&#xff1a; LED点阵是由发光二极管排列组成的显示器件&#xff0c;在我们生活中的电器中随处可见&#xff0c;被广泛用于汽车报站器&#xff0c;广告屏等。 通常用用较多的是8*8点阵&#xff0c;然后使用多个8*8点阵组成不同分辨率的LED点阵显示屏&#xff0c;比如…

kubernetes--kube-proxy组件深入理解

文章目录kube-proxy的工作原理netfilter的运行机制ipvs和iptables有什么区别&#xff1f;iptables在网络栈的hook点更多&#xff0c;而ipvs的hook点很少iptables的hook点ipvs的hook点如何切换&#xff1f;ipvs安装为何推荐ipvs&#xff1f;为什么iptables或者ipvs在每个节点上都…

面试官:你会几种分布式 ID 生成方案???

1. 为什么需要分布式 ID 对于单体系统来说&#xff0c;主键 ID 常用主键自动的方式进行设置。这种 ID 生成方法在单体项目是可行的&#xff0c;但是对于分布式系统&#xff0c;分库分表之后就不适应了。比如订单表数据量太大了&#xff0c;分成了多个库&#xff0c;如果还采用…

基于java+springboot+mybatis+vue+mysql的福聚苑社区团购

项目介绍 随着互联网的发展&#xff0c;各种团购模式也越来越多&#xff0c;尤其是最近几年的社区团购模式更是如火如荼的在进行着&#xff0c;我了能够让大家品味到更多的瓜果蔬菜&#xff0c;我们通过java语言&#xff0c;springboot框架、前端vue技术、数据库mysql开发了本…

使用Hilt搭建隔离层架构

在我们的日常编码的过程中&#xff0c;常常会遇到这种需求。例如&#xff1a;这个版本我们使用okhttp作为网络通信库&#xff0c;如果下个版本我们想要用volley作为网络通信库&#xff0c;那该怎么办呢&#xff1f;我们总不能对使用okhttp的地方一个个改成volley吧&#xff01;…

上班都在刷的Java八股文,老板都想要一份?

今天心血来潮刷刷牛客看到这&#xff0c;小伙在上班刷八股文被老板逮到&#xff01;真行啊&#xff0c;结果还让他给老板也发一份&#xff0c;感觉过不了多久就跟老板一起提桶跑路了 说到这&#xff0c;我最近也整理了GitHub上高标星的面试八股文&#xff0c;这种金九银十的节骨…

Java并发编程之Condition await/signal原理剖析

Java并发编程之Condition await/signal原理剖析 文章目录Java并发编程之Condition await/signal原理剖析Condition与Lock的关系Condition实现原理await()实现分析signal()实现分析Condition接口与Object监听器的区别Condition与Lock的关系 Condition本身也是⼀个接口&#xff…

OpenStack的简单部署

OpenStack的简单部署 文章目录OpenStack的简单部署一、OpenStack概述二、环境准备三、搭建流程1. 更新 & 升级2. 安装好用的vim VimForCpp3. 安装必要依赖4. 关闭防火墙、核心防护、NetworkManager5. 配置静态IP地址6.配置yum源7. 安装时间同步服务8. 使用packstack 一键部…

C罗老矣,我的程序人生还有多远

☆ 随着12月11号摩洛哥1-0葡萄牙比赛的结束&#xff0c;不仅说明葡萄牙对要结束本届卡塔尔世界杯了&#xff0c;就连C罗此生的世界杯之旅也将画上句号了。 ☆ 37岁的球星本该是人生最璀璨的阶段&#xff0c;但在足球生涯中&#xff0c;这已经是大龄了。不禁让我想到&#xff0c…

机器视觉(五):机器视觉与世界杯

11月22日晚上&#xff0c;球迷再次为阿根廷而惋惜。在当天晚上进行的世界杯小组赛C组首轮比赛中&#xff0c;阿根廷队1:2不敌沙特阿拉伯队&#xff0c;爆出了本届世界杯开赛至今最大的冷门。 天台好冷不仅如此&#xff0c;阿根廷队全场比赛总计被吹罚了10次越位&#xff0c;刷新…

SpringMVC(一) 构建项目

SpringMVC(一) 构建项目 1.创建项目 创建一个空的Maven项目 删除src目录&#xff0c;将新建的项目作为一个工作空间使用&#xff0c;然后在里面创建Module。 2.创建Module 选中刚才创建的项目&#xff0c;右键创建Module 选择Java语言的Maven 项目 3.添加SpringMVC依赖 在…

1-48-mysql-基础篇-DML-select

1-mysql-基础篇&#xff1a; 推荐网站 mysql&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/ 算法&#xff1a;https://www.cs.usfca.edu/~galles/visualization/about.html 数据库 1、数据库概述相关 1、 数据库的相关概念 DB&#xff1a;数据库&#xff08;Data…

git 多用户配置(公司/个人)

背景 张三是一个程序员&#xff0c;他的英文名叫 outlaw&#xff0c;emial: outlaw163.com。 张三入职了一家公司&#xff0c;公司给张三的企业邮箱是 zhangsancompany.com 这一次&#xff0c;他 0 元购了一台新笔记本&#xff0c;需要配置一下 git git 账号配置 配置全局用…

微信公众号开发,获取openid,授权登录 WeChat-official-account-openid

微信公众号开发 功能&#xff1a;自动登录&#xff0c;获取个人信息&#xff0c;上传图片 超多麻烦的情况&#xff0c;怎样获取openid呢&#xff1f; 以下我给大家提供源码&#xff0c;文本&#xff0c;视频资料 保证让你看了就明白哈 look效果 1.拉起用户授权 2.后台获取到…

微服务雪崩问题解决 Sentinel

雪崩问题以及解决方案 限流设置 达到阈值的效果 隔离和降级 熔断 授权规则 设置规则持久化 雪崩问题以及解决方案雪崩微服务调用链路中的某个服务出现故障&#xff0c;引起链路上其他服务都不可用&#xff0c;这就是雪崩解决方案超时处理&#xff0c;设定超时时间&#xff0c;请…