JVM04-优化JVM内存分配以及内存持续上升问题和CPU过高问题排查

1-JVM内存分配

1.1-JVM内存分配性能问题

       JVM内存分配不合理最直接的表现就是频繁的GC,这会导致上下文切换等性能问题,从而降低系统的吞吐量、增加系统的响应时间。因此,如果你在线上环境或性能测试时,发现频繁的GC,且是正常的对象创建和回收,这个时候就需要考虑调整JVM内存分配了,从而减少GC所带来的性能开销。

1.2-对象在堆中的生存周期

       在JVM内存模型的堆中,堆被划分为新生代和老年代,新生代又被进一步划分为Eden区和Survivor区,最后Survivor由From Survivor和To Survivor组成。
       当我们新建一个对象时,对象会被优先分配到新生代的Eden区中,这时虚拟机会给对象定义一个对象年龄计数器(通过参数-XX:MaxTenuringThreshold设置)。

      当Eden空间不足时,虚拟机将会执行一个新生代的垃圾回收(Minor GC)。这时JVM会把存活的对象转移到Survivor中,并给对象的年龄+1。对象在Survivor中同样也会经历MinorGC,每经过一次MinorGC,对象的年龄将会+1。

       参数-XX:PetenureSizeThreshold设置直接被分配到老年代的最大对象,这时如果分配的对象超过了设置的阀值,对象就会直接被分配到老年代,这样做的好处就是可以减少新生代的垃圾回收。

1.3-查看JVM堆内存分配

       java -pf | grep java:查询当前的java进程;也可以使用jps查看
       jmap -heap pid:查看对应进程的内存信息

       在JDK1.7中,默认情况下年轻代和老年代的比例是1:2,我们可以通过–XX:NewRatio重置该配置项。年轻代中的Eden和To Survivor、From Survivor的比例是8:1:1,我们可以通过-XX:SurvivorRatio重置该配置项。

1.4-JVM GC日志

       在实际的项目中,我们一般先配置默认的JVM参数,并且配置好gc日志路径,如果发现系统响应慢或者吞吐量上不去,我们可以通过分析GC日志来查找问题。
-XX:+PrintGCTimeStamps  -XX:+PrintGCDetails  -Xloggc:/log/gc.log

-XX:PrintGCTimeStamps:打印GC具体时间;
-XX:PrintGCDetails :打印出GC详细日志;
-Xloggc: path:GC日志生成路径。

2-GC问题定位查找步骤

1.配置和设置好JVM参数,按照自己服务器实际配置一个基本参数;

java -jar -Xms2048m -Xmx2048m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof 
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/tmp/heapTest.log
abc.jar


2.当出现吞吐量明显下降,系统响应超时后;
3.需要把gc日志下载到本地,然后使用一些工具来分析,比如我们上节提到的GCViewer工具打开看,可以查看GC次数和内存使用情况。
4.根据参数分析,我们重新调整GC参数,根据项目的实际情况来进行一些设置。比如增大堆内存大小,加大新生代大小等等措施。最主要的目的是减少FullGC和减少MinorGC次数。

3-内存持续上升或者CPU问题定位

1.通过 top 命令找到占用内存/cpu最高的 pid[进程id]
2.通过 top -Hp pid 查看进程中占用内存/cpu过高的 tid[线程id]
3.通过 printf  '%x/n' tid 把线程id转化为十六进制
4.通过 jstack pid | grep tid -A 30 定位线程堆栈信息

       其实我们也可以采用arthas。arthas是阿里一款开源java性能诊断工具,除了java自带的jmap命令没有实现之外,其它的命令都实现,并且功能强大。  

 

jvm查看java进程相关信息

 

 thread
thead:列出当前进程所有线程信息
thread | grep http-nio-:过滤http-nio-名称的线程,如果有自己的线程池,可以查询出来
thread 29:查询29号线程具体信息
thread -b:查询死锁相关信息

 

类似sc,sm,redefine命令,功能很强大,很多命令可以看,实战中完全可以执行help看各种命令说明,redefine可以动态修改class,直接替换class文件

如果需要分析dump文件可以用jdk自带的jvisualvm.exe,不一定非要用MAT。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring异常处理器

文章目录 1. 异常分析2. 异常处理器2.1 异常处理器核心2.2 异常处理顺序 3. 自定义异常 1. 异常分析 问题:   程序允许不免的在各层都可能会产生异常,我们该如何处理这些异常? 如果只是在方法里面单独使用 try… catch… 语句去一个一个的进行捕捉处理的话&#x…

MAC M1上docker rocketmq简单环境搭建和代码

工作了这么多年,rocketmq还没有用过,由于现在的工作中涉及到了,周六吃完午饭就开始搞,结果到现在3点钟才把环境弄好,测试代码搞起。 整个流程分成两步 安装简单的rocket环境起springboot项目测试 参考文章&#xff…

SQL Server 2012数据库允许远程连接设置

1、打开 SQL Server Management Studio 2、打开 Security 按照如下设置,然后点确定 3、打开SQL Server Configuration ManagerMent 4、如下图都设置为Enabled 6、sql server重启

企业和公司扩展WordPress网站的4种方法

Netflix 通过邮递观看 DVD。Apple 是一家计算机公司,而不是电话公司。WordPress 是一个博客平台。 这三个陈述有什么共同点?十年前都是对的,现在都不是了。如今,Netflix 以数字方式提供原创内容而闻名。Apple 正在推出其广受欢迎…

解决vue3中使用个别form表单校验失灵

当我点击校验时 其他都有触发校验 唯独radio没有触发,绑定都没有问题 看一下代码 const data reactive({form: {},rules: {serverStatus: [{ required: true, message: "服务状态不能为空", trigger: change }],tenantName: [{ required: true, messag…

Spring高手之路6——Bean生命周期的扩展点:BeanPostProcessor

文章目录 1. 探索Spring的后置处理器(BeanPostProcessor)1.1 BeanPostProcessor的设计理念1.2 BeanPostProcessor的文档说明 2. BeanPostProcessor的使用2.1 BeanPostProcessor的基础使用示例2.2 利用BeanPostProcessor修改Bean的初始化结果的返回值2.3 …

途乐证券|有色金属板块崛起涨超2%,云南锗业两连板

周三(7月5日),A股三大股指震荡整理。截至上午收盘,上证指数跌幅达0.51%,报3228.68点;深证成指和创业板指跌幅分别为0.53%和0.59%;沪深两市合计成交额5310.1.6亿元,总体来看,两市个股跌多涨少。 …

使用Stable Diffusion生成艺术二维码

在数字艺术的世界中,二维码已经从单纯的信息承载工具转变为可以展示艺术表达的媒介。这是通过使用Stable Diffusion的技术实现的,它可以将任何二维码转化为独特的艺术作品。接下来,我们将一步步教你如何使用Stable Diffusion生成艺术二维码。…

【备战秋招】每日一题:2022.11.3-华为机试-去除多余空格

为了更好的阅读体检,可以查看我的算法学习网 在线评测链接:P1058 题目描述 塔子哥最近接到导师的一个任务,需要他帮忙去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词…

【JavaScript】ES6新特性(5)

16. Promise Promise 是异步编程的一种解决方案,比传统的解决方案回调函数, 更合理和更强大 ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象 指定回调函数方式更灵活易懂解决异步 回调地狱 的问题 16.1 回调地狱 当一个回调函数…

并发编程 - Event Bus 设计模式

文章目录 Pre设计CodeBus接口自定义注解 Subscribe同步EventBus异步EventBusSubscriber注册表RegistryEvent广播Dispatcher 测试简单的Subscriber同步Event Bus异步Event Bus Pre 我们在日常的工作中,都会使用到MQ这种组件, 某subscriber在消息中间件上…

AIGC - Stable Diffusion 的 AWPortrait 1.1 模型与 Prompts 设置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131565908 AWPortrait 1.1 网址:https://www.liblibai.com/modelinfo/721fa2d298b262d7c08f0337ebfe58f8 介绍:AWPortrai…