IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 51.整理JVM调优 -> 正文阅读

[Java知识库]51.整理JVM调优

JVM调优的原则?

  1. 不要为了调优而调优,首先确定的应该是项目的架构与代码已经没有优化的空间了,再考虑进行JVM的调优工作,不能指望通过JVM调优来使得性能有一个质的飞越
  2. 从三个属性中(吞吐量,延迟,内存)中选择两个进行JVM调优,称之为调优3选2,在处理吞吐量和延迟问题时,GC能使用的内存越大,应用运行也就越流畅,这也叫GC内存最大化原则

什么情况下需要进行调优?

  1. Full GC数量频繁,GC停顿时间超长(超过1s)
  2. 应用出现OOM异常或者吞吐量下降,响应性能不高,
  3. 应用CPU占用过高,内存占用过高

吞吐量和低延迟?

吞吐量:代码时间/(代码时间+垃圾回收时间),吞吐量越高,算法越好

低延迟:STW越短,响应时间越好,算法越好,目的在于缩短或者完全消除因垃圾收集器引起的停顿

一个GC算法只可能针对于以上两个目标之一或者尝试找到一个折中方案,吞吐量优先的垃圾回收器有Parallel的年轻代和老年代版本,响应时间优先的垃圾回收器有CMS和G1

常用性能调优工具和常用参数

常用工具:jvisualvm,jconsole,MAT(提示可能内存泄露的点)

常用参数解释:

  • -Xms:JVM启动时申请的初始Heap大小
  • -Xmx:JVM运行时可申请的最大Heap值,为了避免每次GC后JVM重新分配内存,一般设置为同一个值
  • -Xmn:设置Heap中新生代的大小,通过Xms-Xmn可以得到老年代的大小
  • -Xss:设置每个线程可使用的栈大小
  • -XX:TraceClassLoading/TraceClassUnLoading可以在日志中追踪类加载和卸载的情况

CPU占用过高的排查流程?

  • top命令查看出cpu最高的进程pid(这里也可以用jps -l命令)
  • [ps -mp 进程号 -o THREAD,tid,time]定位具体的线程(这里也可以使用top -Hp pid)
  • 使用[printf "%x\n" 线程id]将需要的线程转换为16进制格式
  • 使用[jstack 进程ID|grep 16进制线程id -A60]打印出前60行信息
ps常用参数:
-A    显示所有进程(等价于-e)(utility)
-a    显示一个终端的所有进程,除了会话引线
-N    忽略选择。
-d    显示所有进程,但省略所有的会话引线(utility)
-x    显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p    pid 进程使用cpu的时间
-u    uid or username 选择有效的用户id或者是用户名
-g    gid or groupname 显示组的所有进程。
-f    全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l    长格式(有F,wchan,C 等字段)
-j    作业格式
-o    用户自定义格式
-m    显示所有的线程
-H    显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
-a    显示同一终端下的所有程序
-A    列出所有的进程
-w    显示加宽可以显示较多的资讯
-au   显示较详细的资讯
-aux  显示所有包含其他使用者的进程
-e    显示所有进程,环境变量
-f    全格式
-h    不显示标题
-l    长格式
-w    宽输出

内存占用过高排查流程?

  • 查找进程Id: top查看内存占用过高的进程pid
  • [jmap -heap pid]:查看JVM堆内存的分配情况
  • [jmap -histo:live pid|head -n 100]:查看占用内存比较多的存活对象

什么情况会抛出OOM?OOM之前会发生什么

满足以下两个条件中的任意一个会产生OOM

  • JVM的98%时间都用于内存回收
  • 每次回收的内存小于2%

OOM之前的现象:

  • 每次垃圾回收的时间越来越长,且full gc的次数越来越多
  • 老年代的内存越来越大,每次full gc后,只有少量的内存被释放掉

线上死锁排查?

  • [jps -l]查找到可能有问题的进程id
  • 执行[jstack -F 进程id]命令
  • 如果说可以远程连接到JVM,可以使用jconsole或者jvisualvm,以图形化界面检测是否死锁

jstack命令:

-l:打印关于锁的信息

-F:当-l没有响应的时候,强制打印栈信息

-m:答应jaba和native c/c++框架所有栈信息

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:26:14  更:2022-05-09 12:28:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:19:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码