【JVM实战】JVM参数调优
文章目录
- JVM参数调优
- 一、调优基本概念
- 二、常用JVM参数
- 三、GC调优思路
JVM参数调优
一、调优基本概念
在调整性能时,JM有三个组件
- 堆大小调整
- 垃圾收集器调整
- 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象征的看一下
我们看一下堆的使用情况
里面的数据都是动态的。
我们看一下调优的思路
- 分析场景。例如:启动速度慢;偶尔出现响应慢于平均水平或者出现卡顿
- 确定目标。内存占用、低延时、吞吐量
- 收集日志。通过参数配置收集GC日志;通过JDK工具查看GC状态(例如jstat 实时查看)
- 分析日志。使用工具辅助分析日志,查看GC次数,GC时间(事后分析)
- 调整参数。切换垃圾收集器或者调整垃圾收集器参数
前两点的话,要和具体场景结合起来。文章主要展示整个过程该怎么走(相当于工具说明书),具体问题要具体分析。
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参数调优相关推荐
- Jvm 系列(六):Java 服务 GC 参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- JVM参数调优,无停滞实践
参考:http://www.cjsdn.net/post/print?bid=62&id=198084 JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Full GC,导致整个系统变 ...
- JVM之堆Heap参数调优入门
JVM之堆Heap参数调优入门 目录: JVM体系结构概览 JVM之堆Heap参数调优入门 2.1 java7和 java8堆结构图 2.2 堆内存调优简介 1. JVM体系结构概览 2. JVM之堆 ...
- jvm详解、GC、堆内存参数调优
一些常见面试题: JVM的位置(运行在操作系统上,与硬件没有直接的交互) 一.jvm体系结构(记住背下来) 运行时数据区:有亮色的有灰色的,灰色的就是占得内存非常小,几乎不存在GC垃圾回收,并且线程独 ...
- JVM参数调优详细过程
本文来说下讲一下JVM参数调优详细过程 文章目录 概述 概述
- Java面试之JVM参数调优
JVM参数调优 前言 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 使用jps和jinfo进行查看 -Xms:初始堆空间 -Xmx:堆最大值 -Xss:栈空间 -Xms 和 -Xm ...
- 22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制
这篇文章不少地方都截图了宋红康老师的课件,实在他jvm这块讲的真好.连接地址如下: 尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili JVM入门 1.JVM结构图 JVM是 ...
- Java JVM参数调优配置
JVM参数调优配置 Java虚拟机原理 Java内存结构 堆.栈.方法区概念区别 Java堆 Java栈 Java方法区 虚拟机参数配置 什么是虚拟机参数配置 堆的参数配置 设置最大堆内存 设置新生代 ...
- JVM参数调优利器 —— XXFox
好东西就是要拿出来与大家分享,本篇介绍一款可视化.能根据不同环境提供优化建议的JVM参数调优工具. 一只懂JVM参数的狐狸,来自于PerfMa.旨在帮助大家更好地了解JVM参数,使用JVM参数,并对现 ...
- Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出
JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...
最新文章
- python爬取动态网站
- MyBatis 批量更新,批量更新
- 爆笑:可怜的话剧演员
- java泰拉轴距_Java面向对象
- Delphi IOS (二)
- 浙江从小学生就上计算机课,废旧计算机在小学信息技术课中的再利用.doc
- SCPPO(九):性能优化之停工装置按照开工装置更新价格
- 信标链 分片链 是什么?
- 最优传输论文(十七):Sinkhorn Distances: Lightspeed Computation of Optimal Transport论文原理
- Java调用微信支付代码
- Unity3D_最简单的开始界面_结束界面
- 关于单选框以及复选框的css美化方法
- 团队管理的四大挑战——用人篇
- 慎独,是自律的最高层次
- java 电子围栏_怎么画电子围栏,并进行电子围栏进出判断?
- Android进阶之路 - 版本升级、更新
- GreenPlum 外部表external table 实战
- 中国大学mooc 慕课 管理信息系统(同济大学)第六章 第七章 习题 测试答案
- gta5r星服务器无限载入,GTA5及R星平台加载不出来问题解决办法
- c++自动比较数字大小函数