jvm实战之-常用jvm命令的使用

news2024/12/29 8:56:23

各命令的使用

JMAP

1、查看内存信息,对象实例数、对象占有大小

jmap -histo 进程号>./log.txt

2、查看堆的配置信息和使用情况

jmap - heap 进程号

在这里插入图片描述
3、将堆的快照信息dump下来,使用java自带的jvisualvm.exe打开分析

jmap -dump:format=b,file=dump.hprof 进程号
Jstack

查看线程信息,死锁时用到可以查看线程阻塞信息

jstack -l 进程号 > jstack.log
jstat

查看gc日志

jstat -gc  进程号

在这里插入图片描述

持续打印gc日志

jstat -gc 进程号 1000 10
其他

1、jvisualvm.exe可以开启远程连接,但生产一般不用。只能在测试服务器上进行压测的时候可以开启。开启需要在服务器上加命令:自行百度
2、记录下outofmemory时的dump文件

-Xmx10M -Xms10M
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:/dump.dump

dump下来的文件使用java自带的jvisualvm.exe打开分析

实战例子

cpu飙高定位问题
  • top 查看占用较大的进程号
  • 使用 top -p 进程,再按大写的H 查看该进程下对应的线程情况
  • 找到占有最大的线程id
  • jstack -l 进程号
  • 用jstack打出来的线程nid和top -p 查到的线程进行对比。就能得到对应的代码信息
  • 注意jstack 里面的线程信息 nid是16进制的,top里面找到的线程信息需要转换一下
    在这里插入图片描述
优化full gc

目的:让朝生夕死的对象在年轻代就干掉,不要给他到达老年代
案例
线上系统频繁发生full gc。有卡顿,但是线上的系统压力也不是很大。
1、通过jstat -gc 进程号 查看gc情况
机器和GC情况

  • 机器配置:2核4G
  • JVM内存大小:2G
  • 系统运行时间:7天
  • 期间发生的Full GC次数和耗时:500多次,200多秒
  • 期间发生的Young GC 次数和耗时:1万多次,500多秒
  • 大致算下来每天会发生70多次Full GC,平均每小时3次,每次Full GC在400毫秒左右;每天会发生1000多次Young GC, 每分钟会发生一次,每次Young GC 在50毫秒左右
  • 上述数据对任何一个线上系统,用jstat -gc 进程号,可以轻松看出来,因为jstat显示出来的Full GC和Young GC的次数都是系统启动以来的总次数。可回看上方jstat -gc命令的介绍

JVM的参数设置如下

 -Xms1536M -Xmx1536M -Xmn512M -Xss256K -XX :SurvivorRatio=6 -XX:MetaspaceSize=256M
-XX:+UseParNewGC -xx:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly

计算各区大小

  • jvm总内存1536M

  • 新生代堆内存-Xmn512M,SurvivorRatio=6根据比例得知:伊甸园区:幸存1区:幸存2区 = 6:1:1。伊甸园区 384M,幸存1区 64M,幸存2区 64M(幸存1区与二区内存相同,是否是,进行youngGC的时候,将一区挪到二区,或从二区挪到一区)

  • 老年区 = 堆大小1536-新生代堆521 = 1G

  • 条件:youngGC 7天1万次,大概每隔1分钟发生一次youngGC,一分钟占满伊甸园区384M,每秒会产生6M对象

  • fullGC 大概每20分钟一次,因为XX:CMSInitiatingOccupancyFraction设置的75%。所有每20分钟大概有700M的对象移入老年代
    在这里插入图片描述
    验证调整
    分析为什么会频繁触发fullGC

  • youngGC 7天1万次

  • 平均一分钟一次youngGC

  • 也就是每60秒会占满伊甸园区384M

  • youngGC 在10秒到60秒一次算是比较正常的。而且每次youngGC完只剩下几十MB进入到幸存区,只是偶尔会有一两次幸存区放不下才会进到老年代。

  • 这里youngGC并不频繁,但是FULLGC却那么频繁有点反常

  • 猜测触发FULLGC很可能是有大对象或者触发空间担保机制进入到了老年代

  • 大对象是因为产生的对象伊甸园区放不下了,直接就放到了老年代

  • 这个时候我们通过jstat运行的时候就观察到一个现象,就是老年代里的内存占用在系统运行的时候,不知道为什么系统运行着运行着就会突然有几百MB的对象占据在里面,大概有五六百MB的对象,一直占据在老年代中。那只能是有大对象生成

  • 分析到这里就很简单了,就先用jstat命令观察老年代突然进入几百兆对象。然后将内存dump下来。Visual VM之类的可视化工具来分析dump内存快照

  • 直接定位出来那个几百MB的大对象,就是几个Map之类的数据结构。根据业务排查,有SQL会在特定场景下select * from tbl,后面的where条件都没有用上,导致查询出大量数据,从而这些对象都进入到老年代,引发fullGC

参考:https://www.jianshu.com/p/b6d2aa15c2a8

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

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

相关文章

oracle学习(5)

数据处理 SQL语言的类型: 1. 数据库中,称呼增删改查,为DML语句。(Data Manipulation Language 数据操纵语言),就是指代: insert、update、delete、select这四个操作。 2. DDL语句。(Data Definition Language 数据…

提升数据库性能的关键指南-Oracle AWR报告

文章目录 一、了解AWR报告:数据库性能的仪表盘二、生成AWR报告三、解读AWR报告的关键部分1.报告开头的系统基础信息2.ADDM发现3.负载概览(Load Profile)4.参数文件5.顶级前台等待事件6.SQL 统计信息-顶级SQL7.SGA Advisory AND PAG Advisory 一、了解AWR报告&#x…

帆软报表中定时调度中的最后一步如何增加新的处理方式

在定时调度中,到调度执行完之后,我们可能想做一些别的事情,当自带的处理方式不满足时,可以自定义自己的处理方式。 产品的处理方式一共有如下这些类型: 我们想在除了上面的处理方式之外增加自己的处理方式应该怎么做呢? 先看下效果: 涉及到两方面的改造,前端与后端。…

出海合规云安全,AWS Landing Zone解决方案建立安全着陆区

在出海的大环境中,企业数字化转型的趋势之一就是上云。然而,上云也带来了新的挑战,特别是对企业的 IT 建设和管理提出了更高的要求。为了构建一个安全合规的云上信息系统环境,满足企业中不同用户的快速增长、资源访问可控、成本可…

动态新增input输入框

实现原理,修改绑定数组的长度。 需要绑定的数组 memberList: [{userName: ,phone: ,position: }], 点击时触发修改绑定数组长度的方法 addItem() {this.memberList.push({name: , phone: , post: })}, deleteItem(item, index) {this.inputForm.memberList.splice(i…

02.Git远程仓库

一、常用的托管服务 1.gitHub 一个面向开源及私有软件项目的托管平台,只支持Git作为唯一的版本库格式进行托管。 2.码云(gitee) 是国内的一个代码托管平台,服务器在国内,所有相较于gitHub使用起来更加方便一点。 3.gitLab 是一个用于仓库管…

如何在MAC OS中的XCODE下添加 <bits/stdc++.h>

mac上使用的编译器是Clang,但是没有万能头文件bits/stdc.h\,本文介绍如何添加万能头文件 Xcode 版本:15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…

华为无线ac双链路冷备和热备配置案例

所谓的冷备和热备,冷备就是不用vrrp和hsb协议同步ap和用户信息,主的断了等七十五秒后,备的capwap和ap连接上去。 双链路冷备不用vrrp和hsb 双链路热备份只用hsb同步ap和用户信息,不用vrrp,两个ac可以不用在同一个二层…

java设计模式实战【策略模式+观察者模式+命令模式+组合模式,混合模式在支付系统中的应用】

引言 在代码开发的世界里,理论知识的重要性毋庸置疑,但实战经验往往才是知识的真正试金石。正所谓,“读万卷书不如行万里路”,理论的学习需要通过实践来验证和深化。设计模式作为软件开发中的重要理论,其真正的价值在…

使用Vscode远程debug报错找不到Module找不到File

1..报第一个错 提示我无法导入自己写的module 如图: 解决办法: stackoverflow上说的在launch.json中加了一条 env,就解决了。 "env": { "PYTHONPATH":"/home/zt/ge-sc-master/ge-sc-master"}, 2.解决完第一个…

机器学习的一般步骤

机器学习专注于让机器从大量的数据中模拟人类思考和归纳总结的过程,获得计算模型并自动判断和推测相应的输出结果。机器学习的一般步骤可以概括为以下几个阶段: 数据收集和准备: 收集与问题相关的数据,并确保数据的质量和完整性。…

k8s的陈述式资源管理

k8s的陈述式资源管理: 命令行:kubectl命令行工具 优点:90%以上的场景都可以满足 对资源的增,删,查比较方便,对改不是很友好 缺点: 命令比较冗长,复杂,难记 声明式&…

Adobe 设计精髓:创新的用户体验 | 开源日报 No.130

adobe/react-spectrum Stars: 10.1k License: Apache-2.0 React Spectrum Libraries 是一系列的库和工具,旨在帮助开发者构建适应性强、可访问性好且稳健的用户体验。 核心优势: 提供全面的可访问性和行为支持,符合 WAI-ARIA 编写实践&…

nginx+rsyslog+kafka+clickhouse+grafana 实现nginx 网关监控

需求 我想做一个类似腾讯云网关日志最终以仪表方式呈现,比如说qps、p99、p95的请求响应时间等等 流程图 数据流转就像标题 nginx ----> rsyslog ----> kafka —> clickhouse —> grafana 部署 kafka kafka 相关部署这里不做赘述,只要创…

hyperf console 执行

一、原理描述 hyperf中,不难发现比如自定义控制器中获取参数,hyperf.php中容器获取,传入的都是接口,而不是实体类。 这是因为框架中的配置文件有设置对应抽象类的子类,框架加载的时候将其作为数组,使用的…

楼宇智慧能源消耗监测管理系统,楼宇中的能源“管家”

随着人口的增加,楼宇数据呈上涨趋势,但是楼宇智能建设在我国普及性远远不足,相比传统楼宇控制,智能楼宇控制系统对于楼宇内部的用电设备控制,能够更加的节约能源,降低成本。对于现代化楼宇而言,…

大数据学习(29)-Spark Shuffle

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

代码质量评价及设计原则

1.评价代码质量的标准 1.1 可维护性 可维护性强的代码指的是: 在不去破坏原有的代码设计以及不引入新的BUG的前提下,能够快速的修改或者新增代码. 不易维护的代码指的是: 在添加或者修改一些功能逻辑的时候,存在极大的引入新的BUG的风险,并且需要花费的时间也很长. 代码可…

winserver2008 r2服务器iis配置支持flv,f4v,mp4格式视频

很多政府单位网站一直在使用WIN服务器,大部分网站都使用多年基本使用.NET或者CMS系统建站,系统环境也一直是老版本,今天在维护过程中又出现了新问题,上传的MP4文件不支持网站上播放,顺便也分享下解决过程。当我们架设的…

分布式系统架构设计之分布式系统架构演进和版本管理

在分布式系统的生命周期中,架构演进和版本管理是很重要的两个环节。本部分会介绍分布式系统架构演进的原则、策略以及版本管理的最佳实践,以帮助研发团队更好地应对需求变化、技术发展和系统升级。 架构演进 演进原则 渐进式演进 采用渐进式演进的原…