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知识库 -> JVM调优五大技能 -> 正文阅读

[Java知识库]JVM调优五大技能

1.什么时候需要JVM调优

  • 应用的响应慢、CPU占用高
  • 应用吞吐量小,占用内存空间过大

这些表象一般伴随着频繁的垃圾回收,或者OOM。

2.JVM调优一般调什么

  • 应用占用的内存(堆内存,元空间内存)
  • 新生代老年代的大小,比例。
  • 垃圾回收器的选择。

堆内存参数

| -Xms512m | 初始堆大小

默认值:若未设置,初始值将是老年代和年轻代分配制内存之和
-Xmx1024m

年轻代内存相关参数

| -Xmn512m | 新生代的初始值及最大值。

默认值:堆内存的1/4(已经分配的堆内存的1/4)。
-XX:NewSize=512m
-XX:MaxNewSize=512m
-XX:NewRatio=8

比如:-XX:NewRatio=8
表示:老年代内存:年轻代内存=8:1 |
| -XX:SurvivorRatio=8 | 新生代和存活区的比例
-XX:SurvivorRatio=8
表示存活区:新生代=1:8 =》新生代占年轻代的8/10,每个存活区各占年轻代的1/10 |

元空间参数

| -XX:MetaspaceSize | 初始元空间大小

达到该值就会触发垃圾收集进行类型卸载
-XX:MaxMetaspaceSize=256m

3.JVM调优基本步骤

首先在启动程序的时候

3.1添加GC日志相关的参数

-XX:+PrintGC:输出GC日志
-XX:+PrintGCDetails:输出GC的详细日志
-XX:+PrintGCTimeStamps:输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps:输出GC的时间戳(以日期的形式,如2018-08-29T19:22:48.741-0800)
-XX:+PrintHeapAtGC:在进行GC的前后打印出堆的信息
-Xloggc:gc.log:日志文件的输出路径

3.2添加内存溢出与Full gc前快照输出参数

-XX:+HeapDumpOnOutOfMemoryError 发生内存溢出时生成heapdump文件
-XX:+HeapDumpBeforeFullGC 发生Full gc前生成heapdump文件
-XX:HeapDumpPath:指定heapdump输出路径

3.3通过日志确定问题

3.3.1堆内存不足

  • 排查是否是设置的堆内存过小,还是内存溢出情况。
  • 拿到当时的内存快照,用工具分析 jump用Mat工具分析。

3.3.2频繁Full gc

  • 考虑是否是新上线的代码问题,有大对象占用,导致了频繁YGC,进而导致了晋升至年老代的对象增多,老年代达到内存阈值触发 Full gc ;
  • 考虑是否是新生代设置太小 ;

总结:
若是代码问题可通过版本控制工具找到本期变更的代码,优化代码
若非代码问题,可适当增加堆内存大小、新生代老年代的大小与比例 , 适当增大新生代内存大小。

4.监控工具

4.1使用jstat 统计gc相关信息

jstat 是 jdk bin 下自带工具,最多的是用来统计gc相关信息,使用步骤如下。

  • 获取进程号 ps -ef|grep 对应进程
  • 例如我想统计jvm-demo.jar(进程号27164)的gc信息,并且每隔3秒统计一次,可以执行以下命令
jstat -gcutil 27164 3000

在这里插入图片描述

主要关注以下几个。

  • s0、s1:表示两个survior区域的使用百分比
  • e:eden区域使用百分比
  • o:老年代使用百分比
  • m:metaspace(元数据空间)使用百分比
  • ygc:新生代gc次数
  • ygct:新生代gc累计总时间
  • fgc:full gc次数
  • fgct:full gc累计总时间
  • gct:gc累计总时间

若要进一步查看上一次GC信息

jstat -gccause 27146 3000

在这里插入图片描述

  • LGCC:上一次gc的原因,Allocation Failure是新生代满了,进行gc
  • gcc:当前gc的原因,如果当前没有gc就no gc

4.2使用jmap命令查某时刻的JVM堆信息

使用步骤

  • 获取进行 pid ps -ef|grep 对应进程
  • 例如我想统计jvm-demo.jar(进程号27164)的信息,并且每隔3秒统计一次,可以执行以下命令
jmap -heap 2865

输出内容示例:

Attaching to process ID 27146, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01

using thread-local object allocation.
Mark Sweep Compact GC

#堆相关的配置信息
Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 104857600 (100.0MB)
   NewSize                  = 10485760 (10.0MB)
   MaxNewSize               = 34930688 (33.3125MB)
   OldSize                  = 20971520 (20.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

#堆占用相关的配置信息
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 12517376 (11.9375MB)
   used     = 10708296 (10.212226867675781MB)
   free     = 1809080 (1.7252731323242188MB)
   85.54745020042539% used
Eden Space:
   capacity = 11141120 (10.625MB)
   used     = 10708272 (10.212203979492188MB)
   free     = 432848 (0.4127960205078125MB)
   96.11486098345588% used
From Space:
   capacity = 1376256 (1.3125MB)
   used     = 24 (2.288818359375E-5MB)
   free     = 1376232 (1.3124771118164062MB)
   0.0017438616071428572% used
To Space:
   capacity = 1376256 (1.3125MB)
   used     = 0 (0.0MB)
   free     = 1376256 (1.3125MB)
   0.0% used
tenured generation:
   capacity = 27684864 (26.40234375MB)
   used     = 27096504 (25.84123992919922MB)
   free     = 588360 (0.5611038208007812MB)
   97.87479541167332% used

15431 interned Strings occupying 2044328 bytes.

5.常用的调优工具有哪些?

JDK内置的命令行:jps(查看jvm进程信息)、jstat(监视jvm运行状态的,比如gc情况、jvm内存情况、类加载情况等)、jinfo(查看jvm参数的,也可动态调整)、jmap(生成dump文件的,在dump的时候会影响线上服务)、jhat(分析dump的,但是一般都将dump导出放到mat上分析)、jstack(查看线程的)。

JDK内置的可视化界面:JConsole、VisualVM,这两个在QA环境压测的时候很有用。

阿里巴巴开源的arthas:神器,线上调优很方便,安装和显示效果都很友好

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:12:16  更:2021-11-22 12:13:22 
 
开发: 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 2:57:42-

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