JVM 性能优化思路

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

一般在系统出现问题的时候,我们会考虑对 JVM 进行性能优化。优化思路就是根据问题的情况,结合工具进行问题排查,针对排查出来的可能问题找到对应的解决方案。

1

JVM 优化思路

51c8121e78367a8e5cdfd5efa82f076c.png

1、系统中可能会出现的问题

1、OOM:OOM是指Java虚拟机在启动或运行过程中,无法申请到足够的内存空间,导致抛出java.lang.OutOfMemoryError。

OOM产生的原因可能有以下几点:

(1)代码中存在大对象分配。

(2)内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。

(3)永久代/元空间设置的过小。

(4)应用长时间运行,没有重启,运行期间生成了大量的类。

2、死锁:死锁是指两个或两个以上的进程或线程,在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法继续执行。

3、CPU 飙升:CPU飙升是指程序运行时CPU占用率过高。

CPU飙升的可能原因如下:

(1)系统负载高:负载高表示有很多程序等待调度运行,它会导致上下文切换频繁。

(2)大量并发的I/O操作。

(3)多线程抢占系统资源。

4、线程池不够用:线程池不够用指的是当前线程数小于核心线程数,但已提交的任务个数大于当前线程数,这时线程池中的线程无法满足任务的需求,需要创建新的线程来执行任务。

5、GC 次数频繁:GC次数频繁是指程序运行时Full GC的次数超过了可接受的正常水平。

2、问题排查的手段

(1)用 jmap 命令 dump 出堆文件,利用 MAT 工具分析

(2)用 jstack 命令查看线程堆栈信息

(3)用 top 命令查看占用 CPU 高的进程,结合 jps,jinfo,jstat,jmap 等命令分析原因

(4)用 jvisualvm、jconsole、arthas 等工具查看 JVM 状态

(5)开启 GC 日志打印,结合 GCViewer 分析 GC 日志,查看 GC 执行情况

3、常用的解决方案

(1)适当增加堆内存大小

(2)选择合适的垃圾收集器

(3)代码中及时释放资源

(4)合理设置线程池的参数

(5)集群部署增加负载能力

(6)利用 MQ 进行异步削峰

(7)综合利用本地缓存、Redis 缓存减少数据库压力

2

常用问题分析思路

dd31e0f8de95697f9fe4575ebcdc523f.png

1、OOM 问题

导出 dump 文件,然后用 MAT 或者其他工具分析 dump 文件,分析为什么内存使用高了,我们可以适当增加堆内存的空间,也可以适当的减少并发数,增加消息队列来解决等。

2、CPU 飙升问题

使用 top 命令找到 CPU 使用率高的进程,我们可以通过 jstack 查看线程情况,通过 jinfo 命令查看 JVM 参数,通过 jmap 命令查看堆内存,如果是业务代码问题(死锁、资源没释放),那么可以修改代码;如果是用户并发太高,那么可以增加集群数量来减轻服务器压力;如果是没有异步处理,那么可以使用消息队列等,如果是垃圾回收的线程一直占用 CPU,那么可以对 GC 进行优化。

3、GC 频繁问题

开启 GC 日志打印,使用 GCViewer 工具分析 GC 日志,查看 GC 执行情况,如果是堆内存空间的问题,那么我们可以适当增加堆内存的空间,比如调高新生代空间;如果是垃圾收集器设置的不合适,我们可以选择合适的垃圾收集器,比如大内存空间可以选择 G1;如果使用 G1 收集器,暂停时间设置的太小,我们可以把暂停时间适当调大一点,初始堆内存设置的太小,我们可以适当调大一点初始堆内存设置等。

后面将为大家介绍常见的 JVM 面试题分析

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

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

相关文章

uniapp软键盘谈起遮住输入框和头部被顶起的问题解决

推荐: pages.json中配置如下可解决头部被顶起和表单被遮住的问题。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

Alpine Ridge控制器使其具备多种使用模式 - 英特尔发布雷电3接口:竟和USB Type-C统一了

同时又因为这建立在Type-C的基础上,雷电3也将利用现有的标准Type-C线缆引入有源支持。当使用Type-C的线缆时,雷电的速度就降到了20Gbps全双工——这与普通的Type-C的带宽相同——这是为了成本牺牲了一些带宽。可以比较一下,Type-C线的成本只有…

asyncio是什么?

如果把进程比作从A处到B处去这件事,那么线程就是可供选择的多条道路,协程就是道路上特殊路段(类似限速,一整条道路都是特殊路段的话,就是全部由协程实现) 例图如下: 1. 什么是协程&#xff08…

winform 使用CommonOpenFileDialog选择文件夹或文件

选择文件夹 /// <summary> /// 选择文件夹 /// </summary> public void SelectFolder() {CommonOpenFileDialog dialog new CommonOpenFileDialog("请选择一个文件夹");dialog.IsFolderPicker true; //选择文件还是文件夹&#xff08;true:选择文件夹…

undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘

使用Crow的时候需要注意crow依赖asio依赖OpenSSL&#xff0c;asio要求1.22以上版本&#xff0c;我使用的是1.26.0&#xff1b; 这个版本的asio要求OpenSSL是1.0.2&#xff0c;其他版本我得机器上编不过&#xff0c;ubuntu上默认带的OpenSSL是1.1.1; 所以我下载了OPENSSL1.2.0重…

android APP内存优化

Android为每个应用分配多少内存 Android出厂后&#xff0c;java虚拟机对单个应用的最大内存分配就确定下来了&#xff0c;超出这个值就会OOM。这个属性值是定义在/system/build.prop文件中. 例如&#xff0c;如下参数 dalvik.vm.heapstartsize8m #起始分配内存 dalvik.vm.…

qt在vs中编译出现link2001时,不会生成moc文件了

现象&#xff1a; 解决方法&#xff1a; 在对应头文件-属性-配置属性-常规-项类型-改为Qt Meta-Object Compiler (moc) 即可。 有时候不知道啥原因头文件类型变成普通C头文件

Pyinstaller 打包 django 项目如何将命令行参数加入?

起因 Pyinstaller 打包 django 项目&#xff0c;打包成 manage.exe 后用命令行 cmd manage.exe runserver 0.0.0.0:8001 --noreload 来运行感觉很不方便。 希望能够直接把命令行参数也打包进去&#xff0c;直接运行 exe 。我走了些弯路&#xff0c;但最终实现了。 弯路 我看…

Vue组件的嵌套关系;父组件传递子组件props;子组件传递给父组件$emit;自定义事件;案例

目录 1_Vue组件的嵌套关系1.1_认识组件的嵌套1.2_组件的拆分1.3_组件的通信 2_父组件传递子组件props2.1_父子组件之间通信的方式2.2_父组件传递给子组件2.3_Props的对象用法 3_子组件传递给父组件$emit4_自定义事件(了解)5_小案例6_补充 1_Vue组件的嵌套关系 1.1_认识组件的嵌…

【C++】set 和 map 简单了解使用

文章目录 关联式容器set 和 multisetmap 和 multimap 关联式容器 set 和 multiset map 和 multimap

WebDAV之π-Disk派盘+Joplin

Joplin是一个优秀的开源笔记,可以组织到笔记本中的大量笔记和文本编辑器中进行复制,标记和修改。支持Evernote的笔记直接导入到Joplin应用程序中。Joplin还支持各种云服务同步,包括Dropbox、OneDrive、WebDAV或文件系统,方便对其进行检查、备份和移动。该应用程序可用于Win…

为什么DNS协议运行在UDP之上?

DNS (Domain Name System) 运行在 UDP (User Datagram Protocol) 上主要是出于以下原因&#xff1a; 简单性和效率&#xff1a;UDP 是无连接的&#xff0c;这意味着与建立和维护 TCP 连接相比&#xff0c;UDP 有更少的开销。当 DNS 查询被发送时&#xff0c;它只需要一个小的请…

关于@JSONField的使用

1.此注解来自jar包com.alibaba.fastjson 今天分享一个有意思的事情。这个注解作用与类的属性上&#xff0c;如下&#xff1a; ApiModelProperty(value"开始时间,格式:yyyy-MM-dd",required true) JSONField(name"start_date",ordinal 1) private String…

18 Java并发机制的底层实现原理_volatile实现原理

Java并发机制的底层实现原理_volatile实现原理 Java并发机制的底层实现原理volatile 关键字volatile的两条实现原则&#xff08;Lock前缀的作用&#xff09; Java并发机制的底层实现原理 Java代码在编译后会变成Java字节码&#xff0c;字节码被类加载器加载到JVM里&#xff0c;…

将本地项目上传至gitee的详细步骤

将本地项目上传至gitee的详细步骤 1.在gitee上创建以自己项目名称命名的空项目2.进入想上传的项目的文件夹&#xff0c;然后右键点击3. 初始化本地环境&#xff0c;把该项目变成可被git管理的仓库4.添加该项目下的所有文件5.使用如下命令将文件添加到仓库中去6.将本地代码库与远…

项目实战 — 消息队列(7){虚拟主机设计(1)}

目录 一、什么是虚拟主机 二、编写虚拟主机代码 &#x1f345; 1、准备工作 &#x1f345; 2、实现exchange相关操作 &#x1f384;实现创建交换机exchangeDeclare &#x1f384; 实现 删除交换机exchangeDelete &#x1f345; 3、实现queue相关操作 &#x1f384;实现…

SSL证书DV和OV的区别?

SSL证书是在互联网通信中保护数据传输安全的一种加密工具。它能够确保客户端和服务器之间的通信得以加密&#xff0c;防止第三方窃听或篡改信息。在选择SSL证书时&#xff0c;常见的有DV证书和OV证书&#xff0c;它们在验证标准和信任级别上有所不同。那么SSL证书DV和OV的有哪些…

Linux vi/vim

Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 什么是 vim&…

Mr. Cappuccino的第60杯咖啡——Spring之BeanFactory和ApplicationContext

Spring之BeanFactory和ApplicationContext 类图BeanFactory概述功能项目结构项目代码运行结果总结 ApplicationContext概述功能MessageSource&#xff08;国际化的支持&#xff09;概述项目结构项目代码运行结果 ResourcePatternResolver&#xff08;匹配资源路径&#xff09;概…

面试热题(岛屿数量)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均…