当前位置: 首页 > article >正文

JVM调优(内存、GC、JVM参数)

内存调优

常用监控工具
Top命令

top命令是linux下用来查看系统信息的一个命令,它提供给我们去实时地去查看系统的资源,比如执行时的进程、线程和系统参数等信息。进程使用的内存为RES(常驻内存)- SHR(共享内存)

VisualVM

VisualVM是多功能合一的Java故障排除工具并且他是一款可视化工具,整合了命令行 JDK 工具和轻量级分析功能。

内存快照

当堆内存溢出时,需要在堆内存溢出时将整个堆内存保存下来,生成内存快照(Heap Profile )文件。

使用MAT打开hprof文件,并选择内存泄漏检测功能,MAT会自行根据内存快照中保存的数据分析内存泄漏的根源。

生成内存快照的Java虚拟机参数:

-XX:+HeapDumpOnOutOfMemoryError:发生OutOfMemoryError错误时,自动生成hprof内存快照文件。

-XX:HeapDumpPath=<path>:指定hprof文件的输出路径。

使用MAT打开hprof文件,并选择内存泄漏检测功能,MAT会自行根据内存快照中保存的数据分析内存泄漏的根源。

导出运行中系统的内存快照,比较简单的方式有两种,注意只需要导出标记为存活的对象:

通过JDK自带的jmap命令导出,格式为:

jmap -dump:live,format=b,file=文件路径和文件名 进程ID

通过arthas的heapdump命令导出,格式为:

heapdump --live 文件路径和文件名

GC调优

jstat工具

Jstat工具是JDK自带的一款监控工具,可以提供各种垃圾回收、类加载、编译信息

等不同的数据。使用方法为:jstat -gc 进程ID 每次统计的间隔(毫秒) 统计次数

C代表Capacity容量,U代表Used使用量

S – 幸存者区,E – 伊甸园区,O – 老年代,M – 元空间

YGC、YGT:年轻代GC次数和GC耗时(单位:秒)

FGC、FGCT:Full GC次数和Full GC耗时

GCT:GC总耗时

GC日志

通过GC日志,可以更好的看到垃圾回收细节上的数据,同时也可以根据每款垃圾回收器的不同特点更好地发现存在的问题。

使用方法(JDK 8及以下):-XX:+PrintGCDetails -Xloggc:文件名

使用方法(JDK 9+):-Xlog:gc*:file=文件名

分析GC日志
GCViewer

GCViewer是一个将GC日志转换成可视化图表的小工具,github地址: https://github.com/chewiebug/GCViewer 使用方法:java -jar gcviewer_1.3.4.jar 日志文件.log

GCEasy

GCeasy是业界首款使用AI机器学习技术在线进行GC分析和诊断的工具。定位内存泄漏、GC延迟高的问题,提供JVM参数优化建议,支持在线的可视化工具图表展示。 官方网站:https://gceasy.io/

优化基础JVM参数

-Xms1g  设置的是最大堆内存

-Xmx1g  设置初始堆大小,建议将-Xms设置的和-Xmx一样大

-Xss256k  虚拟机栈大小,合理值为256k – 1m之间。

-XX:MaxMetaspaceSize=512m 最大元空间大小,默认值比较大,如果出现元空间内存泄漏会让操作系统可用内存不可控,建议根据测试情况设置最大值,一般设置为256m

-XX:MetaspaceSize   参数指的是到达这个值之后会触发FULLGC,后续什么时候再触发JVM会自行计算。如果设置为和MaxMetaspaceSize一样大,就不会FULLGC,但是对象也无法回收。(一般不手动设置)

-XX:+DisableExplicitGC  禁止在代码中使用System.gc()

-XX:+HeapDumpOnOutOfMemoryError 发生OutOfMemoryError错误时,自动生成hprof内存快照文件。

-XX:HeapDumpPath=/opt/logs/my-service.hprof 指定hprof文件的输出路径。

打印GC日志

JDK8及之前 : -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:文件路径

JDK9及之后 : -Xlog:gc*:file=文件路径


http://www.kler.cn/a/460701.html

相关文章:

  • TVS二极管选型【EMC】
  • Git的使用流程(详细教程)
  • Javascript数据结构——图Graph
  • leetcode 149. 直线上最多的点数
  • 【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
  • Python 将文字和二维码 生成到BMP上 可以做标签打印等
  • 《庐山派从熟悉到...》Sensor 模块(摄像头)基础设置
  • html+css+js网页设计 美食 美食杰8个页面
  • AviatorScript
  • 数据结构-排序思想
  • 1月第一讲:WxPython跨平台开发框架之前后端结合实现附件信息的上传及管理
  • 【MyBatis】MyBatis项目的创建、配置和启动
  • 异步请求在TypeScript网络爬虫中的应用
  • docker Oracle设置rman自动备份步骤
  • Linux jupyter notebook Matplotlib 无法显示汉字
  • 企业储能电站 储能配电柜监测管理系统
  • 基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)
  • 深度解析PXE技术与实践应用
  • 【复刻】数字化转型是否赋能企业新质生产力发展?(2015-2023年)
  • 发文章用哪个平台比较好?哪些问题会影响到媒体出稿的速度?
  • 确保大语言模型(LLM)安全:保护数据隐私与防止滥用
  • NVR录像机汇聚管理EasyNVR可设置预置位与实际预置位不符应该如何处理?
  • 【Spring MVC 常用注解】注解驱动开发的魔法
  • 使用Python爬取BOSS直聘职位数据并保存到Excel
  • 记录开发工具
  • MySQL第二弹----CRUD