文章目录

  • JVM参数调优
    • 一、调优基本概念
    • 二、常用JVM参数
    • 三、GC调优思路

JVM参数调优

一、调优基本概念

在调整性能时,JM有三个组件

  1. 堆大小调整
  2. 垃圾收集器调整
  3. JIT编译器调整

大多数调优选项都与调整堆大小和选择的垃圾收集器有关。

同样,JIT编译器对性能也有很大影响,但是这个对程序员自身要求非常高。

通常,在调优Java应用程序时,重点是以下两个主要目标之一:

  • 响应性:应用程序或系统对请求的数据进行响应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在短时间内做出回应。
  • 吞吐量:侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停时间是可接受的。

一般而言,系统瓶颈核心还是在应用代码,一般情况下无需过多调优,而且JVM本身在不断优化的过程。

二、常用JVM参数

文章围绕Java8,下面的一些参数,在JDK9之后就被淘汰了,加红进行了凸显。

参数 说明
-XX:+AlwaysPreTouch JVM启动时分配内存,非使用时再分配
-XX:ErrorFile= filename 崩溃日志
-XX:+TraceClassLoading 跟踪类加载信息
-XX:+PrintClassHistogram 按下Ctr+ Break后,打印类的信息
-Xmx -Xms 最大堆和最小堆
-xx:permSize, -xx:metaspaceSize 永久代/元数据空间
-XX:+HeapDumpOnOutOfMemoryError 0OM时导出堆到文件
-XX:+HeapDumpPath OOM时堆导出的路径
-XX:+OnOutOfMemoryError JVM启动时分配内存,非使用时再分配在OOM时,执行一个脚本
java-XX:+PrintFlagsFinal -version  打印所有的-XX参数和默认值

通用GC参数

参数 说明
-XX:ParallelGCThread 并行GC线程数量
-XX:ConcGCThreads 并发GC线程数量
-XX:MaxGCPauseMillis 最大停顿时间,单位毫秒。GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio 0-100的取值范围,表示垃圾收集时间占总时间的比,默认99,即最大允许1%时间进行GC
-XX. SurvivorRatio 设置Eden区大小和 Survivor区大小的比例, 8表示两个 Survivor:Eden=2:8,即一个 Survivor占年轻代的1/10
-XX:NewRatio 新生代和老年代的比,4表示新生代老年代=1:4,即年轻代占堆的1/5
-verbose:gc, -XX;+printGC 打印GC的简要信息
-XX:+PrintGCDetails 打印GC详细信息
-XX:+PrintGCTimeStamps 打印CG发生的时间戳
-Xloggc:log/gc.log 指定 GC log的位置,以文件输出
-XX:ParallelGCThread 每次一次GC后,都打印堆信息

三、GC调优思路

首先准备环境

创建一个springboot的空项目,在启动类部分添加一下代码,打包,放在阿里云服务器上运行。

测试环境:JVM配置为1核2G,JAVA8,固定设置堆大小 1G

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);// 每333毫秒创建150线程,每个线程创建一个512kb的对象,最多一秒同时存在450线程,占用内存225m,查看6C的情况Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {new Thread(() -> {for (int i = 0; i < 150; i++) {try {//  不干活,专门创建512kb的小对象byte[] temp = new byte[1024 * 512];Thread.sleep(new Random().nextInt(100)); // 随机睡眠200毫秒秒以内} catch (InterruptedException e) {e.printStackTrace();}}}).start();}, 1000, 333, TimeUnit.MILLISECONDS);}
}

在运行之前要记得指定一下堆的大小

java -Xmx1024m -jar xxx.jar

启动是正常的

上面已经能看到端口号了,但是我们这里用jcmd象征的看一下

我们看一下堆的使用情况

里面的数据都是动态的。

我们看一下调优的思路

  1. 分析场景。例如:启动速度慢;偶尔出现响应慢于平均水平或者出现卡顿
  2. 确定目标。内存占用、低延时、吞吐量
  3. 收集日志。通过参数配置收集GC日志;通过JDK工具查看GC状态(例如jstat 实时查看)
  4. 分析日志。使用工具辅助分析日志,查看GC次数,GC时间(事后分析)
  5. 调整参数。切换垃圾收集器或者调整垃圾收集器参数

前两点的话,要和具体场景结合起来。文章主要展示整个过程该怎么走(相当于工具说明书),具体问题要具体分析。

java -Xmx1024m -Xloggc:/opt/gc.log -jar xxx.jar

我们这里添加了日志的收集

我们去对应目录找一下日志,里面的参数我们都介绍过,这个不难看懂。

但是文件内容是非常非常多的,这样一点点的看可能有点困难,我们一边把文件下载下来,用GCViewer这个开源的工具来做这件事情。

GCViewer工具,辅助分析GC日志文件 https://github.com/chewiebug/GCViewer

打开下载到本地的gc.log文件

再看右下角的信息,主要是一些汇总信息。各种数据的分析,比如平均,最大,最小等。



至于首页的图形,怎么看,可以直接参考文档:https://github.com/chewiebug/GCViewer

红线意思是什么等等 都写的很详细。


下面看一下jstat 动态监控GC统计信息,采用的格式是间隔1000毫秒统计一次,每10行数据后输出列标题

jstat -gc -h10 $(jcmd | grep "demo-0.0.1-SNAPSHOT.jar" | awk '{print $1}') 1000

里面的参数,我们说过了,参考上一篇文章【JVM实战】基于JDK命令行工具的监控

下面看一下切换垃圾收集器或者调整垃圾收集器参数相关信息:

垃圾收集器 Parallel参数调优

这是JDK默认的收集器–吞吐量优先

参数 说明
-XX:+UseParallelGC 新生代使用并行回收收集器
-XX:+Use ParalleloldGC 老年代使用并行回收收集器
-XX:ParallelGCThreads 设置用于垃圾回收的线程数
-XX:+UseAdaptiveSizePolicy 打开自适应GC策略

自适应GC策略是指自动调整分代分区的大小。UseAdaptiveSizePolicy自适应默认开启。

垃圾收集器CMS参数调优

关于CMS

  • 响应时间优先2
  • Parallel gc无法满足应用程序延迟要求时再考虑使用CMS垃圾收集器。
  • 新版建议用G1垃圾收集器


垃圾收集器G1参数调优

关于G1:

  • 兼顾吞吐量和响应时间
  • 超过50%的Java堆被实时数据占用。
  • 建议大堆(大小约为6GB或更大)
  • 且GC延迟要求有限的应用(稳定且可预测的暂停时间低于0.5秒)。

运行时JIT编译器优化参数

JIT编译指的是字节码编译为本地代码(汇编)执行,只有热点代码才会编译为本地代码。解释器执行节约内存,反之可以使用编译执行来提升效率


最后由于版本不断更新,JVM参数和具体说明,建议需要时参考 oracle官网的手册。

说实话,如果没有一个具体的线上场景,很难去演示调优的过程,这里能做到的就是,给出调优的思路、相关工具的使用,以及调优用到的参数信息。

参数的调整多少都会对JVM的运行有影响,比如 Parallel参数调优中-XX:ParallelGCThreads设置线程的数量,这个在不同配置的服务器上测试得到的结果会有差别,你可以在自己服务器上试试看。

【JVM实战】JVM参数调优相关推荐

  1. Jvm 系列(六):Java 服务 GC 参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  2. JVM参数调优,无停滞实践

    参考:http://www.cjsdn.net/post/print?bid=62&id=198084 JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Full GC,导致整个系统变 ...

  3. JVM之堆Heap参数调优入门

    JVM之堆Heap参数调优入门 目录: JVM体系结构概览 JVM之堆Heap参数调优入门 2.1 java7和 java8堆结构图 2.2 堆内存调优简介 1. JVM体系结构概览 2. JVM之堆 ...

  4. jvm详解、GC、堆内存参数调优

    一些常见面试题: JVM的位置(运行在操作系统上,与硬件没有直接的交互) 一.jvm体系结构(记住背下来) 运行时数据区:有亮色的有灰色的,灰色的就是占得内存非常小,几乎不存在GC垃圾回收,并且线程独 ...

  5. JVM参数调优详细过程

    本文来说下讲一下JVM参数调优详细过程 文章目录 概述 概述

  6. Java面试之JVM参数调优

    JVM参数调优 前言 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 使用jps和jinfo进行查看 -Xms:初始堆空间 -Xmx:堆最大值 -Xss:栈空间 -Xms 和 -Xm ...

  7. 22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

    这篇文章不少地方都截图了宋红康老师的课件,实在他jvm这块讲的真好.连接地址如下: 尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili JVM入门 1.JVM结构图 JVM是 ...

  8. Java JVM参数调优配置

    JVM参数调优配置 Java虚拟机原理 Java内存结构 堆.栈.方法区概念区别 Java堆 Java栈 Java方法区 虚拟机参数配置 什么是虚拟机参数配置 堆的参数配置 设置最大堆内存 设置新生代 ...

  9. JVM参数调优利器 —— XXFox

    好东西就是要拿出来与大家分享,本篇介绍一款可视化.能根据不同环境提供优化建议的JVM参数调优工具. 一只懂JVM参数的狐狸,来自于PerfMa.旨在帮助大家更好地了解JVM参数,使用JVM参数,并对现 ...

  10. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

最新文章

  1. python爬取动态网站
  2. MyBatis 批量更新,批量更新
  3. 爆笑:可怜的话剧演员
  4. java泰拉轴距_Java面向对象
  5. Delphi IOS (二)
  6. 浙江从小学生就上计算机课,废旧计算机在小学信息技术课中的再利用.doc
  7. SCPPO(九):性能优化之停工装置按照开工装置更新价格
  8. 信标链 分片链 是什么?
  9. 最优传输论文(十七):Sinkhorn Distances: Lightspeed Computation of Optimal Transport论文原理
  10. Java调用微信支付代码
  11. Unity3D_最简单的开始界面_结束界面
  12. 关于单选框以及复选框的css美化方法
  13. 团队管理的四大挑战——用人篇
  14. 慎独,是自律的最高层次
  15. java 电子围栏_怎么画电子围栏,并进行电子围栏进出判断?
  16. Android进阶之路 - 版本升级、更新
  17. GreenPlum 外部表external table 实战
  18. 中国大学mooc 慕课 管理信息系统(同济大学)第六章 第七章 习题 测试答案
  19. gta5r星服务器无限载入,GTA5及R星平台加载不出来问题解决办法
  20. c++自动比较数字大小函数

热门文章

  1. qq的 html页面布局,wep.qq webqq网页版QQ怎么登陆
  2. Drill模块——孔加工与螺纹铣削
  3. 2021年危险化学品经营单位安全管理人员考试及危险化学品经营单位安全管理人员作业考试题库
  4. Windows XP SP3安装后瘦身法
  5. 司空见惯 - 体彩中奖交多少税
  6. 林老师话说天南地北  我的学生在美国西雅图微软总部
  7. iOS开发 语音合成支持后台和锁屏情况
  8. 2008年IT日历 02
  9. WIN7 Activation,完美激活Windows 7,开机无字符,无OEM信息
  10. 阿里云网站备案时短信核验遇到问题解决办法